Classpath Classpath in Jar Dateien

clemensntap

Mitglied
Hallo beisammen,

ich habe folgende Frage:

Ich habe meine Applikation in ein Jar File (x.jar) verpackt, inklusive einer Manifest.mf, in der im Classpath die Libs aufgelistet sind, die benötigt werden. Alle Jars liegen im gleichen Verzeichnis (auch meine x.jar).

Nun starte ich meine Applikation wiefolgt:
java -cp x.jar Startklasse

Die Libraries die ich über die Manifest.mf eingebunden habe, die brauchen ja teilweise auch wiederrum Libraries um zu funktionieren. Nun die Frage: Können diese Libraries dann ihre benötigten Jars selber finden (liegen ja alle im gleichen Ordner) ODER muss ich alle Jars die ingesamt benötigt werden (also auch die nicht direkt von meiner Applikation benötigt werden) auch in den Classpath in meine Manifest.mf aufnehmen.

Kurzes Beispiel:
x.jar, liby.jar, libz.jar alle im gleichen Ordner.

x.jar (von mir erzeugt): benötigt liby.jar. Deshalb in der manifest.mf im Classpath aufgeführt.
liby.jar benötigt libz.jar. Muss libz.jar jetzt auch im Classpath in der manifest.mf aufgeführt werden, oder findet Java die von selbst?

Vielen Dank für eure Hilfe,
Clemens
 

FArt

Top Contributor
Wenn die Klassenpfade in der Manifestdatei gepflegt werden, dann musst du mit dem -jar Parameter starten (ohne Startklasse). Sonst musst du den Klassenpfad mit -cp angeben und die Startklasse. Jegliche Kombinationen davon führen nicht zum Ziel.
 

clemensntap

Mitglied
Wenn die Klassenpfade in der Manifestdatei gepflegt werden, dann musst du mit dem -jar Parameter starten (ohne Startklasse). Sonst musst du den Klassenpfad mit -cp angeben und die Startklasse. Jegliche Kombinationen davon führen nicht zum Ziel.

Erstmal danke für deine Antwort. Das mache ich doch soweit, oder?
Im Moment wird die Applikation (vereinfacht) wiefolgt gestartet:

java -cp /path/to/x.jar:/path/to/etc:/path/to/properties "Startklasse_y für x.jar"
D.h. die Pfade zu den ganzen Konfigurationsdateien werden im Classpath direkt angegeben. Auf die Libs wird in der Manifest.mf verwiesen.

Ich startete nicht mit java -jar x.jar (und nehme die Konfigurationspfade in die Manifest.mf auf), da es 2 verschiedene Eingangspunkte gibt (einmal für Server, einmal für Client). Ansonsten bräuchte ich zwei Jars, was ich ungern will.

Die Frage die sich mehr stellt, ist ob Java die transitiven Abhängigkeiten von x.jar->Libs->"von den Libs benötigte Libs" automatisch auflöst oder ob ich das selber machen muss.

Danke nochmal!
 

FArt

Top Contributor
Ich wiederhole: entweder... oder. Keine Kombination.
Pflege den kompletten Klassenpfad über -cp und starte über Skripten mit der passenden Main-Klasse.

Auch zwei JARs wären nicht unbending verkehrt. Vermutlich hättest du dann mehr Aufwand beim Assembly der JARs, aber du hättest auch keine unnötigen Ressourcen in den JARs.
 

clemensntap

Mitglied
Je länger ich mich mit dem Problem auseinandersetze, desto weniger funktioniert es :(
Hier nochmal das aktuelle Setup, etwas detailierter. Vielleicht kann mir jemand noch einen Tipp geben.
Die Dateistruktur ist vereinfacht die folgende (ausgehend vom Hauptordner der Applikation):

Code:
bin
  |- start.sh
etc
  |- my.config
properties
  |- server
    |- logback.xml
webapp
  |- server
    |- WEBINF
      |- lib
        |- lib1.jar
        |- lib1.jar
        |- myapp.jar

Die bin/start.sh ruft folgendes auf:
java -jar /opt/company/myapp/webapp/server/WEBINF/lib/myapp.jar

Die Manifest.mf sieht wiefolgt aus:
Code:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.0
Created-By: 1.6.0_20-b02 (Sun Microsystems Inc.)
Build-By: xxx
Main-Class: xxx
Class-Path: ../../../../etc ../../../../properties/server lib1.jar lib2.jar
<Leerzeile>

Ich glaub die Pfade stimmen einfach nicht, aber ich kriegs einfach nicht richtig hin. Die Applikation starte ich im Moment direkt aus dem Hauptordner, also mit bin/start.sh. Hat jemand eine Idee wo das Problem liegen könnte?
Bin für jede Hilfe dankbar!
 
D

despikyxd

Gast
um auf deine grundfrage zurückzukommen

NEIN ... java kann abhängigkeiten nicht selbst auflösen ...
wenn dein jar ein weiteres jar braucht das wiederum ebenfalls eins braucht musst du das von der lib genutzte jar ebenfalls in DEINEN class-path aufnehmen da alles relativ zum SystemClassLoader ist
heißt also das ALLE jars die deine gesamte app nutzt ... also auch die jars die von den libs gebraucht werden müssen in deinen Class-Path ... und zwar alle RELATIV zum root-jar *also dem jar was über java -jar *.jar gestartet wird*
alternativ mit java -cp alle jars eintragen und dann die main-klasse starten ...
die antwort von wegen entweder mit -cp oder garnicht von FArt ist hier fehl am platz ...
 

clemensntap

Mitglied
NEIN ... java kann abhängigkeiten nicht selbst auflösen ...
wenn dein jar ein weiteres jar braucht das wiederum ebenfalls eins braucht musst du das von der lib genutzte jar ebenfalls in DEINEN class-path aufnehmen da alles relativ zum SystemClassLoader ist
heißt also das ALLE jars die deine gesamte app nutzt ... also auch die jars die von den libs gebraucht werden müssen in deinen Class-Path ... und zwar alle RELATIV zum root-jar *also dem jar was über java -jar *.jar gestartet wird*
alternativ mit java -cp alle jars eintragen und dann die main-klasse starten ...
die antwort von wegen entweder mit -cp oder garnicht von FArt ist hier fehl am platz ...

Alles klar, damit kann ich was anfangen kann - vielen Dank.
Sollte dann nicht auch "java -cp myapp.jar STARTKLASSE" funktionieren, vorausgesetzt in der Manifest.mf in der myapp.jar sind alle Klassen eingetragen?
 
D

despikyxd

Gast
ganz erlich : das weis ich nicht ... ich würde aber rein vom bauchgefühl her sagen : funktioniert nicht ...
warum : weil du mit der parameter-angabe genau diesen eintrag im manifest überschreibst ...
und ich denke das FArt genau diese kombination meinte mit : GEHT NICH ... und da würde ich mich dann auch anschließen
 
D

despikyxd

Gast
@ FArt
nach nun dreimaligem durchlesen deiner posts : ja .. du hast es mitlerweile zu oft geschrieben =P
 

clemensntap

Mitglied
Nein. Das sagte ich schon zwei mal. Und auch die "transitiven" Abhängigkeiten waren eigentlich schon beantwortet, als ich vom "kompletten Klassepfad" sprach.

Ok, ich habe es nochmal ausprobiert:
Code:
java -cp /path/to/jar/myapp.jar:/path/to/logbackxml/ STARTKLASSE
wobei alle benötigten Libs in der Manifest.mf in der myapp.jar eingetragen sind. Applikation startet, funktioniert und er findet auch die logback.xml für die Logging Konfiguration. Rein logisch macht es für mich keinen Sinn und ich denke es ist eher ein "günstiger" Zufall, dass es überhaupt klappt. Folglich, keine akzeptable Lösung.

Das Einzige was nicht funktioniert, wenn ich alle Jars in die Manifest einfüge, ist dass er die logback.xml nicht mehr finden kann (s. Post #6). Irgendwelche Ideen?


Nochmal, vielen Dank für eure Hilfe & Geduld!
 

FArt

Top Contributor
@ FArt
nach nun dreimaligem durchlesen deiner posts : ja .. du hast es mitlerweile zu oft geschrieben =P

Meinst du? Trotzt "ich habs verstanden" und "damit kann ich was anfangen" stehen wir noch am Anfang...

Ich hatte vergessen auf die Internet- und Forensuche hinzuweisen (auch über die FAQs ist da glaube ich was hilfreiches dabei).... denn genau dieses Thema ist einfach nicht neu und es kommen auch keine neuen Facetten hinzu (außer dass man hier auf einem Standalone-Client eine unnötige WAR-Struktur vorfindet).
 

clemensntap

Mitglied
Ok, das Problem in der Manifest war folgendes:
Code:
Inkorrekt: Class-Path: ../../../../etc
Korrekt  : Class-Path: ../../../../etc/

Ich hatte vergessen auf die Internet- und Forensuche hinzuweisen (auch über die FAQs ist da glaube ich was hilfreiches dabei).... denn genau dieses Thema ist einfach nicht neu und es kommen auch keine neuen Facetten hinzu (außer dass man hier auf einem Standalone-Client eine unnötige WAR-Struktur vorfindet).

Ich stimme dir zu, es gibt unzählige Threads zum Thema Jar, Manifest & Classpath. Mir ist noch keines untergekommen, in dem etwas anderes als Jar Dateien inkludiert worden sind (was hier eh nicht das Problem war). Wenn aber in dem Großteil der Threads mit Halbwissen und "Starte doch mit java -cp myapp.jar Startklasse" hantiert wird, dann ist es ja wenig verwunderlich, dass jemand auch mal ein Problem bekommt, wenn es dann nicht mehr klappt.
Das "-jar" den "-cp" Parameter überschreibt ist ja aus der Doku bekannt. Dass jedoch der Classpath in der Manifest den "-cp" Parameter überschreibt, davon ist in der Doku (leider) nichts zu lesen und genausowenig in 99% der eigentlich betroffenen Threads. Jedenfalls, Danke für deine Hilfe, jetzt gehts ja.
 
D

despikyxd

Gast
@TO
du hast es scheinbar nicht verstanden was ich geschrieben habe oder du hast es falsch gelesen

durch setzen von -cp im aufruf wird der Class-Path im manifest überschrieben ...
nicht der -cp vom manifest ...

was aber EINDEUTIG aus der doc hervorgeht

nur dateinamen die auf ein "/" enden werden als verzeichnisse interpretiert ... alles andere als file ...
und wenn du das mal GENAU gelesen hättest wäre dir dieser fehler sehr viel früher aufgefallen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
F Classpath Dateien einbinden und Classpath durchsuchen Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
Michi__ Modulepath und Classpath fehlen Java Basics - Anfänger-Themen 2
A CLASSPATH Java Basics - Anfänger-Themen 4
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
A Class not found - Jar liegt am classpath Java Basics - Anfänger-Themen 2
J .classpath und .project? Java Basics - Anfänger-Themen 1
M Classpath Befehl zum Kompilieren um die Option classpath erweitern. Java Basics - Anfänger-Themen 5
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
C Die CLASSPATH Variable Java Basics - Anfänger-Themen 1
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
S Classpath Findet die Klasse nicht classpath setzen? Java Basics - Anfänger-Themen 8
T File aus Classpath verwenden Java Basics - Anfänger-Themen 3
M Unterschied zwischen Classpath eines Eclipse Projektes und dem CLASSPATH? Java Basics - Anfänger-Themen 3
Q Classpath mit Text Editor progammieren (Classpath) Java Basics - Anfänger-Themen 5
B Umgebungsvariable + Classpath Java Basics - Anfänger-Themen 2
V Erste Schritte Ausführen mit cmd + Classpath Java Basics - Anfänger-Themen 13
H Classpath Eclipse? Java Basics - Anfänger-Themen 13
L Classpath anlegen Java Basics - Anfänger-Themen 6
P Classpath falscher Classpath, aber nicht immer Java Basics - Anfänger-Themen 19
H Classpath konnte nicht gefunden werden? Java Basics - Anfänger-Themen 2
C Java3d Classpath?!? Java Basics - Anfänger-Themen 11
M Classpath Jar nicht ausführbar, Classpath warscheinlich falsch Java Basics - Anfänger-Themen 10
M Classpath Java Basics - Anfänger-Themen 11
D Classpath compiler zur Laufzeit aufrufen & lib-classpath Java Basics - Anfänger-Themen 6
J Classpath Java Basics - Anfänger-Themen 9
S ClassPath Java Basics - Anfänger-Themen 12
Z CLASSPATH + Packages Java Basics - Anfänger-Themen 6
J classpath Java Basics - Anfänger-Themen 10
S import - Anweisung; Setzen der Classpath Java Basics - Anfänger-Themen 2
J Frage zu jars/classpath Java Basics - Anfänger-Themen 7
K MySQL, Classpath, Java, MAC OSX Java Basics - Anfänger-Themen 3
D Classpath setzen Java Basics - Anfänger-Themen 4
J Classpath bestimmen, unter Windows 7 Java Basics - Anfänger-Themen 2
E Classpath Java Basics - Anfänger-Themen 4
B XOM...Classpath etc.??? Java Basics - Anfänger-Themen 2
L set Classpath für JDK Java Basics - Anfänger-Themen 2
L Lucene Classpath unter linux setzen Java Basics - Anfänger-Themen 8
B Classpath setzen - UNTER MAC OS X Java Basics - Anfänger-Themen 2
J classpath funktioniert nur in eclipse nicht auf der konsole?! Java Basics - Anfänger-Themen 6
P ClassPath in Ubuntu Java Basics - Anfänger-Themen 4
S dauerhafte CLASSPATH-Umgebungsvariable Java Basics - Anfänger-Themen 3
E Classpath Frage Java Basics - Anfänger-Themen 2
C Textpad, classpath, java = Probleme Java Basics - Anfänger-Themen 21
F probleme mit classpath/auslagerung von klassen Java Basics - Anfänger-Themen 5
L Classpath-Probleme Java Basics - Anfänger-Themen 2
A Classpath im manifest einbinden? Java Basics - Anfänger-Themen 3
GilbertGrape findet jar aus Classpath nicht Java Basics - Anfänger-Themen 4
Z Ant java -classpath befehl Java Basics - Anfänger-Themen 2
G Wo fnde ich den classpath, um dort z.b. eine html abzulegen? Java Basics - Anfänger-Themen 13
G Classpath Problem Java Basics - Anfänger-Themen 4
F Classpath problem Java Basics - Anfänger-Themen 2
G Classpath . zum Xten Mal Java Basics - Anfänger-Themen 16
G Plugins einbinden und Classpath setzen Java Basics - Anfänger-Themen 4
F Classpath: Wichtig für Runnable JAR? Java Basics - Anfänger-Themen 2
G unbound classpath container Java Basics - Anfänger-Themen 1
J Anfänger-Frage zu jar-Files / Manifest.mf / Classpath Java Basics - Anfänger-Themen 16
G Java mit libs und classpath? Java Basics - Anfänger-Themen 5
P JAR erzeugen-CLASSPATH-Probleme Java Basics - Anfänger-Themen 4
S CLASSPATH in Windows Java Basics - Anfänger-Themen 8
G JDBC - Classpath - Ich werd wahnsinnig! Java Basics - Anfänger-Themen 18
N Frage zur Classpath-Variable in der Manifest-Datei Java Basics - Anfänger-Themen 7
S CLASSPATH-Fehler Java Basics - Anfänger-Themen 8
K classpath eintrag funktioniert nicht Java Basics - Anfänger-Themen 8
T [Dringend] Classpath-Problem Java Basics - Anfänger-Themen 3
G Probleme mit JAVA_HOME bzw. classpath Java Basics - Anfänger-Themen 12
W classpath / jar / Programm aus Konsole Starten Problem Java Basics - Anfänger-Themen 2
G Eclipse, FatJar, Export, Classpath Java Basics - Anfänger-Themen 13
M Mal wieder der classpath. Java Basics - Anfänger-Themen 13
C Probleme mit .jar Datei und CLASSPATH Java Basics - Anfänger-Themen 2
G Classpath richtig setzen Java Basics - Anfänger-Themen 4
Q Classpath nach dem Deployen - Manifest-File Java Basics - Anfänger-Themen 4
T kopieren in den classpath Java Basics - Anfänger-Themen 4
F Frage zu Jars und Classpath Java Basics - Anfänger-Themen 2
D classpath setzen Java Basics - Anfänger-Themen 10
G Leidiges Thema Classpath Java Basics - Anfänger-Themen 5
C jar in jar - Classpath? Java Basics - Anfänger-Themen 12
D Applet starten (Classpath ? ) Java Basics - Anfänger-Themen 7
Z Jar-Archiv Classpath Variable Java Basics - Anfänger-Themen 6
L Classpath Java Basics - Anfänger-Themen 4
Q [javac] Zu blöd für -classpath? Java Basics - Anfänger-Themen 2
G Classpath JUnit geht net (?) Java Basics - Anfänger-Themen 11
A classpath zur Laufzeit erweitern Java Basics - Anfänger-Themen 4
H CLASSPATH unter j2sdk1.4.2_10 Java Basics - Anfänger-Themen 2
P Absolute Verzweiflung: Linux + Java + CLASSPATH Java Basics - Anfänger-Themen 8
G Wie muss classpath lauten? Package kompilieren/interpretiere Java Basics - Anfänger-Themen 4
K classpath zum 1001. Mal Java Basics - Anfänger-Themen 11
L Schon wieder ClassLoader bzw. Classpath :-( Java Basics - Anfänger-Themen 3
S classpath Java Basics - Anfänger-Themen 6
A Classpath oder Path? Java Basics - Anfänger-Themen 7
A Umgebungsvariable Classpath Java Basics - Anfänger-Themen 8
C classpath in eclipse Java Basics - Anfänger-Themen 2
G Probleme mit Classpath Java Basics - Anfänger-Themen 4
X Classpath setzen Java Basics - Anfänger-Themen 5
G Problem mit classpath Java Basics - Anfänger-Themen 5
N Packages definieren bzw. zum Classpath hinzufügen Java Basics - Anfänger-Themen 4
G Classpath für Java in Suse 9 setzen Java Basics - Anfänger-Themen 2
R JAR wird nicht gefunden, ist aber im classpath. Java Basics - Anfänger-Themen 12
T Nerv! Packages und Classpath Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben