.dll déjà chargé dans un autre chargeur de classe?
J'ai une application web s'exécutant sous Tomcat 3.2.1 qui doit faire JNI appels en
afin d'accéder à des données et des méthodes de l'héritage de code C++. Une servlet est chargée
sur
démarrage de la webapp qui, dans le cadre de son init
méthode, les causes d'un ensemble de données
spécifiques à cette webapp instance pour être chargé dans le C++ de données
les structures.
Ce code Java pour cette servlet contient les éléments suivants:
static
{
try {
System.loadLibrary("JCoreImpl");
System.out.println("JCoreImpl loaded");
m_bLibraryLoaded = true;
} catch (UnsatisfiedLinkError e) {
m_bLibraryLoaded = false;
System.out.println("JCoreImpl NOT loaded " + e);
}
}
Choses fonctionnent bien si il y a seulement une webapp (appelons-la
"webapps/aaa").
Si j'ai un deuxième webapp ("webapps/bbb") qui est identique à webapps/aaa
sauf pour le jeu de données utilisé dans le C++ structures de données, puis webapps/aaa
démarre très bien, mais quand webapps/bbb est commencé, j'obtiens une erreur
indiquant
que:
JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
J'ai besoin d'avoir une instance distincte de la bibliothèque native pour chacun de mes
webapps chaque fois qu'une instance doit contenir des données qui est unique à ce
particulier webapp. J'ai fouillé les archives d'e-mails et lire
e-mails par Craig McLanahan expliquant le chargeur de classe de la hiérarchie. Mais Je
ont
pas été en mesure de trouver quelque chose de spécifique pour le chargement d'une instance unique d'un
la bibliothèque native pour chaque webapp.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas charger la même bibliothèque native deux fois.
De mettre la classe dans un fichier jar en vertu de
<tomcat>/lib/
, il va être partagé sur toutes les guerres.Voir la section Je rencontre des chargeurs de classes de problèmes lors de l'utilisation de JNI sous Tomcat sur le Tomcat HowTo wiki (http://wiki.apache.org/tomcat/HowTo)
Copier la Dll dans les fichiers temporaires dans un répertoire temporaire avant de les charger. Supprimer les fichiers lorsque vous avez terminé. De cette façon vous pouvez vous assurer que la même DLL n'est pas chargé à deux reprises.
J'ai eu ce problème et je l'ai résolu:
Problème:
Le problème est dû à certaines configurations de votre serveur d'application qui sont la cause de créer plus d'un
war
ouear
fichiers et, par conséquent, il crée plus de un fichiers déployés. Ces fichiers déployés tenter d'avoir un accès simultané à votre bibliothèque native qui est chargé dans un bloc statique.Solution:
java
les processus dans le gestionnaire des tâchesjboss-eap-6.4.0\standalone\configuration
et ouvrirstandalone.xml
fichierstandalone.xml
, supprimer tous lesdeployments
tag (Ne vous inquiétez pas, lorsque vous redémarrez le serveur d'applications, il insère cette balisejboss-eap-6.4.0\standalone\deployments
et supprimer tous déployésfichiers et
war
fichiers. (Vous pouvez faire une sauvegarde de vos fichiers war)exploded