Hinzufügen einer nativen Bibliothek zu "java.library.path" beim Start von Eclipse (anstatt sie zu überschreiben)

89

Ich habe eine native Bibliothek, die zu java.library.path hinzugefügt werden muss . Mit dem JVM-Argument -Djava.library.path = path ... kann ich den Pfad wie gewünscht festlegen.

Mein Problem ist, dass meine andere Bibliothek (Pentaho-Berichterstellung) Schriftarten basierend auf dem Standardpfad java.library.path (einschließlich Systemverzeichnisse usw.) durchsucht und die manuelle Einstellung den Standardpfad überschreibt.

Also: Wie kann ich hinzufügen , einen Pfad Eintrag auf den Standard java.library.path anstatt sie zu überschreiben (die mit -Djava.library.path gemacht zu sein scheint)? (Ich möchte den Standardpfad nicht manuell hinzufügen, was für die Bereitstellung nicht hilfreich wäre.)

EDIT: Entschuldigung für fehlende Details; Ich arbeite mit Eclipse. (Die Bereitstellung erfolgt mit JNLP und dort kann ich nativelib unter Ressourcen verwenden. )

Touko
quelle
1
Bitte sehen Sie stattdessen die akzeptierte Antwort auf diese Frage - für mich ist es viel besser: stackoverflow.com/questions/957700/…
laher
Die Frage "Wie füge ich eine native Bibliothek hinzu?" Ist verwirrend. Es geht wahrscheinlich darum, einen weiteren "Bibliothekspfad" hinzuzufügen (anzuhängen oder voranzustellen), dh unter der Annahme, dass Eclipse standardmäßig so etwas wie java.library.path = path1: path2: path3 anzeigt. Die Frage ist, wie Eclipse gestartet werden kann, das in java.library endet .path = my / lib / folder: path1: path2: path3
whaefelinger

Antworten:

46

Hatte dieses Problem vergessen ... Ich habe tatsächlich mit Eclipse gefragt, tut mir leid, dass ich das ursprünglich nicht angegeben habe. Und die Antwort scheint zu einfach zu sein (zumindest mit 3.5; wahrscheinlich auch mit älteren Versionen):

Argumente der Java-Ausführungskonfiguration: VM-Argumente:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

Die Anführungszeichen dürfen nicht vergessen werden, da sonst Probleme mit Leerzeichen in PATH auftreten.

Touko
quelle
7
Wenn zwei gemeinsam genutzte Bibliotheken vorhanden sind, die voneinander abhängig sind, funktioniert dies nicht. Der erste wird von der Java-Laufzeit gefunden, der zweite vom dynamischen Systemlader. Die einzige Lösung, die ich gefunden habe, ist das Setzen von LD_LIBRARY_PATH.
Kevin Cline
4
Die Antwort von @Touko passt nicht zu der ursprünglichen Frage, bei der es darum geht, einen nativen Bibliotheksordner anzuhängen oder voranzustellen. Zumindest unter Mac OS 10.8 haben weder $ PATH noch $ LD_LIBRARY_PATH noch $ {workspace_loc: project} \ lib etwas mit dem Standardwert zu tun. Auf meinem Mac lautet der Standardwert beispielsweise $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
Whaefelinger
Wenn Sie TestNG in Eclipse verwenden, müssen Sie die TestNG-Ausführungskonfiguration bearbeiten: - Wählen Sie im Fenster Ausführungskonfigurationen Ihre TestNG-Zielkonfiguration aus. - Wählen Sie die Registerkarte Umgebung. - Fügen Sie eine PATH-Variable hinzu und legen Sie ihren Wert auf Ihr Ziel fest. - Belassen Sie die Standardeinstellung "Umgebung an native Umgebung anhängen".
Philippe
Kann ich ein Beispiel bekommen?
K - Die Toxizität in SO nimmt zu.
@kevincline Würde es Ihnen etwas ausmachen, herauszufinden, warum genau es in diesem Fall nicht funktioniert? Ich bin gerade auf dieses Problem gestoßen und versuche zu verstehen, was mit dieser Lösung nicht stimmt.
Anula
14

Wenn Sie eine native Bibliothek hinzufügen möchten, ohne die java.library.pathEntwicklungszeit in Eclipse zu beeinträchtigen (um zu vermeiden, dass absolute Pfade eingeschlossen werden und Parameter zu Ihrer Startkonfiguration hinzugefügt werden müssen), können Sie den Pfad zum Speicherort der nativen Bibliotheken für jedes Jar im Java Build angeben Pfad Dialog unter india Bibliothek Lage . Beachten Sie, dass der Name der nativen Bibliotheksdatei dem Namen der Jar-Datei entsprechen muss. Siehe auch diese detaillierte Beschreibung .

Fabian Steeg
quelle
3
-1. Sie gehen davon aus, dass der Endbenutzer die Anwendung von einer IDE aus ausführt, was unwahrscheinlich ist.
Finnw
@ Finnw Ich verstehe deinen Standpunkt. Ich fand die Frage nach einer Lösung zum Hinzufügen einer nativen Bibliothek in der IDE während der Entwicklung, ohne sie zu überschreiben, java.library.pathund kam zurück, nachdem ich die Lösung an anderer Stelle gefunden hatte. Ich werde meine Antwort bearbeiten, um das klarer zu machen.
Fabian Steeg
Eigentlich arbeite ich mit Eclipse, obwohl ich es bei der Frage nicht erwähnt habe.
Touko
Dies funktioniert in der aktuellen Version von Eclipse (Luna) nicht, da das Festlegen der Eigenschaft java.library.path überschreibt, wie der Benutzer es als Problem in der Frage beschreibt.
Alex N.
9

SWT fügt die erforderlichen nativen DLLs in eine JAR ein. Suchen Sie nach "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" für ein Beispiel.

Die DLLs müssen sich im Stammverzeichnis der JAR befinden, die JAR muss signiert sein und die DLL muss mit einer Prüfsumme in META-INF / MANIFEST.MF angezeigt werden, damit die VM sie abrufen kann.

Aaron Digulla
quelle
2
Wie kann ich das mit NetBeans machen?
Maciek Sawicki
AFAIK, NetBeans verwendet Ant, um das Projekt zu erstellen. Lesen Sie die Dokumentation zu Ant, wie Sie signierte JARs erstellen und Dinge wie DLLs in das Manifest einfügen.
Aaron Digulla
Wie stelle ich ein, dass die DLL in Eclipse hinzugefügt wird?
NoBugs
@ NoBugs: In Eclipse sollte dieser Beitrag helfen: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla
@AaronDigulla schlagen Sie vor, dass DLL immer auf diese Weise angehängt werden kann? Ich dachte, dass es nur so etwas sucht java.library.path. Schlagen Sie vor, dass es nur Wurzel von sucht jar?
4

In Windows wie folgt:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% ist Ihr alter -Djava.library.path

Andy Boot
quelle
Versuchte diese Idee, aber es ergab sich als java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko
Sie können auch $ {system_property: java.library.path}
Rob Elsner
2
Der Standardwert unter UNIX / Mac / GNU Linux ist LD_LIBRARY_PATH. PATH ist eine Windows-Sache.
Whaefelinger
2

Können Sie dies umgehen, indem Sie System.load () programmgesteuert aufrufen , um Ihre native Bibliothek zu laden? Mit dieser Methode können Sie (im Gegensatz zu System.loadLibrary () ) einen absoluten Pfad angeben.

Simon Nickerson
quelle
1
Bitte erläutern Sie, wie Sie System.load () beim Starten von Eclipse programmgesteuert aufrufen würden.
Whaefelinger
2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239 besagt, dass in Eclipse's Launcher keine Substitutionsmechanik implementiert ist, zumindest keine bis zur Veröffentlichung von Juno.

Daher ist es (fast) unmöglich, einen anderen Bibliotheksordner an java.library.path anzuhängen oder vorzuhängen, wenn Eclipse ohne vorherige Kenntnis der Standardeinstellung gestartet wird.

Ich habe fast geschrieben, weil es möglich sein sollte, Eclipse starten zu lassen, den Inhalt von java.library.path zu sichern und Eclipse in einem Befehl zu stoppen. Der Speicherauszug wird analysiert und dann als Eingabe für den Start von Eclipse verwendet, d. H.

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"
whaefelinger
quelle
1

In UNIX-Systemen können Sie an die Umgebungsvariable LD_LIBRARY_PATH anhängen. Unter Windows setzt die JVM die Systemeigenschaft java.library.path automatisch auf PATH. Wenn sich die DLL auf Ihrem Pfad befindet, sind Sie fertig.

geowa4
quelle
Der Thread-Starter war sehr spezifisch, wie ein zweiter nativer Bibliotheksordner "angehängt" werden soll, stimmst du nicht zu?
Whaefelinger
@ user667073 Ich habe das gleiche gesagt ... ANHANG ist die Frage, der Thread-Starter weiß bereits, wie man eine gemeinsame
Bibliothek
STS 3.4.0 und Mac OS 10.8: Die Einstellungen von LD_LIBRARY_PATH haben keine Auswirkungen auf java.library.path. Ich habe dies mit Subclipse / JavaHL getestet. Dieser hat funktioniert: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib beim Export LD_LIBRARY_PATH = / opt / local / lib; STS hatte war negativ.
Whaefelinger
1

Fenster-> Einstellungen-> Java-> Installierte JREs. Wählen Sie dann Ihre aktuelle JRE (JDK) und klicken Sie auf Bearbeiten. Füllen Sie die Standard-VM-Argumente aus: -Djava.library.path = / usr / local / xuggler / lib. Getan!

Vadym
quelle
1
Diese Antwort ist nutzlos, da der Thread-Starter speziell nach "Hinzufügen einer nativen Bibliothek [..] anstatt Überschreiben [..]" fragt. Diese Antwort überschreibt nur die Standardeinstellung.
Whaefelinger
1

Die von Rob Elsner in einem der obigen Kommentare angebotene Lösung funktioniert einwandfrei (OSX 10.9, Eclipse Kepler). Man muss ihre zusätzlichen Pfade an die durch ":" getrennten anhängen.

Sie können auch $ {system_property: java.library.path} - Rob Elsner 22. November 10 um 23:01 verwenden

Johan
quelle
0

Der Dateiname der nativen Bibliothek muss dem Jar-Dateinamen entsprechen. Das ist sehr sehr wichtig. Bitte stellen Sie sicher, dass der Name des JAR und der Name der DLL identisch sind. Siehe auch den Beitrag von Fabian Steeg. Mein Download für jawin enthielt verschiedene Namen für dll und jar. Es war jawin.jar und jawin d .dll, notiere 'd' im Namen der DLL-Datei. Ich habe es einfach in jawin.dll umbenannt und als native Bibliothek in Eclipse festgelegt, wie im Beitrag " http://www.eclipsezone.com/eclipse/forums/t49342.html " erwähnt.

Dhana
quelle
Die Frage betrifft das Hinzufügen einer nativen Bibliothek (eines Ordners) beim Starten von Eclipse.
Whaefelinger
0

Aus irgendeinem Grund konnte ich nicht mehrere Ordner zum Laufen bringen (nun, es dauerte eine Weile, aber sobald ich mehr DLLs benötigte und mehr Ordner hinzufügte, keine mit Leerzeichen im Pfad). Ich habe dann alle benötigten DLLs in einen Ordner kopiert und hatte das als java.library.path und es hat funktioniert. Ich habe keine Erklärung - wenn jemand das tut, wäre es großartig.

Ustaman Sangat
quelle
Wenn eine native Bibliothek über java.library.path gefunden wird und Sie eine andere in diesen Ordner kopieren, erscheint es natürlich, dass auch die zweite gefunden wird, nicht wahr?
Whaefelinger
Natürlich habe ich das deshalb benutzt, duh! Ich habe mich gefragt, ob man mehrere Ordner hinzufügen kann, ohne Dinge verschieben oder symlinken zu müssen.
Ustaman Sangat
0

Viele der vorhandenen Antworten setzen voraus, dass Sie dies für ein bestimmtes Projekt festlegen möchten, aber ich musste es für Eclipse selbst festlegen , um die integrierte Authentifizierung für den SQL Server-JDBC-Treiber zu unterstützen.

Zu diesem Zweck habe ich diese Anweisungen zum Starten von Eclipse über die Java-Befehlszeile anstelle des normalen Startprogramms befolgt . Dann habe ich dieses Skript einfach geändert, um mein Argument -Djava.library.path zur Java-Befehlszeile hinzuzufügen.

CrazyPyro
quelle
0
  1. Unter Windows: Fügen Sie den Pfad zur Bibliothek zur Umgebungsvariablen PATH hinzu.
  2. Unter Linux: Fügen Sie den Pfad zur Bibliothek zur Umgebungsvariablen LD_LIBRARY_PATH hinzu.
  3. Unter Mac: Fügen Sie den Pfad zur Bibliothek zur Umgebungsvariablen DYLD_LIBRARY_PATH hinzu.

java.library.path wird mit den Werten der oben genannten Variablen auf der entsprechenden Plattform initialisiert.

Dies sollte auf jeder IDE funktionieren.

Sie können testen, ob der Wert Ihren Erwartungen entspricht, indem Sie aufrufen java -XshowSettings:properties

rboc
quelle
-2

Unter Windows habe ich festgestellt, dass es wichtig ist, Eclipse über die Befehlszeile und nicht über das Startmenü oder eine Verknüpfung zu starten , vorausgesetzt, die native DLL befindet sich in einem Verzeichnis in Ihrem PATH. Anscheinend stellt dies sicher, dass sich das richtige Verzeichnis auf dem Pfad befindet.

Alan
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, dass das aktuelle Arbeitsverzeichnis unter Windows automatisch bei der Suche nach DLLs (oder ausführbaren Binärdateien) berücksichtigt wird. Wenn Sie also in den Ordner wechseln, in dem sich die DLLs befinden, und dann Eclipse up starten, werden die gesuchten DLLs gefunden. Abgesehen davon, wie hängt diese Antwort mit der Frage der Thread-Starter zusammen?
Whaefelinger