2017-05-02 8 views
0

Ich habe ein Java-Projekt mit zwei externen Bibliotheken. Alles läuft gut in Eclipse, es gibt keine Fehler beim Export als ausführbare JAR. Jedoch, wenn ich mein Projekt über die Befehlszeile mit java -jar myapplication.jar, ausführen, wirft es die jemals berüchtigten java.lang.UnsatisfiedLinkError: no in java.library.path.Eclipse exportiert Runnable Jar kann externe Bibliotheken nicht finden

Ich habe versucht, alle drei Exportoptionen (Auszug, Paket, Kopie) ohne Erfolg zu verwenden.

(mit Eclipse)

Antwort

1

Damit System.loadLibrary() zu arbeiten, die Bibliothek (unter Windows, einer DLL) muss irgendwo in einem Verzeichnis auf Ihrem Weg oder auf einem Pfad in der Java aufgeführt. library.path system property (damit Sie Java wie java -Djava.library.path =/path/to/dir) starten können.

Darüber hinaus geben Sie für loadLibrary() den Basisnamen der Bibliothek an, ohne die .dll am Ende. Also, für /path/to/something.dll, würden Sie einfach System.loadLibrary ("etwas") verwenden.

Sie müssen auch den genauen UnbefriedigtenLinkError betrachten, den Sie erhalten. Wenn es etwas sagt wie:

Exception in thread "main" java.lang.UnsatisfiedLinkError: keine foo in java.library.path dann kann es nicht die foo-Bibliothek (foo.dll) in Ihrer PATH oder Java finden .library.path. Wenn es etwas wie sagt:

Ausnahme im Thread "Haupt" java.lang.UnsatisfiedLinkError: com.beispiel.program.ClassName.foo() V dann ist etwas falsch mit der Bibliothek selbst in dem Sinne, dass Java nicht ist In der Lage, eine native Java-Funktion in Ihrer Anwendung dem tatsächlichen nativen Gegenstück zuzuordnen.

Um zu starten, würde ich einige Protokollierung um Ihren Aufruf System.loadLibrary(), um zu sehen, ob das ordnungsgemäß ausgeführt wird. Wenn es eine Ausnahme auslöst oder sich nicht in einem Codepfad befindet, der tatsächlich ausgeführt wird, wird immer der zuletzt beschriebene Typ UnatisfiedLinkError angezeigt.

Als Nebenbemerkung, setzen die meisten Menschen ihre Loadlibrary() ruft in einen statischen Initialisierer Block in der Klasse mit den nativen Methoden, um sicherzustellen, dass sie immer genau einmal ausgeführt wird:

+0

Ahh ja. Ich vergaß zu erwähnen. Die Bibliotheken, die ich verwende, sind OpenCV + ntcore. Sowohl 'ntcore.dylib' als auch' opencv_java320.dylib' befinden sich im generierten jar. Aber aus irgendeinem Grund scheint das Glas meine OpenCV-Bibliothek nicht zu finden. – mccoyLBI

Verwandte Themen