2016-09-28 4 views
1

Cette question a peut-être été posée plus tôt sur SO, et soyez assuré que j'ai vérifié toutes les solutions disponibles. Était toujours incapable de le faire fonctionnerBibliothèque native dans Tomcat UnsatisfiedLinkError + Windows + eclipse

Mon problème est exactement comme décrit dans ce post Shared native library in Tomcat UnsatisfiedLinkError

autonome application Java fonctionne parfaitement bien. Cependant, avec Tomcat (9), il ne parvient pas à courir et jette

java.lang.UnsatisfiedLinkError: third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init()V 
    at third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init(Native Method) 
    at third_party.org.chokkan.crfsuite.crfsuiteJNI.<clinit>(crfsuiteJNI.java:87) 
    at third_party.org.chokkan.crfsuite.Tagger.<init>(Tagger.java:39) 

Je sais que ma DLL est chargée, j'ai vérifié que le dossier est mon dll en est dans la variable PATH. J'ai également vérifié les classes chargées et la DLL est en fait chargée.

Je constate 3 types de UnsatisfiedLinkError au SO

1) java.lang.UnsatisfiedLinkError: third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init() V 2) java.lang.UnsatisfiedLinkError: third_party.org.chokkan.crfsuite.crfsuiteJNI.swig_module_init() B 3) Où le chargeur de classe charge deux fois.

Je crois que le V, à la fin ne signifie quelque chose. Mais je ne suis pas capable de comprendre exactement quoi?

L'une des réponses acceptées dans le post SO que j'ai partagé ci-dessus prétend qu'il a quelque chose à voir avec la version. Je ne comprends pas comment cela est une solution acceptable, car il fonctionne parfaitement bien lorsqu'il est exécuté en tant qu'application java autonome.

Gâché beaucoup de temps déjà, toute aide est appréciable.

Merci Chahat

+0

'B' (octet) et' V' (Void) appartiennent à la signature de la méthode V' 'swing_module_init() (s) et seulement dire que le type de retour est 'Void' (ou' Byte' dans l'autre cas), s'il vous plaît voir: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/ types.html – nyyrikki

+0

merci nyyrikki pour la réponse, Pourriez-vous s'il vous plaît dites-moi comment résoudre ce problème?faire en sorte que les fonctions natives appellent le travail dans l'application web (tomcat) ?? Merci – user4772933

+0

Cela fonctionne-t-il pour vous lorsque vous n'êtes pas en cours d'exécution dans Tomcat (non seulement le chargement, mais l'appel de méthodes natives)? Si je comprends bien votre description ci-dessus, vous faites plutôt référence au problème lié sur stackoverflow. Il serait également utile si vous nous montrez le fichier d'en-tête généré avec javah. – nyyrikki

Répondre

0

Je face à la même question. Je trouve enfin la solution. Ça marche pour moi.

J'ai d'abord installé libLBFGS et crfsuite. Vous pouvez trouver l'instruction ici (http://www.chokkan.org/software/crfsuite/manual.html). La libcrfsuite.so sera installée dans/usr/local/lib

Deuxièmement, j'édite tomcat config afin de charger la bibliothèque native. Je crée setenv.sh dans le dossier bin tomcat, définir la variable CATALINA_OPTS avec le contenu:

exportation CATALINA_OPTS = "- Djava.library.path =/usr/local/bin:/usr/local/lib"

Enfin , J'ai utilisé ServletContextListener personnalisé et charger explicitement libcrfsuite.so par System.load(). Je vais ce lien pour télécharger lib (https://github.com/vinhkhuc/jcrfsuite/tree/master/src/main/resources/crfsuite-0.12)

0

J'ai eu un problème similaire, mais pas avec Tomcat. je fini de copier la logique d'une de leurs classes et en invoquant simplement:

static { 
    try { 
     CrfSuiteLoader.load(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
}