Umgebungsvariable Exception in thread "main" java.lang.UnsatisfiedLinkError: no J3D in java.librar y.path

  • Themenstarter Themenstarter schnatter08
  • Beginndatum Beginndatum
S

schnatter08

Gast
Hallo,

habe eine jar mit ner main-Klasse. Wenn ich die jar starte kommt:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no J3D in java.librar
y.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)

Die jar erzeuge ich über ant. Wie kommt es zu dem Fehler und vorallem: Wie kann ich den beheben?
 
Hallo,

dieser Fehler wird hunderfach in diesem Forum bereits diskutiert und behoben.

Ich würde einfach mal nach dem Fehler googeln.

I.d.R. reicht es die fehlende JAR in den Classpath zu packen.

Gruß,

Martin
 
Danke für deine Antwort. Wenn ich die lib in den Classpath setzen (müsste ich bei meiner jar dann ja in der Manifest.mf machen) müsste ich die jar ja außerhalb meiner jar haben. Ich habe die j3dcore.jar aber bereits mittels <zipgroupfileset dir="${lib.dir}" includes="*.jar" /> mit in meine jar eingebunden und trotzdem kommt solch ein Fehler...
 
@Marco:

Wie gesagt ich hab die j3dcore mit in die jar selber entpackt. Aber irgendwie scheint das nicht zu funktionieren.
 
Vielleicht hätte ich das klarer sagen sollen: Das hat nicht notwendigerweise etwas mit der JAR zu tun: Java3D braucht auch native Libs (auf Windows z.B. DLLs), die üblicherweise in
Programme\Java\Java3D\1.5.1\bin
oder so liegen. Ohne die geht es eben nicht.
 
Was muss ich denn tun, damit meine ausfürhbare jar die j3d fehlermeldung nicht mehr bringt?
 
Hallo,

ich hab folgendes versucht, was aber auch nocht so richtig klappt.

In das Verzeichnis wo meine ausführbare jar liegt j3dcore.jar j3dutils.jar und vecmath.jar sowie die dlls
j3dcore-d3d.dll
j3dcore-ogl.dll
j3dcore-ogl-cg.dll
j3dcore-ogl-chk.dll

hineinkopiert. In der Manifest.mf hab ich dann noch den Clas-Path auf die obigen 3 jars gesetzt. Klappt aber nicht. Kommt noch immer:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no J3D in java.librar
y.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at javax.media.j3d.MasterControl$22.run(MasterControl.java:889)
at java.security.AccessController.doPrivileged(Native Method)
at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:886)
at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:229)
 
Ich habe die im bin-Ordner von Java3D liegende dll ebenfalls in meiner Aufzählung oben erwähnt. Es liegen also die 3 jars und verschiedene dlls im gleichen Verzeichnis wie meine ausführbare jar. Der Class-Path auf die 3 Jars wurde in der Manifest der ausführbaren jar ebenfalls auf die 3 jars gesetzt. Aber es bleibt bei der oben erwähnten Fehlermeldung...
 
Und was kriegst du bei [c]java.library.path[/c] zurück? Der hat wohl keinen Entry [c].[/c]? Wenn du diesen hinzufügst, sollte es funktionieren.
 
Hallo,

müsst ich dazu nicht ne .bat schreiben die über -Djava den Pfad setzt für java.library oder gibt es eine Möglichkeit an der jar oder der manifest irgendwas zu machen damit das funktioniert?
 
Hallo,

ich hab jetzt mal j3dcore, j3dutils und vecmath mit in meine ausführbare jar mittels ant und <zipgroupfileset ... eingracht. Wenn ich jetzt die jar ausführen möchte kommt folgende Meldung:

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\j3dcore-og
l.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

Er kann also keine 32 bit dll laden. Aber warum wird überhaupt in C:\Windows gesucht? Ich hab es mit den 3 jars (j3dcore, j3dutils und vecmath) sowohl aus ...am64.zip als auch windows-i586 von

Index of /media/java3d/builds/release/1.5.2/

probiert, weil ich dachte es liegt daran. Der Ansatz mit edm entpacken der Java3D jars scheint zumindest nicht ganz falsch, wenn jetzt nicht das Problem mit der DLL wäre
 
Er lädt die DLL aus dem Path, auf den er zuerst stößt. Dabei werden die Pfade in einer bestimmten Reihenfolge besucht. Wenn man sagt: System.loadLibrary("someLib");
dann sucht er (auf Windows) nach der "someLib.dll" z.B. zuerst im Verzeichnis, in dem er sich gerade befindet, dann im Windows-Verzeichnis, dann in den Verzeichnissen aus dem PATH, und dann im java.library.path (vielleicht auch in einer anderen Reihenfolge). In C:\windows liegt offenbar besagte DLL, und sie ist 32bit und passt damit nicht zu deinem 64bit-System....
 
Warum rufst du es nicht mit einem vollen Pfad auf? Ich würde so was versuchen:
Java:
System.load(System.getProperty("user.dir") + System.getProperty("file.separator") + derNameDeinerLib);
 

Zurück
Oben