Ich bekomme eine NoClassDefFoundError
wenn ich meine Java-Anwendung ausführe. Was ist typischerweise die Ursache dafür?
Dies ist falsch. A fehlt Ressource führt nicht zu dieser Fehlermeldung. Sie erhalten ihn nur, wenn ein Klasse fehlt.
Ich bekomme eine NoClassDefFoundError
wenn ich meine Java-Anwendung ausführe. Was ist typischerweise die Ursache dafür?
Update [https://www.infoq.com/articles/single-file-execution-java11/]:
In Java SE 11 haben Sie die Möglichkeit, eine einzelne Quellcodedatei direkt zu starten, ohne Zwischenkompilierung. Nur zu Ihrer Bequemlichkeit, so dass Neulinge wie Sie nicht javac + java ausführen müssen (natürlich, und sie verwirrt zurücklassen, warum das so ist).
NoClassDefFoundError
kann auch auftreten, wenn ein statisch Initialisierer versucht, ein Ressourcenbündel zu laden, das zur Laufzeit nicht verfügbar ist, z. B. eine Eigenschaftsdatei, die die betroffene Klasse aus dem META-INF
Verzeichnis, ist aber nicht dort. Wenn Sie sich nicht NoClassDefFoundError
können Sie manchmal nicht den vollständigen Stack-Trace sehen; um dies zu umgehen, können Sie vorübergehend eine catch
Klausel für Throwable
:
try {
// Statement(s) that cause(s) the affected class to be loaded
} catch (Throwable t) {
Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}
Dies ist falsch. A fehlt Ressource führt nicht zu dieser Fehlermeldung. Sie erhalten ihn nur, wenn ein Klasse fehlt.
@StephenC Vielleicht sollte ich diesen Teil mehr betonen, aber ich schrieb for example a properties file that the affected class tries to load from the META-INF directory
. Dies ist mir tatsächlich passiert, und ich konnte das Problem lösen. NoClassDefFoundError
indem Sie die fehlende Eigenschaftsdatei hinzufügen. Ich habe diese Antwort genau deshalb hinzugefügt, weil man diesen Fehler unter den genannten Umständen nicht erwarten würde.
Sie haben dann etwas sehr Wichtiges in Ihrer Erklärung übersehen, denn die einzige Möglichkeit, wie eine fehlende Ressourcendatei könnte Diese Ausnahme wird ausgelöst, wenn Sie versuchen, die Ressourcendatei in einem static
Initialisierung ... was eine ungeprüfte Ausnahme auslöste und die Klasse init zum Scheitern brachte. Jede ungeprüfte Ausnahme, die sich von der statischen Initialisierung ausbreitet, würde dies tun.
In meinem Fall erhielt ich diese Fehlermeldung aufgrund einer Unstimmigkeit in den JDK-Versionen. Als ich versuchte, die Anwendung über Intelij auszuführen, funktionierte sie nicht, aber wenn ich sie über die Befehlszeile ausführte, funktionierte sie. Das liegt daran, dass Intelij versuchte, die Anwendung mit dem eingestellten Java 11 JDK auszuführen, aber auf der Kommandozeile wurde sie mit dem Java 8 JDK ausgeführt. Nachdem ich diese Einstellung unter Datei > Projektstruktur > Projekteinstellungen > Projekt-SDK geändert hatte, funktionierte es bei mir.
Ich bekam diesen Fehler, wenn ich Maven Abhängigkeit von einem anderen Modul zu meinem Projekt hinzufügen, das Problem wurde schließlich durch Hinzufügen gelöst -Xss2m
in der JVM-Option meines Programms (seit JDK5.0 ist sie standardmäßig ein Megabyte groß). Es wird angenommen, dass das Programm nicht genug Stack hat, um die Klasse zu laden.
Ich habe NoClassDefFound-Fehler erhalten, wenn ich eine Klasse auf der Registerkarte "Order and Export" im Java Build Path meines Projekts nicht exportiert habe. Stellen Sie sicher, dass Sie auf der Registerkarte "Bestellung und Export" ein Häkchen bei allen Abhängigkeiten setzen, die Sie dem Build-Pfad des Projekts hinzufügen. Siehe Eclipse-Warnung: XXXXXXXXXXX.jar wird nicht exportiert oder veröffentlicht. Runtime ClassNotFoundExceptions können die Folge sein .
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
1 Stimmen
Ich glaube, es kann auch passieren, wenn Sie Ihr Java-Programm nicht mit der richtigen Syntax ausführen. Zum Beispiel müssen Sie Ihre Klasse aus dem Root-Bin-Ordner mit dem vollständigen Paketnamen aufrufen (z. B. my.package.myClass). Ich würde genauer sein, wenn ich könnte, aber ich bin kein großer Java-Kenner. Ich kann mich nur daran erinnern, dass ich das ein paar Mal vermasselt habe.