2017-05-02 2 views
0

J'ai un projet Java avec deux bibliothèques externes. Tout se passe bien dans Eclipse, il n'y a pas d'erreurs lors de l'exportation en tant que JAR exécutable. Cependant, lorsque je lance mon projet via la ligne de commande en utilisant java -jar myapplication.jar,, il lance le fameux java.lang.UnsatisfiedLinkError: no in java.library.path.Eclipse exporté Runnable Jar ne parvient pas à localiser les bibliothèques externes

J'ai essayé d'utiliser les trois options d'exportation (extraction, empaquetage, copie) sans succès.

(en utilisant Eclipse)

Répondre

1

Pour System.loadLibrary() au travail, la bibliothèque (sous Windows, une DLL) doit être dans un répertoire quelque part sur votre PATH ou sur un chemin indiqué dans la java. propriété système library.path (vous pouvez donc lancer Java comme java -Djava.library.path =/chemin/vers/dir).

En outre, pour loadLibrary(), vous spécifiez le nom de base de la bibliothèque, sans le fichier .dll à la fin. Donc, pour /path/to/something.dll, vous utiliserez simplement System.loadLibrary ("quelque chose").

Vous devez également vérifier l'erreur UnsatisfiedLinkError que vous obtenez. Si elle dit quelque chose comme:

Exception dans le thread « principal » java.lang.UnsatisfiedLinkError: pas foo dans java.library.path alors il ne peut pas trouver la bibliothèque foo (de foo.dll) dans votre PATH ou java .library.path. Si elle dit quelque chose comme:

Exception dans le thread « principal » java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo() V alors quelque chose ne va pas avec la bibliothèque elle-même dans le sens que Java n'est pas capable de mapper une fonction Java native dans votre application à son équivalent natif réel. Pour commencer, je voudrais mettre un peu de journalisation autour de votre appel System.loadLibrary() pour voir si cela s'exécute correctement. S'il lance une exception ou n'est pas dans un chemin de code qui est réellement exécuté, alors vous obtiendrez toujours le dernier type de UnsatisfiedLinkError expliqué ci-dessus.

En sidenote, la plupart des gens mettent leur loadLibrary() appelle dans un bloc d'initialisation statique dans la classe avec les méthodes natives, pour vous assurer qu'il est toujours exécuté une seule fois:

+0

Eh oui. J'ai oublié de mentionner. Les bibliothèques que j'utilise sont OpenCV + ntcore. Les deux 'ntcore.dylib' et' opencv_java320.dylib' sont situés dans le fichier jar généré. Mais pour une raison quelconque, le pot ne semble pas trouver ma bibliothèque OpenCV. – mccoyLBI