PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie .jar in anderer .jar verwenden?


Aqualon
2004-12-09, 23:53:28
Hi!

Ich habe ein Problem mit einem Java-Projekt. Und zwar moechte ich ein jar-File (antlr.jar) in einem anderen jar-File (algo.jar) benutzen. Ich habe in der manifest-Datei von algo.jar unter Class-Path antlr.jar angegeben, aber er findet es nicht beim Starten.

Was muss ich in das manifest schreiben, damit algo.jar ueberall laeuft?

Aqua

PH4Real
2004-12-10, 18:35:43
Also ich lasse mir die jars meistens von ANT oder Eclipse generieren, aber eigentlich ist das schon alles ganz richtig.

Bei mir sieht ein entsprechender Teil der jar so aus:

Class-Path: . lib/log4j-1.2.8.jar lib/pircbot.jar

Wobei dann eben die Libs entsprechend im /lib Ordner liegen. Den "." nicht vergessen, damit er auch das momentane Verzeichnis einbindet.

Aqualon
2004-12-10, 19:21:55
Hab ich eigentlich auch gemacht (benutze Eclipse zum exportieren), meine MANIFEST.MF sieht folgendermaßen aus:

Manifest-Version: 1.0
Class-Path: . antlr/antlr.jar
Main-Class: ALGO

Die antlr.jar liegt auch innerhalb des jar-Files im Ordner antlr. Beim Starten kommt aber immer noch ein NoClassDefFoundError wegen einer Klasse in antlr.jar.

Aqua

PH4Real
2004-12-11, 16:19:46
Hab ich eigentlich auch gemacht (benutze Eclipse zum exportieren), meine MANIFEST.MF sieht folgendermaßen aus:

Manifest-Version: 1.0
Class-Path: . antlr/antlr.jar
Main-Class: ALGO

Die antlr.jar liegt auch innerhalb des jar-Files im Ordner antlr. Beim Starten kommt aber immer noch ein NoClassDefFoundError wegen einer Klasse in antlr.jar.

Aqua

Innerhalb der .jar Datei? Nein, dass kann dann so nicht funktionieren. Die zweite Jar Datei müsste im /antlr Verzeichnis relativ zur algo.jar.

Wenn Du alles in eine Jar Datei haben möchtest (sehe dafür keinen Grund), dann müßtes Du entweder die antlr.jar entpacken und diese in algo.jar wieder reinpacken, oder die Jar Datei dynamisch mittels dem Classloader zur Laufzeit laden.

Aqualon
2004-12-11, 18:53:13
Der Grund für das Ganze ist, ich es gerne gehabt hätte, dass man das Programm ausführen kann, ohne die .jar vorher zu entpacken.

Wie würde denn das dynamische Laden zur Laufzeit mit dem Classloader funktioneren?

Was mir ausserdem aufgefallen ist, wenn ich jar-Archive ausführe, interessiert sich Java anscheinend nicht für die CLASSPATH Umgebungsvariable. Beim direkten ausführen wird diese aber berücksichtigt. Woran könnte das denn liegen?

Aqua

PH4Real
2004-12-18, 17:51:54
Sorry, aber irgendwie versteh ich dich dein Problem immer noch nicht ganz ;)...

Der Grund für das Ganze ist, ich es gerne gehabt hätte, dass man das Programm ausführen kann, ohne die .jar vorher zu entpacken.


Warum machst Du nicht einfach eine Zip Datei bestehend aus "algo.jar;/lib/antlr.jar"? Der Nutzer enpackt diese, startet die algo.jar per Doppelklick und das wars. Das ganze hat auch noch den Vorteil, dass wenn in der externen Bibliothek (hier also antlr.jar) irgendwelche Sachen gefixt werden müssen, einfach diese ersetzt werden kann.


Wie würde denn das dynamische Laden zur Laufzeit mit dem Classloader funktioneren?


Das wird auf jeden Fall komplizierter. Du musst dich dann durch die einzelnen JarEntrys der Jar Datei hangeln. Diese können bestimmt nicht direkt mit dem URLClassLoader geladen werden, so dass man diese (wahrscheinlich) über ByteArrays dynamisch laden muss. Wie das dann genau aussieht, weiß ich auch nicht...

Wenn Du nur Klassen laden willst:
[JAVA] Problem beim dynamisches Laden von Klassen aus *.jar Dateien (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=167193)

Was mir ausserdem aufgefallen ist, wenn ich jar-Archive ausführe, interessiert sich Java anscheinend nicht für die CLASSPATH Umgebungsvariable. Beim direkten ausführen wird diese aber berücksichtigt. Woran könnte das denn liegen?

Was meinst Du mit "Ausführen" und "direkten Ausführen". Einmal mittel "java -jar" und einmal per Doppelklick?

Aqualon
2004-12-18, 19:08:18
Sorry, aber irgendwie versteh ich dich dein Problem immer noch nicht ganz ;)...
Ich wollte nur eine einzige .jar Datei, die man dann ausführen kann. Hab das gelöst, indem ich die andere vorher entpackt und die ganzen Dateien mit in die neue exportiert hab.
Was meinst Du mit "Ausführen" und "direkten Ausführen". Einmal mittel "java -jar" und einmal per Doppelklick?
War wohl missverständlich ausgedrückt. Ausführen bezog ich auf java -jar und mit direkt ausführen meinte ich den Aufruf der entsprechenden class-Datei, wenn das jar-Archiv entpackt ist.

Aqua