La réponse originale à cette question par Adam Batkin vous mènera à une solution, mais si vous redéployer votre webapp (sans redémarrage de votre conteneur web), vous devez exécuter dans 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 parce que le chargeur de classe qui, à l'origine chargé de votre DLL toujours les références de cette DLL. Cependant, votre webapp est maintenant en cours d'exécution avec un nouveau chargeur de classe, et parce que la même JVM est en cours d'exécution et une JVM ne permet pas de 2 références à la même DLL, vous ne pouvez pas recharger . Ainsi, votre application ne peut pas accéder à la DLL existante et ne peut pas ouvrir un nouveau. Donc.... vous êtes coincé.
Tomcat, chargeur de classe de la documentation explique pourquoi votre reloaded webapp s'exécute dans un nouveau isolé du chargeur de classe et comment vous pouvez contourner cette limitation (à un niveau très élevé).
La solution est d'étendre Adam Batkin la solution un peu:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
Placer un récipient contenant de JUSTE dans cette classe compilée dans le TOMCAT_HOME/lib dossier.
Maintenant, au sein de votre application web, vous avez juste à force de Tomcat pour faire référence à cette classe, ce qui peut être fait simplement comme ceci:
Class.forName("awesome.Foo");
Maintenant, votre fichier DLL doit être chargé dans la commune de chargeur de classe, et peut être référencé à partir de votre webapp, même après avoir été redéployés.
Un sens?
Un travail exemplaire de référence peut être trouvé sur google code, statique-dll-programme d'amorçage .