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



## Bergtroll (9. Aug 2011)

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:

```
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:

```
<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:

```
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


----------



## Bergtroll (9. Aug 2011)

Hmm... wenn ich das Proggy mit  "-Djava.library.path=/home/marius/workspace/MeineTollesProjekt/lib/" aufrufe, dann gehts.... Dass muss doch auch Ant beizubringen sein?


----------



## Wildcard (10. Aug 2011)

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.


----------



## Bergtroll (10. Aug 2011)

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


----------



## Wildcard (10. Aug 2011)

> 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:

```
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.


----------



## Bergtroll (10. Aug 2011)

Wildcard hat gesagt.:


> Da fragt man sich warum du nicht bei OSGi geblieben bist



Weils der Systemverwalter nicht will :-/


----------



## AFlieger (11. Aug 2011)

> Weils der Systemverwalter nicht will :-/



Der gehört doch aufs JobCenter geschickt. :lol: Sorry, aber der musste jetzt raus.


----------

