Liebe Leute von Java!
Es tut mir echt leid: Es muss irgend was so simples sein, dass es keine passende HIlfestellung aus den Unmengen an NoClassDefFoundError-Beiträgen gibt - die sind alle schon zu speziell. Und doch komme ich nicht drauf. Hier ein einfachstes Programm: Eine einzige Klasse mit einer einzigen main-Methode:
Die Quelldatei heißt JTest1.java, wie die Klasse *check*; sie lässt sich mit javac compilieren und mit java fehlerfrei ausführen *check*; die main-Methode muss daher richtig implementiert sein und wenn ich oben schaue ... *check*. Die Probleme beginnen beim Erstellen eines ausführbaren jar-Archivs:
Ich binfinde mich in meinem Homeordner (Linux). Der Binärcode (JTest1.class) liegt in einem Unterverzeichnus "test1". Im Homeordner habe ich eine Datei "manifest.txt" angelegt mit folgendem Inhalt:
... selbstverständlich mit der geforderten Zeilenschaltung; schreibfehler sehe ich keinen *check*. Ohne Leerzeichen nach dem Doppelpunkt gibt's einen anderen Fehler - sollte also so passen, wie oben dargestellt *check*.
Ich bin also in meinem Homeordner und gebe über die Shell folgende Anweisung ein:
Die Ausgabe liefert nix Ungewöhnliches:
*check*.
Das Archiv wird angelegt, in dem sich erwartungsgemäß der Ordner "test1" befindet, in dem wiederum die JTest1.class mit der main-Methode liegt. außerdem gibt es einen Ordner "META-INF" in dem sich die Datei "MANIFEST.MF" befindet mit dem erwarteten Inhalt:
Versuche ich nun, mit
auszuführen, wirft es besagten NoClassDefFoundError aus:
Ich bin alles durchgegangen, was irgendwo an möglichen Fehlerquellen beschrieben wird - habe alles mögliche probiert, hab mich insbesondere mit der manifest.txt gespielt (in Unterordner test1 speichern, den Main-Class-Pfad auch ohne Angabe von "test1.", Kombinationen aus beidem). Nix funzt.
Was habe ich übersehen???
Herzlichen Gruß
Goldi
Es tut mir echt leid: Es muss irgend was so simples sein, dass es keine passende HIlfestellung aus den Unmengen an NoClassDefFoundError-Beiträgen gibt - die sind alle schon zu speziell. Und doch komme ich nicht drauf. Hier ein einfachstes Programm: Eine einzige Klasse mit einer einzigen main-Methode:
Java:
public class JTest1 {
public static void main(String[] args) {
int l = args.length;
if (l==0) {
System.out.println("Ohne Parameter arbeite ich nicht!");
} else {
for (int i=0; i<l; i++) {
System.out.println("<" + i + "> " + args[i]);
}
}
}
}
Die Quelldatei heißt JTest1.java, wie die Klasse *check*; sie lässt sich mit javac compilieren und mit java fehlerfrei ausführen *check*; die main-Methode muss daher richtig implementiert sein und wenn ich oben schaue ... *check*. Die Probleme beginnen beim Erstellen eines ausführbaren jar-Archivs:
Ich binfinde mich in meinem Homeordner (Linux). Der Binärcode (JTest1.class) liegt in einem Unterverzeichnus "test1". Im Homeordner habe ich eine Datei "manifest.txt" angelegt mit folgendem Inhalt:
Code:
Main-Class: test1.JTest1
... selbstverständlich mit der geforderten Zeilenschaltung; schreibfehler sehe ich keinen *check*. Ohne Leerzeichen nach dem Doppelpunkt gibt's einen anderen Fehler - sollte also so passen, wie oben dargestellt *check*.
Ich bin also in meinem Homeordner und gebe über die Shell folgende Anweisung ein:
Code:
jar -cvfm mytest1.jar manifest.txt test1
Die Ausgabe liefert nix Ungewöhnliches:
Code:
Manifest wurde hinzugefügt
test1/ wird hinzugefügt(ein = 0) (aus = 0)(0 % gespeichert)
test1/JTest1.class wird hinzugefügt(ein = 754) (aus = 481)(36 % verkleinert)
test1/JTest1.java wird hinzugefügt(ein = 266) (aus = 183)(31 % verkleinert)
Das Archiv wird angelegt, in dem sich erwartungsgemäß der Ordner "test1" befindet, in dem wiederum die JTest1.class mit der main-Methode liegt. außerdem gibt es einen Ordner "META-INF" in dem sich die Datei "MANIFEST.MF" befindet mit dem erwarteten Inhalt:
Code:
Manifest-Version: 1.0
Created-By: 1.7.0_79 (Oracle Corporation)
Main-Class: test1.JTest1
Versuche ich nun, mit
Code:
java -jar mytest1.jar
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: test1/JTest1 (wrong name: JTest1)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
Ich bin alles durchgegangen, was irgendwo an möglichen Fehlerquellen beschrieben wird - habe alles mögliche probiert, hab mich insbesondere mit der manifest.txt gespielt (in Unterordner test1 speichern, den Main-Class-Pfad auch ohne Angabe von "test1.", Kombinationen aus beidem). Nix funzt.
Was habe ich übersehen???
Herzlichen Gruß
Goldi