lundi 1 juin 2015

Interpreter-Fehler NoClassDefFoundError - einfachstes Programm - komm nicht drauf!!!

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:

Java Code:

  1. public class JTest1 {
  2.  
  3. public static void main(String[] args) {
  4. int l = args.length;
  5. if (l==0) {
  6. System.out.println("Ohne Parameter arbeite ich nicht!");
  7. } else {
  8. for (int i=0; i<l; i++) {
  9. System.out.println("<" + i + "> " + args[i]);
  10. }
  11. }
  12. }
  13. }


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)

*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:

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
auszuführen, wirft es besagten NoClassDefFoundError aus:

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


Interpreter-Fehler NoClassDefFoundError - einfachstes Programm - komm nicht drauf!!!

0 commentaires:

Enregistrer un commentaire