La réponse originale d'Adam Batkin vous mènera à une solution, mais si vous redéployez votre application Web (sans redémarrer votre conteneur Web), vous devriez rencontrer l'erreur suivante:
java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
Cela se produit car le ClassLoader qui a chargé à l'origine votre DLL fait toujours référence à cette DLL. Cependant, votre application Web est maintenant en cours d'exécution avec un nouveau ClassLoader, et comme la même JVM est en cours d'exécution et qu'une JVM n'autorisera pas 2 références à la même DLL, vous ne pouvez pas la recharger . Ainsi, votre application Web ne peut pas accéder à la DLL existante et ne peut pas en charger une nouvelle. Alors ... vous êtes coincé.
La documentation ClassLoader de Tomcat explique pourquoi votre application Web rechargée s'exécute dans un nouveau ClassLoader isolé et comment vous pouvez contourner cette limitation (à un niveau très élevé).
La solution est d'étendre un peu la solution d'Adam Batkin:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
Ensuite, placez un fichier jar contenant JUSTE cette classe compilée dans le dossier TOMCAT_HOME / lib.
Maintenant, dans votre application web, il vous suffit de forcer Tomcat à référencer cette classe, ce qui peut être fait aussi simplement que ceci:
Class.forName("awesome.Foo");
Maintenant, votre DLL doit être chargée dans le chargeur de classe commun et peut être référencée à partir de votre application Web même après avoir été redéployée.
Ça a du sens?
Une copie de référence de travail peut être trouvée sur le code google, static-dll-bootstrapper .