PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Jar file generieren


Magnum
2004-06-18, 23:12:39
Hallo Forum,

ich habe zur Zeit folgendes kleines Problem!
Ich habe ein Java Project, das ich in ein Jar-File stecken will! Das Problem dabei ist, dass ich einige andere Jar-Files in diesem Project benutze! Wie kann ich meinem jar jetzt sagen, dass die anderen jars irgendwo im Classpath zu finden sind??

Meine Lösungen bisher sind nicht zufriedenstellend. Diese wären:
- alle jars entpacken und dann zum jar hinzufügen!
- im Manifest als attribut "Class-Path" auf die jar files setzen! Hat aber den großen Nachteil, dass die jars in einem bestimmten Verzeichnis sein müssen!!

Gibts sonst noch Sachen, die man beachten muss, wenn man ausfühbare Jars machen will?

Gruß,
Magnum

HellHorse
2004-06-19, 14:23:56
Also der CLASSPATH sollte automatisch abgesucht werden, da musst du nix machen (vorausgesetzt du hast ihn im Manifest nicht angegeben).
Falls du die JARs beilegen willst, so dass du ein einziges ausführbares JAR hast in dem alles ist, kannst so sie einfach im root Verzeichnis des JARs ablegen, du musst sie nicht entpacken.

Was immer gut kommt, ist wenn du die JARs indizierst, so dass die Klassen etwas schneller geladen werden. Das benötigt aber 1.3.

Capt'N Coax
2004-06-19, 15:28:02
Fein, da kann ich mich einklinken.

Was muss ich im Manifest eigentlich angeben, damit er Unterordner IM Jar-File anspricht?
Bis jetzt muss ich die Ordner immer auslagern, das ist natürlich ungeschickt. Hab da auf die Schnelle nix gefunden, und eigentlich korrektet Pfadangaben werden halt nur "extern" behandelt :(...

HellHorse
2004-06-19, 17:55:12
Sorry, habe nicht ganz verstanden, was du meinst.
Könntest du vielleicht ein Beispiel machen?

Magnum
2004-06-19, 18:00:59
Original geschrieben von HellHorse
Also der CLASSPATH sollte automatisch abgesucht werden, da musst du nix machen (vorausgesetzt du hast ihn im Manifest nicht angegeben).

Funktioniert leider nicht! Warum weiss ich selbst nicht. Ich hab aber mal was gelesen, das bei Jar der Classpath übergangen wird! ??
Original geschrieben von HellHorse
Falls du die JARs beilegen willst, so dass du ein einziges ausführbares JAR hast in dem alles ist, kannst so sie einfach im root Verzeichnis des JARs ablegen, du musst sie nicht entpacken.

Du meinst dass dann die zusätzlichen Jars gepackt in meinem Jar dabei sind? (Also meine Klassen und die zusätz. Jars) Ging bei mir auch nicht! Bekam da nen NoClassDefFoundError.
Original geschrieben von HellHorse
Was immer gut kommt, ist wenn du die JARs indizierst, so dass die Klassen etwas schneller geladen werden. Das benötigt aber 1.3.
Gute Idee, wie mach ich das? :???:

Magnum
2004-06-19, 18:32:32
Ich hab Capt´N Coax auch nicht ganz verstanden, aber ich hab noch ne Frage, die dürfte in die selbe Richtung gehen!

Und zwar hab ich Gif´s die im Pfad package/resource/gif liegen! Werden normal als file mit folgenden Pfad angesprochen: "package/resource/gif/xy.gif". Funktioniert normal auch einwandfrei. Im Jar aber findet er sie nicht, obwohl sie dort auch im korrekten Pfad sind!

HellHorse
2004-06-19, 20:23:59
Original geschrieben von Magnum
Funktioniert leider nicht! Warum weiss ich selbst nicht. Ich hab aber mal was gelesen, das bei Jar der Classpath übergangen wird! ??
....
Du meinst dass dann die zusätzlichen Jars gepackt in meinem Jar dabei sind? (Also meine Klassen und die zusätz. Jars) Ging bei mir auch nicht! Bekam da nen NoClassDefFoundError.

Stiiimt. Ich prüfe das.
Original geschrieben von Magnum
Gute Idee, wie mach ich das? :???:

Also ich mache alle meine JARs mit ant. Da kann man einfach dem Attribut index des Elements jar den Wert "true" geben und gut is. :)
Original geschrieben von Magnum
Und zwar hab ich Gif´s die im Pfad package/resource/gif liegen! Werden normal als file mit folgenden Pfad angesprochen: "package/resource/gif/xy.gif". Funktioniert normal auch einwandfrei. Im Jar aber findet er sie nicht, obwohl sie dort auch im korrekten Pfad sind!
Sowas?
ImageIcon xyIcon = new ImageIcon((MeineKlasse.class).getClassLoader().getResource("verzeichnis/unterverzeichnis/xy.gif"));

Magnum
2004-06-19, 20:39:12
Original geschrieben von HellHorse
Sowas?
ImageIcon xyIcon = new ImageIcon((MeineKlasse.class).getClassLoader().getResource("verzeichnis/unterverzeichnis/xy.gif"));
Vielen Dank! Aber ich habs vor 10 Minuten auch gefunden!
Original geschrieben von HellHorse
Also ich mache alle meine JARs mit ant. Da kann man einfach dem Attribut index des Elements jar den Wert "true" geben und gut is. :)

Oh tifft sich gut, ich benutze auch Ant!
Ich hab hier mal einen Auszug aus meiner build.xml!

<jar jarfile="${dist}/lib/Test-${DSTAMP}.jar" basedir="${build}">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="de.pack.test.Start"/>
<attribute name="Class-Path" value="jar/y.jar
jar/ysvg.jar jar/batik.jar jar/batik-svggen.jar
jar/graphml.jar jar/fop.jar"/>
</manifest>
</jar>
Was muss ich jetzt einfügen zur Indizierung?
Und was mich daran jetzt noch stört, ist dass ich alle benötigten Jars so per Class-Path angeben muss! (Und ins entsprechende Verzeichnis kopieren muss)

HellHorse
2004-06-19, 20:50:13
<jar jarfile="${dist}/lib/Test-${DSTAMP}.jar" basedir="${build}" index="true">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="de.pack.test.Start"/>
<attribute name="Class-Path" value="jar/y.jar
jar/ysvg.jar jar/batik.jar jar/batik-svggen.jar
jar/graphml.jar jar/fop.jar"/>
</manifest>
</jar>
Du könntest sie auch ins lib/ext Verzeichnis der JRE kopieren, aber auch das ist nicht wirklich sauber.

Capt'N Coax
2004-06-19, 20:54:05
Original geschrieben von HellHorse
Sowas?
ImageIcon xyIcon = new ImageIcon((MeineKlasse.class).getClassLoader().getResource("verzeichnis/unterverzeichnis/xy.gif"));

Yepp. Hat somit auch mein Problem gelöst.
Logisch :)

Magnum
2004-06-19, 20:58:50
Original geschrieben von HellHorse

<jar jarfile="${dist}/lib/Test-${DSTAMP}.jar" basedir="${build}" index="true">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="de.pack.test.Start"/>
<attribute name="Class-Path" value="jar/y.jar
jar/ysvg.jar jar/batik.jar jar/batik-svggen.jar
jar/graphml.jar jar/fop.jar"/>
</manifest>
</jar>
Du könntest sie auch ins lib/ext Verzeichnis der JRE kopieren, aber auch das ist nicht wirklich sauber.
Vielen Dank mal soweit!
Ich geb das mit den Jars mal an meinen "Projektleiter" weiter! Vielleicht will er ja auch, dass alle jar ausgepackt und in unseres gesteckt werden, um nur ein Jar zu bekommen, das am Ende benötigt wird!