Ant Build File, wie ist der Java3D Native Code einzubinden?

Bergtroll

Bekanntes Mitglied
Hallo mal wieder, liebes Forum,

mache erste Gehversuche mit Ant, und ich verzweifele gerade an dem Versuch, eine Zip Distri meines Projekts zu erzeugen, dass eine Java3D Abhängigkeit enthält.

Ich habe folgendes Manifest.txt:
Code:
Manifest-Version: 1.0
Main-Class: Mein.Paket.MeineMainKlasse
Class-Path: . lib/libj3dcore-ogl.so lib/commons-lang-2.6.jar lib/j3dcore.jar lib/j3d-org-all_1.0.0.jar lib/j3d-org-java3d-all_1.0.0.jar lib/j3dutils.jar lib/vecmath.jar lib/visad.jar

und dieses Build XML File:
Code:
<project name="MeineTollesProjekt" default="dist">
  <property name="MyApp" value="MeineTollesProjekt" />
  <path id="compile.classpath">
    <fileset dir="lib" />
    <pathelement path="bin" />
  </path>
  <target name="compile">
    <javac srcdir="src" destdir="bin">
      <classpath refid="compile.classpath" />
    </javac>
  </target>
  <!-- Create binary distribution -->
  <target name="dist" depends="compile">
    <delete file="${MyApp}.jar"/>
    <delete file="dist/${MyApp}.zip"/>
    <mkdir dir="dist" />
    <jar jarfile="${MyApp}.jar"
         basedir="bin"
         manifest="manifest.txt" />
    <zip destfile="dist/${MyApp}.zip">
      <fileset dir="." includes="lib/*" />
      <fileset dir="." includes="${MyApp}.jar" />
    </zip>
  </target>
</project>

Trotzdem erhalte ich, obwohl in Eclipse vorm Build alles funktioniert, folgenden Fehler:
Code:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
	at java.lang.Runtime.loadLibrary0(Runtime.java:823)
	at java.lang.System.loadLibrary(System.java:1028)
	at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:200)
	at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:157)
	at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:987)
	at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:299)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:169)
	at de.MeineTollesProjekt.M.hasJ3D(MeineTollesProjekt.java:94)
	at de.MeineTollesProjekt.<init>(MeineTollesProjekt.java:43)
	at de.MeineTollesProjekt.main(MeineTollesProjekt.java:107)

Wie kann ich meinem Kompilat klarmachen, dass es die libj3dcore-ogl.so fressen soll?

Viele Grüße,

Bergtroll
 
Hmm... wenn ich das Proggy mit "-Djava.library.path=/home/marius/workspace/MeineTollesProjekt/lib/" aufrufe, dann gehts.... Dass muss doch auch Ant beizubringen sein?
 
Classpath und Library Path sind verschiedene Dinge. Damit System.loadLibrary funktioniert müsste die Bibliothek im Library Path liegen. Tut sie das nicht brauchst du System#load (dort kannst du einen Pfad angeben).
Anders gesagt: Mit Ant lässt sich das nicht lösen, entweder du setzt den Library Path beim Programmstart, oder du musst die Bibliothek anders laden.
 
Hey Wildcard,

danke für die Antwort, auf irgendeinen Tipp von dir hin, habe ich in der Vergangenheit OSGi benutzt, da war das so schön leicht zu lösen 🙂, diesmal geht das leider nicht... Naja, habe jetzt mal versucht, das System.load zu nutzen. Weisst du, ob es da irgendwelche Beschränkungen gibt? Habe nämlich vorhin mal testweise einen absoluten Pfad zur library hardgecodet von dem ich zu 100% sicher weiß, dass er existiert. Allerdings ausserhalb des Pfades in welchem das JAR lag, den bereits beschriebenen Fehler gab es leider trotzdem.

Viele Grüße,

Bergtroll
 
danke für die Antwort, auf irgendeinen Tipp von dir hin, habe ich in der Vergangenheit OSGi benutzt, da war das so schön leicht zu lösen
Da fragt man sich warum du nicht bei OSGi geblieben bist.
Weisst du, ob es da irgendwelche Beschränkungen gibt? Habe nämlich vorhin mal testweise einen absoluten Pfad zur library hardgecodet von dem ich zu 100% sicher weiß, dass er existiert. Allerdings ausserhalb des Pfades in welchem das JAR lag, den bereits beschriebenen Fehler gab es leider trotzdem.
Das Problem wird sein, das nicht du nicht selbst die Bibliothek laden willst, sondern das hier:
Code:
javax.media.j3d.NativePipeline$1.run(NativePipeline.java:231)
Da bleibt eigentlich nur Doku der Bibliothek durchlesen um herauszufinden ob man auch per System Property, oder so, einen Pfad zur nativen Bibliothek angeben kann.
Wenn nicht, wirst du wohl nicht um ein starter Script, Webstart, oder OSGi herum kommen.
 

Zurück
Oben