Ich bekomme eine NoClassDefFoundError
wenn ich meine Java-Anwendung ausführe. Was ist typischerweise die Ursache dafür?
"EMF" ? Meinen Sie _" MEF "_ ?
Ich bekomme eine NoClassDefFoundError
wenn ich meine Java-Anwendung ausführe. Was ist typischerweise die Ursache dafür?
ClassNotFoundException vs NoClassDefFoundError
Statisches vs. dynamisches Laden von Klassen
Static(Implicit) class loading
- Ergebnis einer Referenz, Instanziierung oder Vererbung.
MyClass myClass = new MyClass();
Dynamic(Explicit) class loading
ist das Ergebnis von Class.forName(), loadClass(), findSystemClass()
MyClass myClass = (MyClass) Class.forName("MyClass").newInstance();
Jede Klasse hat eine ClassLoader
die die loadClass(String name);
Deshalb
explicit class loader uses implicit class loader
NoClassDefFoundError
ist ein Teil von explicit class loader
. Es ist Error
um zu gewährleisten, dass diese Klasse während der Kompilierung vorhanden war, aber jetzt (zur Laufzeit) nicht vorhanden ist.
ClassNotFoundException
ist ein Teil von implicit class loader
. Es ist Exception
elastisch zu sein mit Szenarien, in denen es zusätzlich verwendet werden kann - zum Beispiel Reflexion.
Bei generiertem Code (EMF usw.) können zu viele statische Initialisierer vorhanden sein, die den gesamten Stapelplatz verbrauchen.
Siehe Stack Overflow Frage Wie kann man die Größe des Java-Stacks erhöhen? .
Ich bekam NoClassDefFoundError beim Versuch, eine Anwendung auf Tomcat/JBOSS-Servern einzusetzen. Ich habe mit verschiedenen Abhängigkeiten gespielt, um das Problem zu lösen, erhielt aber immer wieder den gleichen Fehler. Ich habe alle javax.*-Abhängigkeiten in der pom.xml markiert, und die war-Datei hatte buchstäblich keine Abhängigkeiten. Trotzdem tauchte das Problem immer wieder auf.
Schließlich wurde mir klar, dass src/main/webapps/WEB-INF/ Klassen hatte Klassen Ordner, der in mein War kopiert wurde, so dass anstelle von kompilierten Klassen, diese Klassen kopiert wurden, daher keine Abhängigkeit Änderung wurde das Problem zu lösen.
Seien Sie daher vorsichtig, wenn eine zuvor erhobene Daten wird kopiert. Nach dem Löschen des Klassenordners und der Neukompilierung hat es funktioniert.
In meinem Fall war das Problem die Unfähigkeit von Eclipse, zwischen zwei verschiedenen Kopien desselben Projekts zu unterscheiden. Ich habe eine auf dem Stamm (SVN-Versionskontrolle) und die andere in einem Zweig zu einer Zeit arbeiten gesperrt. Ich habe eine Änderung in der Arbeitskopie als JUnit-Testfall ausprobiert, bei dem eine private innere Klasse als öffentliche Klasse extrahiert wurde, und während das funktionierte, habe ich die andere Kopie des Projekts geöffnet, um mir einen anderen Teil des Codes anzusehen, der geändert werden musste. An einem bestimmten Punkt wird die NoClassDefFoundError
erschien und beschwerte sich, dass die private innere Klasse nicht vorhanden sei; ein Doppelklick auf den Stack-Trace brachte mich zu der Quelldatei in der falschen Projektkopie.
Das Schließen der Stammkopie des Projekts und das erneute Ausführen des Testfalls hat das Problem beseitigt.
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.