JAR mit Libaries und Natives vom Programm aus starten

Hoppelmann

Mitglied
Das folgende Problem:

Zusammen mit einigen Anderen (unwichtig) entwickele ich zur Zeit eine Java-Anwendung mit dem Slick-Framework.

Nun soll eine JAR mit den benötigten JARs und den Natives gestartet werden. Die Ordnerstruktur sieht folgendermaßen aus:

Code:
ROOT-Verzeichnis:

NAME_lib
NAME.jar
jinput-dx8.dll
jinput-dx8_64.dll
jinput-raw.dll
jinput-raw_64.dll
libjinput-linux.so
libjinput-linux64.so
libjinput-osx.jnilib
liblwjgl.jnilib
liblwjgl.so
liblwjgl64.so
libopenal.so
libopenal64.so
lwjgl.dll
lwjgl64.dll
openal.dylib
OpenAL32.dll
OpenAL64.dll

Um keine Rechte zu verletzen, wurden die externen JARs in das verzeichnis "NAME_lib" gepackt:

Code:
NAME_lib-Verzeichnis:

ibxm.jar
jinput.jar
jogg-0.0.7.jar
jorbis-0.0.15.jar
lwjgl.jar
mysql-connector.jar
slick.jar
tinylinepp.jar

Wie zu sehen ist, befinden sich sämtliche Natives im Root-Verzeichnis (wobei mir ein Ordner natives lieber wäre, aber das geht leider nicht). Im Manifest der NAME.jar ist bereits der Classpath zu den externen Libaries angegeben.

Vom Programm aus würde ich das ganze jetzt so starten:

Java:
String[] commandLine = { "java", "-jar", "ABSOLUTER_PFAD_ZUR_JAR" };
Runtime.getRuntime().exec(commandLine);

Natürlich werden noch Argumente mitgegeben, das soll jetzt aber unwichtig sein.

Also: Kennt jemand den Fehler? Kann ich den Pfad zur JAR überhaupt absolut (also C:/Programs usw.) angeben? Den Ordner habe ich überprüft, der Pfad ist schonmal richtig.

Danke schon mal im Vorraus.
 
Windows (und Mac) suchen die Natives in dem Verzeichnis mit der JAR.

[EDIT]Kann man überhaupt bei "java -jar PFAD" den absoluten Pfad angeben?[/EDIT]
 
Ich kann auch nur spekulieren, was das Problem ist. Findet er die nativen dlls vielleicht nicht?

Dazu gibt es in Java ein System-Property "java.library.path". Standardmäßig stehen dort die Lib-Ordner des jeweiligen Betriebssystems (z.B. bei Windows irgendwas mit system32). Du kannst das Property über die Kommandozeile mit "-Djava.library.path=xxx" überschreiben. Dann gehen aber die defaults verloren. Wenn Dich das nicht stört, ok. Ansonsten müsstest Du deinen eigenen Path als normales Argument übergeben und dann in der main-Methode des aufgerufenen Programms neu zusammenbauen und setzen. Ist ein bischen Fummelkram...

[EDIT]
Hoppelmann hat gesagt.:
Kann man überhaupt bei "java -jar PFAD" den absoluten Pfad angeben?
Ja, kann man.
[/EDIT]
 
Windows (und Mac) suchen die Natives in dem Verzeichnis mit der JAR.
totschlagargument
Java:
File me=new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI());
if(me.isFile()) { me=me.getParentFile(); }
File natives=new File(me, "natives");
da hast du den pfad zum natives-sub-dir ...
und dann mit [c]System.load(String)[/c] mit kompletten pfad *File.getPath()* die DLL manuell laden ..
du siehst also : man muss sich nicht dem OS anpassen ...

außerdem gibts wie erwähnt immer noch die möglichkeit java.library.path anzupassen ..
[EDIT]Kann man überhaupt bei "java -jar PFAD" den absoluten Pfad angeben?[/EDIT]
ja ... sonst hätte ichs ja wohl kaum geschrieben ...
wie du an diesen kommst steht oben ...
 
Hab es selbst gelöst:

Java:
System.setProperty("org.lwjgl.librarypath", new File(ConstantManager.getBinDir(), "natives").getAbsolutePath());
System.setProperty("net.java.games.input.librarypath", System.getProperty("org.lwjgl.librarypath"));

Das bindet alle Libaries ein. (Für die, die über Goolge etc. hierrauf stoßen).

Trotzdem nochmal vielen Dank.
 

Zurück
Oben