Classpath Java von der Kommandozeile, starten einer JAR mit Libraries

kirdie

Bekanntes Mitglied
Ich benutze Java seit bestimmt 5 Jahren aber was ich *nie* geschafft habe ist, Java auf der Kommandozeile auszuführen (ich benutze Eclipse und/oder Maven). Bevor ich es aber endgültig frustriert aufgebe möchte ich noch ein letztes mal bei euch um Hilfe fragen, mit einem ganz einfachen Problem:

Ich habe mein Projekt in Eclipse als Jar exportiert (die class files und die libs) und die Hauptklasse für das Manifest ausgewählt.
Alle jars die im Buildpath liegen sind im Verzeichnis "lib". Die Jar "program.jar" sieht jetzt so aus:

Java:
Main.class -> enthält die Mainmethode
META-INF -> enthält manifest mit mainmethode
-somepackage
+lib
-- jdom.jar
-- y.jar
-- z.jar

Jetzt möchte ich die Mainklasse ausführen, gebe also ein:

Java:
java -jar program.jar -cp "program.jar:lib/*"
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/JDOMException

Gut, vielleicht sind die Parameter ja falschrum (sollte ja eigentlich keinen Unterschied machen aber wer weiß):

Java:
java -cp "program.jar:lib/*" -jar gho_linkedct_subclasses.jar
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/JDOMException

Gut, machen wir das ganze mal einfacher und entpacken das jar.

Java:
jar -xf program.jar
java Main -classpath ".;lib/*;lib"
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdom/JDOMException
java -classpath ".;lib/*;lib" Main 
Exception in thread "main" java.lang.NoClassDefFoundError: Main // jetzt wird auf einmal die Main nicht mehr gefunden!
cd lib
jar -xf jdom.jar
find -iname JDOMException.*
./lib/org/jdom/JDOMException.class // ist vorhanden

Also ich bin wirklich mit meinem Latein am Ende. Wie kann ich bitte diese Klasse ausführen? 🙂

P.S.: Ich wollte das jarfile auch als Anhang hinzufügen aber ich bekam die Meldung "Ihr Seitenaufruf konnte aufgrund eines fehlenden Securitytokens nicht verarbeitet werden.".
P.P.S.: In Eclipse funktioniert es tadellos, nachdem man die Jars zum Buildpath hinzufügt.
 
Zuletzt bearbeitet:
Hi,

normalerweise schaut Java nach den LIBS unter /libs ausgehend von der Ort deines Jars.
Wenn du deine JAR Datei extrahierst, findest du deine Manifest-Datei.

Class-Path: /lib/deine_lib_dateien

Sprich du musst entweder diese Struktur nachbilden oder die Manifestdatei anpassen.

Da du ja deine Libs im JAR File hast, extrahiert er zwar das Jar file, findet aber trotzdem die Struktur nicht. Das ist immer so ein mist.

Meine JAR File liefer ich als Zip-File aus. Sprich:
MyApplication.zip
|_> MeinJarFile.jar
|_> lib/meine ganzen Lib files

Ich habe schon mit dem Classpath und was weiß ich allem herumgespielt. Aber die einzige Struktur die überall funktioniert war das Zip file.

Falls du es herausfindest, poste doch bitte die Antwort 🙂

GRüße
Felix
 
Es geht leider immer noch nicht :-(

Java:
java -jar subclasses.jar
java -jar subclasses.jar -cp libs/jdom.jar
java -jar subclasses.jar -cp libs
java -jar subclasses.jar -cp libs/*
java -jar subclasses.jar -cp "libs"
java -jar subclasses.jar -cp "libs/*"

Egal was ich mache, ich bekomme immer die gleichen Fehler wie oben.

Jetzt habe ich auch das Manifest angepasst zu:

Java:
Manifest-Version: 1.0

Main-Class: Main
Class-Path: lib/*
(inklusive Leerzeile am Ende)

Aber das hilft auch nichts. Wenn ich allerdings folgendes eingebe:

Java:
java -cp lib/* -jar subclasses.jar

Dann bekomme ich nun einen anderen Fehler:

Java:
Exception in thread "main" java.lang.NoClassDefFoundError: lib/collections-generic-4/01/jar
Caused by: java.lang.ClassNotFoundException: lib.collections-generic-4.01.jar
	at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: lib/collections-generic-4.01.jar. Program will exit.

Wobei mir jedoch völlig schleierhaft ist, warum Java in meinen Libraries nach Mainklassen sucht...
 
Zuletzt bearbeitet:
Da scheint aber noch etwas anderes schief zu laufen. Die Exception sagt ja, dass nach einer Main-Class mit dem Namen lib/collections-generic-4.01.jar gesucht wird. Das stimmt ja überhaupt nicht.

Wenn du folgende Struktur hast:

Code:
.
├── libs
│   ├── lib1.jar
│   └── lib2.jar
└── program.jar

Solltest du das Programm entweder so starten können (kein Class-Path Eintrag im Manifest):

Code:
java -cp libs/* -jar program.jar

Oder so (Class-Path Eintrag im Manifest):

Code:
java -jar program.jar

Achte darauf, dass die Manifest Datei immer mit einer leeren letzten Zeile enden muss. Also in der letzten Zeile mit Text noch mal [ENTER] drücken.

Schau auch mal mit einem Entpacker in die program.jar rein, ob alles wirklich richtig ist. Richtiger Inhalt im Manifest und alle Klassen enthalten...
 
Ich hab 10 mal nachgesehen, es stimmt alles. Ich bin komplett ratlos. Erstens wird der Classpath in der Manifestdatei komplett ignoriert und zweitens kommt mit classpathoption dieser merkwürdige Fehler. Ich hänge mal die Datei an, vielleicht werdet ihr ja daraus schlauer...

Der lib ordner wurde aus der jar extrahiert und danebengelegt, wie von hexx beschrieben.

Edit: Das Anhängen geht schon wieder nicht "fehlender Securitytoken".

Hier also die Struktur:

Code:
.
├── lib
│   ├── lib1.jar
│   └── lib2.jar
└── test.jar

Code:
test.jar
├── META-INF
│     └── MANIFEST.MF
└── Main.class

MANIFEST.MF
Code:
Manifest-Version: 1.0

Main-Class: Main
Class-Path: lib/*

LEERZEILE
 
Zuletzt bearbeitet:
probiers mal mit der Manifest:

Code:
Manifest-Version: 1.0
Main-Class: DeineMain
Class-Path: lib/jdom.jar .

mehrere jars einfach hintereinaner:
Code:
Manifest-Version: 1.0
Main-Class: DeineMain
Class-Path: lib/jar1.jar lib/jar2.jar lib/jar3.jar .


edit: dann halt einfach mit
Code:
java -jar deinejar.jar
ausführen (ich hab jetzt aber zugegeben nicht den ganzen thread gelesen 🙂)
 
Es geht!! Warum kann mir das keiner 3 Wochen früher sagen, dass der Classpath so beschränkt ist...

Code:
Manifest-Version: 1.0

Main-Class: Main

Class-Path: lib/arq-2.8.8.jar lib/collections-generic-4.01.jar lib/commons-io-2.0.1.jar lib/icu4j-3.4.4.jar lib/iri-0.8.jar lib/jdom.jar lib/jena-2.6.4.jar lib/jena-2.6.4-tests.jar lib/junit-4.5.jar lib/log4j-1.2.14.jar lib/lucene-core-2.3.1.jar lib/slf4j-api-1.5.8.jar lib/slf4j-log4j12-1.5.8.jar lib/stax-api-1.0.1.jar lib/wstx-asl-3.2.9.jar lib/xercesImpl-2.7.1.jar .

P.S.: Ich lass es noch mal kurz offen falls noch jemand was dazu sagen möchte.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben