Warum erhalte ich einen NoClassDefFoundError in Java?

Ich erhalte einen NoClassDefFoundError, wenn ich meine Java-Anwendung ausführe. Was ist normalerweise die Ursache dafür?

Es ist zwar möglich, dass dies auf eine Abweichung des Klassenpfads zwischen Kompilier- und Laufzeit zurückzuführen ist, aber es ist nicht unbedingt wahr.

In diesem Fall ist es wichtig, zwei oder drei verschiedene Ausnahmen im Kopf zu behalten:

  1. java.lang.ClassNotFoundException Diese Ausnahme zeigt an, dass die Klasse nicht auf dem Klassenpfad gefunden wurde. Dies bedeutet, dass wir versucht haben, die Klassendefinition zu laden, und die Klasse nicht im Klassenpfad vorhanden war.

  2. java.lang.NoClassDefFoundError Diese Ausnahme zeigt an, dass die JVM in ihrer internen Klassendefinitionsdatenstruktur nach der Definition einer Klasse gesucht und sie nicht gefunden hat. Dies ist etwas anderes als die Aussage, dass die Klasse nicht aus dem Klassenpfad geladen werden konnte. Normalerweise bedeutet dies, dass wir zuvor versucht haben, eine Klasse aus dem Klassenpfad zu laden, dies aber aus irgendeinem Grund fehlgeschlagen ist - jetzt versuchen wir, die Klasse erneut zu verwenden (und müssen sie daher laden, da es beim letzten Mal fehlgeschlagen ist), aber wir werden nicht einmal versuchen, sie zu laden, da das Laden zuvor fehlgeschlagen ist (und wir vernünftigerweise vermuten, dass es erneut fehlschlagen würde). Der frühere Fehler könnte eine ClassNotFoundException oder ein ExceptionInInitializerError sein (was auf einen Fehler im statischen Initialisierungsblock hinweist) oder eine beliebige Anzahl anderer Probleme. Der Punkt ist, dass ein NoClassDefFoundError nicht unbedingt ein Klassenpfadproblem ist.

Kommentare (12)
Lösung

Dies wird verursacht, wenn eine Klassendatei, von der Ihr Code abhängt, zur Kompilierzeit vorhanden ist, aber zur Laufzeit nicht gefunden wird. Suchen Sie nach Unterschieden in den Klassenpfaden zur Kompilierzeit und zur Laufzeit.

Kommentare (7)

Ich habe festgestellt, dass ich manchmal einen NoClassDefFound-Fehler erhalten, wenn Code mit einer inkompatiblen Version der Klasse zur Laufzeit gefunden kompiliert wird. Der spezifische Fall, an den ich mich erinnere, ist mit der Apache-Axis-Bibliothek. Es gab tatsächlich 2 Versionen auf meinem Laufzeit-Klassenpfad und es wurde die veraltete und inkompatible Version abgeholt und nicht die richtige, was einen NoClassDefFound-Fehler verursacht. Dies war in einer Befehlszeile app, wo ich einen Befehl ähnlich wie diese verwendet wurde.

set classpath=%classpath%;axis.jar

Ich konnte es dazu bringen, die richtige Version zu wählen, indem ich:

set classpath=axis.jar;%classpath%;
Kommentare (2)