Java noClassDefFound

Hallo,

Nach einer Neuinstallation von Windows und jdk1.6.0 bekomme ich diese „java.lang.noClassDefFoundError:“. Ich vermute das dass an den Umgebungsvariablen liegt.

Die Befehle „java“ und „javac“ werden ausgeführt, erst nach dem compilieren der Quelltexte, die richtig geschrieben sind und und vor der neuinstallation ausführbar waren kommt die Fehlermeldung.

Die Systemvariablen PATH und CLASSPATH sind beide wie folgt gesetzt:

C:\Program Files\Java\jdk1.6.0\bin

was mache ich falsch?

Die Systemvariablen PATH und CLASSPATH sind beide wie folgt
gesetzt:

C:\Program Files\Java\jdk1.6.0\bin

was mache ich falsch?

Ich glaube, Du musst noch die JRE in Classpath aufnehmen. Die Klassen sind in \jre\lib\rt.jar definiert.

Robert

Hallo,

bei einem Tippfehler (Groß/Kleinschreibung) müsstest du den gleichen Fehler bekommen.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Die CLASSPATH lautet jetzt wie folgt:

C:\Program Files\Java\jdk1.6.0\bin; C:\Program Files\Java\jre1.6.0\lib\rt.jar

nützt nichts.
Auch wenn ich die PATH auf jre umstelle -auch nichts.

Ausführen jeder java-Anwedung endet mit dem Error. Kann das an etwas anderem liegen?

-Cihan

Ja dessen bin ich mir bewusst. Die Ursachen scheinen an etwas anderem zu liegen.

Gruß

Auch Hallo.

Nach einer Neuinstallation von Windows und jdk1.6.0 bekomme
ich diese „java.lang.noClassDefFoundError:“. Ich vermute das
dass an den Umgebungsvariablen liegt.

Warum?

Die Befehle „java“ und „javac“ werden ausgeführt, erst nach
dem compilieren der Quelltexte, die richtig geschrieben sind
und und vor der neuinstallation ausführbar waren kommt die
Fehlermeldung.

Für mich nochmal zu mitschreiben: Du kompilierst die Quellen mit javac und willst sie danach mit java ausführen, richtig?

Die Systemvariablen PATH und CLASSPATH sind beide wie folgt
gesetzt:
C:\Program Files\Java\jdk1.6.0\bin

Eigentlich unnötig das in die CLASSPATH-Variable reinzuschreiben. Die Runtime des JDK/JRE ist eigentlich immer dabei, sonst würde nämlich gar nix laufen.

Zuerst mal würde ich JAVA_HOME setzen. Das wäre bei dir dann wohl das
C:\Program Files\Java\jdk1.6.0 Verzeichnis.

Danach musst du mal sehen, ob beim Aufruf von java der übergebene Klassenpfad stimmt. Falls du nämlich keinen übergibst nimmt er das, was in der CLASSPATH Variable drinsteht; und da ist nur das bin-Verzeichnis drin.
Also:
Entweder du setzt in die CLASSPATH Variable den Pfad zu deinen Klassen der Anwendung ein,
oder du übergibst beim java Aufruf den Klassenpfad der Anwendung mit (java -cp Verzeichnis-zu-deinen-Klassen name.der.klasse.mit.Main).

API-Zitat zur NoClassDefFoundError:
„The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.“
Heißt auf deutsch, deine Klassen lassen sich wohl kompilieren, allein der java Aufruf läuft wohl ins leere, aus den genannten Gründen.

Viel Erfolg noch,
Chris

Hi Chris,

Ich habe über google ähnliche Problemfälle gefunden und demnach mit den Umgebungsvariablen rumhantiert. Kann sein dass ich da was unnötig verpuscht habe und da ich mir keine anderen Problem erdenken kann [bin noch ein Laie in Java] gehe ich von den Umgebungsvariablen aus.

Wie du auch richtig verstanden hast bekomme ich die Fehlermeldung beim ausführen von Java, nachdem ich den Code compiliert habe.

Anfänglich war ich auch der Annahme keine Einträge in den Umgebungsvariablen ergänzen zu müssen, den JAVA_HOME hatte ich schon gesetz, das alleine hat nichts verändert.

Also:
Entweder du setzt in die CLASSPATH Variable den Pfad zu deinen
Klassen der Anwendung ein,

Was heisst genau Pfad der Klassen der Anwendung?

oder du übergibst beim java Aufruf den Klassenpfad der
Anwendung mit (java -cp Verzeichnis-zu-deinen-Klassen
name.der.klasse.mit.Main).

Also du meinst bei jedem Aufruf von Java?

Gruß

Hallo.

Wie du auch richtig verstanden hast bekomme ich die
Fehlermeldung beim ausführen von Java, nachdem ich den Code
compiliert habe.

OK. Das heißt, es läßt sich fehlerfrei kompilieren?! Wie sieht denn dabei dein javac-Aufruf aus?

Anfänglich war ich auch der Annahme keine Einträge in den
Umgebungsvariablen ergänzen zu müssen, den JAVA_HOME hatte ich
schon gesetz, das alleine hat nichts verändert.

An sich stimmt das auch. JAVA_HOME sollte man einfach nur gesetzt haben. Erleichtert einem ab und an die Arbeit.

Also:
Entweder du setzt in die CLASSPATH Variable den Pfad zu deinen
Klassen der Anwendung ein,

Was heisst genau Pfad der Klassen der Anwendung?

Nun, deine Java-Anwendung liegt doch irgendwo in nem Verzeichnis X. Wo liegen deine Klassen? Liegen sie mit im Verzeichnis X? In einem Unterverzeichnis von X/Y? Oder in einem jar verpackt?

oder du übergibst beim java Aufruf den Klassenpfad der
Anwendung mit (java -cp Verzeichnis-zu-deinen-Klassen
name.der.klasse.mit.Main).

Also du meinst bei jedem Aufruf von Java?

Ja, genau. Wenn du weißt, wo deine Klassen liegen musst du nur noch den Pfad entsprechend übergeben.

java -cp X/Y meine.klasse.Main, oder
java -jar meinJar.jar meine.klasse.Main.
Kann man auch kombinieren, je nachdem wie es halt notwending ist.

Gruß,
Chris

Der Aufruf von „javac“ listet mir mögliche Optionen mit dem Befehl aus [-g, -nowarn etc.].

Nun, deine Java-Anwendung liegt doch irgendwo in nem

Verzeichnis X. Wo liegen deine Klassen? Liegen sie mit im
Verzeichnis X? In einem Unterverzeichnis von X/Y? Oder in
einem jar verpackt?

Meine Java-Anwendung liegt auf C:\Program Files\Java. Vielleicht habe ich hier ein Verständnisproblem denn unter einer Klasse versteh’h sowas im Code;

class X/Y
{
public static void main(String[] args)…

Ich habe immer einen Code mit der Endung *.java geschrieben und nach dem compilieren wurde mir die *.class Datei im selben Ordner erzeugt. Meinst du diesen Verzeichnis? Oder sollte ich noch von anderen Klassen bescheid wissen? Eine *.jar Datei ist nicht vorhanden.

Einen java Befehl mit einer Option [wie -cp] habe ich bis heute nicht gebraucht. Dass lässt sich mit einem Eintag in den CLASSPATH vermeiden, oder?

Gruß

Der Aufruf von „javac“ listet mir mögliche Optionen mit dem
Befehl aus [-g, -nowarn etc.].

Ja, das stimmt. Eigentlich wollte ich aber sehen, wie du für deine Anwendung den javac-Aufruf machst. Ich wollte nur wissen, ob du noch zusätzlich Klassen oder jars einbindest.

Nun, deine Java-Anwendung liegt doch irgendwo in nem

Verzeichnis X. Wo liegen deine Klassen? Liegen sie mit im
Verzeichnis X? In einem Unterverzeichnis von X/Y? Oder in
einem jar verpackt?

Meine Java-Anwendung liegt auf C:\Program Files\Java.
Vielleicht habe ich hier ein Verständnisproblem denn unter
einer Klasse versteh’h sowas im Code;

class X/Y
{
public static void main(String[] args)…

Ich habe immer einen Code mit der Endung *.java geschrieben
und nach dem compilieren wurde mir die *.class Datei im selben
Ordner erzeugt. Meinst du diesen Verzeichnis? Oder sollte ich
noch von anderen Klassen bescheid wissen? Eine *.jar Datei ist
nicht vorhanden.

Ok, damit ist meine Frage von oben wohl auch beantwortet.
Nein, von anderen Klassen müsstest du dann nicht mehr wissen.
Wenn deine Klassen nur in diesem Verzeichnis liegen, ist das OK.

Einen java Befehl mit einer Option [wie -cp] habe ich bis
heute nicht gebraucht. Dass lässt sich mit einem Eintag in den
CLASSPATH vermeiden, oder?

Da deine kompilierten Klassen nur in einem Verzeichnis zu liegen scheinen, bräuchtest du -cp auch nicht.

Nun mal konkret: Wie heißt deine Klasse? Was tippst du in die Konsole ein um sie zu kompilieren und was um die Anwendung zu starten?

beispiel:

meine Klasse heisst „Sum“ [Dateiname Sum.java] und liefert mir die Summe der nat. Zahlen von 1 bis n:

class Sum
{
public static void main(String[] args)
{

int n;
int s;
int i;


System.out.println(s);
}
}

Gebe Folgende Befehle ein:

-zum compilieren: javac Sum.java
-zum ausführen: java Sum

Ergebnis ist die Fehlermeldung.

Gebe Folgende Befehle ein:

-zum compilieren: javac Sum.java
-zum ausführen: java Sum

Ergebnis ist die Fehlermeldung.

Eigentlich müsste das dann schon laufen. Wenn du zwischen javac und java nicht das Verzeichnis wechselt, müsste es gehen.

Ich habe versucht, das Problem bei mir rekonstruieren. Ich bekomme den Fehler nur, wenn ich das Verzeichnis wechsle oder mich beim Klassenname vertippe.

Bist du beim Aufruf von java im richtigen Verzeichnis? In dem wo die Klasse (Sum.class) drinliegt?

1 Like

Ja beim vertippen war bislang bei mir auch der gleiche Fehler der Fall.

Ich hab die Sum.classs Datei gelöscht und nochmals erzeugen lassen. Es erscheint in dem selben Ordner wie Sum.java und die Die Fehlermeldung wird weiterhin angezeigt.

Ich habe gelesen das bei jemanden die gleiche Fehlermeldung behoben wurde in dem er eine sog. „tomcat“ dienst bei seinem Rechner abgeschaltet hat. Kann das an sowas liegen? Ich wüsste nicht an welchen Dienst das scheitern könnte…

Sodala, da haben wir doch den Fehler.

Ich habe die CLASSPATH-Variable mal auf mein JDK gesetzt und zack, gehts nicht mehr.

Also: Die CLASSPATH-Varaible löschen oder auf das Verzeichnis deiner Anwendung richten. Auf jeden Fall NICHT das bin-Verzeichnis des JDKs.

Dann müsste es gehen.

1 Like

hurra!!

Ich hatte schon davor alle möglichen Kombinationen mit PATH und CLASSPATH /jdk/jre versucht aber das löschen habe ich mich nicht getraut.

CLASSPATH ungeändert --> nichts
CLASSPATH gelöscht --> es funzt!!

Manches kann so simple sein…

Danke für die Zeit und Mühe!

Hurra!!
Ich verstehe nicht wie diese CLASSPATH Eintrag entstanden ist. Kann das ein überbleibsel von java 1.5 sein, der ja meines Wissens nach, unter „normalen“ Umständen auch keinen Eintrag braucht?

Danke auf jedenfall noch einmal!

-Cihan

Ich verstehe nicht wie diese CLASSPATH Eintrag entstanden ist.
Kann das ein überbleibsel von java 1.5 sein, der ja meines
Wissens nach, unter „normalen“ Umständen auch keinen Eintrag
braucht?

Das kann ich dir auch nicht sagen, wo der Eintrag bei dir herkommt. Von der Javainstallation wohl kaum, die setzt keine Variablen.

Weiß nicht, wofür man diese Variable wirklich braucht. Bis jetzt gings auch immer ohne. Und man sieht ja, bringt einem manchmal auch nur Ärger :wink:

Also am Besten weglassen und, falls notwendig, den Klassenpfad direkt beim java-Aufruf übergeben.

Dann noch viel Erfolg weiterhin,
Chris

Befürchte dass ich anfänglich versehens die original CLASSPATH beim rumhantieren umgeändert habe, falls es dem so ist, wäre ein Wissenserweiterung bzgl. der Umgebungsvariablen sinvoll, damit ich „mögliche“ konsequenzen vorbeugen kann.

Also am Besten weglassen und, falls notwendig, den Klassenpfad
direkt beim java-Aufruf übergeben.

Ja, diese Eigenschaft sollte ich mir am besten gleich aneignen :smile:

Viel Erfolg ebenfalls!