677 Stimmen

Warum erhalte ich einen NoClassDefFoundError in Java?

Ich bekomme eine NoClassDefFoundError wenn ich meine Java-Anwendung ausführe. Was ist typischerweise die Ursache dafür?

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.

4voto

yoAlex5 Punkte 20661

ClassNotFoundException vs NoClassDefFoundError

[ClassLoader]

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.

3voto

Aykut Kllic Punkte 848

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? .

0 Stimmen

"EMF" ? Meinen Sie _" MEF "_ ?

2 Stimmen

Nö. EMf als Eclipse Modeling Framework. In der Automobilindustrie kann dieser Fehler auftreten, wenn der generierte Code ausgeführt wird.

1voto

priyanka_rao Punkte 435

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.

1voto

manuelvigarcia Punkte 1138

Zwei verschiedene Checkout-Kopien desselben Projekts

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.

1voto

Michael Punkte 646

Ich habe mein Problem behoben, indem ich die preDexLibraries für alle Module deaktiviert habe:

dexOptions {
        preDexLibraries false
        ...

CodeJaeger.com

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.

Powered by:

X