Warum bekomme ich einen NoClassDefFoundError in Java?
Ich bin immer ein NoClassDefFoundError
wenn ich meine Java-Anwendung. Was ist normalerweise die Ursache dieser?
Ich glaube, es kann auch passieren, wenn man nicht laufen Ihre java-Programm mit der korrekten syntax. Zum Beispiel, haben Sie zu rufen, Ihre Klasse aus dem root-Ordner bin mit den vollständigen package-Namen (dh. meine.Paket.myClass). Ich würde sein mehr spezifisch, wenn ich könnte, aber ich bin nicht viel von einem java-Typ. Ich erinnere mich nur veräppeln dies ein paar mal.
Wir brauchen eine kanonische Frage, um die sich zahlreiche Dubletten auf. Warum kann das nicht sein?
Haben Sie als änderung der akzeptierten Antworten so, dass die, die die community findet mehr wertvoll ist an der Spitze?
stackoverflow.com/questions/33613857/...
Wir brauchen eine kanonische Frage, um die sich zahlreiche Dubletten auf. Warum kann das nicht sein?
Haben Sie als änderung der akzeptierten Antworten so, dass die, die die community findet mehr wertvoll ist an der Spitze?
stackoverflow.com/questions/33613857/...
InformationsquelleAutor John Meagher | 2008-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies wird verursacht, wenn es eine class-Datei, die Ihr code abhängt, und es ist zur compile-Zeit nicht gefunden aber zur Laufzeit. Schauen Sie für Unterschiede in Ihrem Aufbau und Laufzeit klassenpfade.
Ich hatte diesen Fehler einmal bei meinem server lief der Speicher bei einem Datei-upload. Jedes mal versuchte ich die hochladen, ich würde eine andere Fehlermeldung. Schließlich erzählte er mir ich habe nicht genug heap-Speicher.
Diese Antwort ist nicht unbedingt wahr und irreführend sein können, zu viele Menschen! Siehe die bessere Antwort von Jared unten.
Danke! Jared ' s Antwort mit 400+ upvotes ist Weg unten! Eine Antwort mit -4 bis(down?)Stimmen über ihm. Es ist etwas faul SO die Antwort der reihungslogik.
Dies ist eine lange-shot für jemanden, sondern, dass ich auf diese Fehler, da die Klasse in der Frage enthalten ein " = SimpleDateFormat, der initialisiert wurde mit einem ungültigen Zeichen (ich hatte ein T in der Mitte statt 'T').
InformationsquelleAutor Mocky
Während es ist möglich, dass dies wegen eines classpath-mismatch zwischen compile-time und run-time, es ist nicht unbedingt wahr.
Ist es wichtig, dass zwei oder drei unterschiedliche Ausnahmen, gerade in unserem Kopf, in diesem Fall:
java.lang.ClassNotFoundException
Diese Ausnahme zeigt an, dass die Klasse nicht gefunden wurde auf dem classpath. Dies bedeutet, dass wir versuchen, laden Sie die definition der Klasse, und die Klasse nicht vorhanden ist, auf dem Klassenpfad.java.lang.NoClassDefFoundError
Diese Ausnahme zeigt an, dass die JVM sah in seine internen class-definition-Daten-Struktur für die definition einer Klasse und finden es nicht. Dies ist anders als sagen, dass es nicht geladen werden konnte aus dem classpath. In der Regel zeigt dies, dass wir zuvor versucht eine Klasse zu laden aus dem classpath, aber es aus irgendeinem Grund fehlgeschlagen - jetzt versuchen wir, die Klasse wieder (und damit die Notwendigkeit, es zu laden, da scheiterte es letztes mal), aber wir sind nicht einmal versuchen, es zu laden, weil wir es nicht geschafft es zu laden früher (und vernünftigerweise vermuten, dass wir wieder scheitern). Die früheren Fehler könnte eine ClassNotFoundException oder eine ExceptionInInitializerError (was auf einen Fehler in der statischen Initialisierungs-block) oder eine beliebige Anzahl von anderen Problemen. Der Punkt ist, ein NoClassDefFoundError ist nicht unbedingt ein classpath-problem.Wenn ich bin immer
Error: Could not find or load main class
wird es eingestuft werden, unter die Kategorie der Fehler?Aus der Sprache Ausführlicher angeben, die Objekte der Verben "versuchen" 🙂
"konnte nicht gefunden oder geladen werden-main class" ist nicht eine Java-Ausnahme, es ist verursacht durch das Startprogramm (die prüft die JAR-und die Haupt-manifest-Attribut).
ClassNotFoundException wird auch ausgelöst, wenn in einer Klasse statische Initialisierung, wird ein Fehler oder eine exception. Sie sollten wahrscheinlich haben nahm einen anderen Namen für das Ereignis.
InformationsquelleAutor Jared
Hier der code zum veranschaulichen
java.lang.NoClassDefFoundError
. Bitte sehen Jared ' s Antwort für die ausführliche Erklärung.NoClassDefFoundErrorDemo.java
SimpleCalculator.java
Offensichtlich hat es irgendwo gespeichert sind, die nicht erfolgreich Klasse die Initialisierung des
SimpleCalculator
nach der Division durch null? Hat jemand einen Verweis auf die offizielle Dokumentation für dieses Verhalten?Nicht sicher, was Sie bedeuten, von einem 'reinen' NoClassDefFoundError. Das erste mal
new SimpleCalculator()
aufgerufen wird, erhalten Sie eine ExceptionInInitializerError mit verursacht durch von ArithmeticException. Das zweite mal, rufen Sienew SimpleCalculator()
erhalten Sie einen NoClassDefFoundError, reiner als jede andere. Der Punkt ist, Sie können eine NoClassDefFoundError aus einem anderen Grund als SimpleCalculator.class nicht auf dem Klassenpfad zur Laufzeit.InformationsquelleAutor xli
Habe ich festgestellt, dass manchmal bekomme ich eine NoClassDefFound error, wenn der code kompiliert wird mit einer inkompatiblen version der Klasse zur Laufzeit Gefundene. Die spezifische Instanz ich mich erinnere ist mit der apache axis-Bibliothek. Es waren tatsächlich 2 Versionen auf meiner runtime classpath und es war Kommissionierung bis die veraltete und inkompatible version und nicht die richtigen ein, wodurch eine NoClassDefFound error. Dies war in einer Kommandozeilen-app, wo ich mit einem Befehl ähnlich diesem.
War ich in der Lage, um es zu Holen die richtige version mit:
Wenn dies geschieht, wie, dann werde ich sagen, Java ist ein Durcheinander. +2, wenn dies der Fall ist. Kann nicht verifizieren aber. Wenn gefunden true do+1 wieder (In den Kommentaren)
InformationsquelleAutor shsteimer
NoClassDefFoundError In Java
Definition:
Java Virtual Machine nicht in der Lage zu finden, die einer bestimmten Klasse zur Laufzeit die zur compile-Zeit.
Wenn eine Klasse vorhanden war, die während der Kompilierung, aber nicht in java-classpath während der Laufzeit.
Beispiele:
Einem einfachen Beispiel NoClassDefFoundError ist Klasse gehört eine fehlende JAR-Datei oder JAR nicht Hinzugefügt wurde, die in classpath oder manchmal jar-name geändert wurde, indem jemand wie in meinem Fall, einer meiner Kollegen hat sich geändert tibco.jar in tibco_v3.jar und das Programm ist fehlerhaft mit java.lang.NoClassDefFoundError und ich fragten uns, was falsch ist.
Nur versuchen zu laufen, mit explizit -classpath-option mit der classpath-Sie denken, arbeiten und wenn es funktioniert, dann ist es sicher ein kurzes Zeichen, dass jemand das überschreiben java-classpath.
Mögliche Lösungen:
Ressourcen:
3 Wege zur Lösung NoClassDefFoundError
java.lang.NoClassDefFoundError Problem Muster
InformationsquelleAutor Virtual
Dies ist die beste Lösung die ich bisher gefunden.
Nehmen wir an, wir haben ein Paket namens
org.mypackage
mit den Klassen:und die Dateien, die dieses Paket gespeichert sind körperlich unter dem Verzeichnis
D:\myprogram
(auf Windows) oder/home/user/myprogram
(auf Linux).Die Datei-Struktur so Aussehen:
Wenn wir das aufrufen von Java, wir geben Sie den Namen der Anwendung, um zu laufen:
org.mypackage.HelloWorld
. Allerdings müssen wir auch sagen Java, wo nach den Dateien suchen und Verzeichnisse Definition-Paket. Also um das Programm zu starten, müssen wir den folgenden Befehl verwenden:InformationsquelleAutor Ram Patra
War ich mit Spring Framework mit Maven und gelöst dieser Fehler in meinem Projekt.
Gab es einen runtime error in der Klasse. Ich war das Lesen einer property als integer, aber wenn es Lesen Sie den Wert aus der property-Datei, deren Wert doppelt so hoch.
Frühjahr nicht geben mir eine volle stack-trace, der auf die Linie der runtime fehlgeschlagen.
Es sagte einfach nur:
NoClassDefFoundError
. Aber wenn ich es ausgeführt als native Java-Anwendung (Einnahme aus MVC), es gabExceptionInInitializerError
was war die wahre Ursache und die ist, wie ich Sie verfolgte den Fehler.@xli Antwort gab mir einen Einblick in das, was falsch in meinem code.
NoClassDefFoundError
wurde tatsächlich verursachtExceptionInInitalizerError
, die verursacht wurde durchDateTimeParseException
). Es ist ein bisschen irreführend, nicht wahr? Ich weiß, Sie hatte wohl Ihre Gründe, es zu machen, aber es wäre so schön, wenigstens einen kleinen Hinweis, dassNoClassDefFoundError
war ein Ergebnis einer anderen Ausnahme, ohne die Notwendigkeit zu folgern. Nur werfenExceptionInInitializerError
wieder wäre viel mehr klar. Manchmal ist die Verbindung zwischen den beiden vielleicht nicht so offensichtlich sind.InformationsquelleAutor Nikhil Sahu
Bekomme ich NoClassFoundError, wenn Klassen geladen werden von der common language runtime class-loader kann keine access-Klassen bereits geladen, die von der java-rootloader. Da die andere Klasse Lader sind in verschiedenen security domains (laut java) die jvm wird nicht zulassen, dass Klassen bereits geladen rootloader gelöst werden in der runtime-loader-Adressraum.
Führen Sie Ihr Programm mit 'java -javaagent:tracer.jar [IHRE java-ARGS]'
Es erzeugt eine Ausgabe, die zeigt die Klasse geladen, und der Lader env, der diese Klasse geladen. Es ist sehr hilfreich, tracing, warum eine Klasse nicht aufgelöst werden kann.
InformationsquelleAutor codeDr
Dies Lesen, vor allem, wenn Sie sehen
NoClassDefFoundErrors
im UNIT-TESTS...Einem interessanten Fall, in dem Sie sehen, eine Menge von
NoClassDefFoundErrors
ist, wenn Sie:throw
eineRuntimeException
imstatic
block der KlasseExample
Example
NoClassDefError
wird geworfen, begleitet mitExceptionInInitializerError
aus dem statischen blockRuntimeException
.Dies ist besonders wichtig, wenn Sie sehen
NoClassDefFoundErrors
in Ihrem UNIT-TESTS.In einer Weise, die Sie "sharing" die
static
block-Ausführung, die zwischen den tests, aber in der erstenExceptionInInitializerError
wird nur in einem Testfall. Die erste verwendet die problematischeExample
Klasse. Andere Testfälle, verwenden Sie dieExample
Klasse wird nur werfenNoClassDefFoundErrors
.InformationsquelleAutor Bartek Lipinski
Falls Sie erzeugt-code (EMF, etc.) kann es zu viele statische initialisers die verbrauchen alle stack-Speicher.
Siehe Stack Overflow Frage So erhöhen Sie die Java-stack-Größe?.
NÖ. EMf-Eclipse Modeling Framework. In der Automobilindustrie können wir angesichts dieser Fehler bei der Ausführung des generierten Codes.
InformationsquelleAutor Aykut Kllic
Die Technik unten hat mir geholfen, viele Male:
wo die TheNoDefFoundClass ist die Klasse, die werden könnten "verloren" wegen einer Vorliebe für eine ältere version der gleichen Bibliothek von Ihrem Programm verwendet. Dies ist Häufig der Fall mit den Fällen, wenn die client-software bereitgestellt wird, in eine dominante container, bewaffnet mit seiner eigenen classloadern, und Tonnen von alten Versionen der beliebtesten libs.
InformationsquelleAutor Aram Paronikyan
Ich mein problem behoben, durch das deaktivieren der preDexLibraries für alle Module:
InformationsquelleAutor Michael
NoClassDefFoundError
können auch auftreten, wenn eine statische Initialisierung versucht das laden einer resource-bundle ist nicht verfügbar in runtime, zum Beispiel einer properties-Datei, die die betroffene Klasse zu laden versucht aus derMETA-INF
Verzeichnis, aber gibt es nicht. Wenn Sie nicht fangenNoClassDefFoundError
, manchmal werden Sie nicht in der Lage, um zu sehen, das volle stack-trace; um dies zu überwinden, können Sie vorübergehend einecatch
Klausel fürThrowable
:Vielleicht sollte ich betonen, dass ein Teil mehr, 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 war in der Lage zu lösen, dieNoClassDefFoundError
durch hinzufügen der properties-Datei fehlt. Ich fügte hinzu, diese genau beantworten, weil man nicht erwarten, dass dieser Fehler unter den genannten Umständen.Sie vermisst etwas sehr wichtiges in Ihrer Erklärung, denn die einzige Möglichkeit, dass eine fehlende Ressource-Datei könnte auslösen, Ausnahme ist, wenn Sie versuchen, laden Sie die Ressource-Datei in einem
static
Initialisierung ... die Auslöser für eine ungeprüfte Ausnahme und ließ die Klasse init fehl. Jede ungeprüfte Ausnahme Vermehrung von statischen Initialisierung würde das tun.Wenn ich falsch bin (also nicht aufgrund fehlgeschlagener
static
Initialisierung), wäre ich daran interessiert zu sehen, ein Aktuelles Beispiel ist (D. H. ein MCVE) , wird das Verhalten veranschaulicht.Du hast absolut Recht, aber 🙁 ich sah der Fall, wo ich auf dieses Problem und es in der Tat beinhaltete eine statische Initialisierer Versuch zum laden eines resource-Bundles. Ich darf ergänzen/korrigieren Sie meine Beschreibung der Ursache. Vielen Dank für diesen Hinweis.
InformationsquelleAutor ᴠɪɴᴄᴇɴᴛ
Wenn jemand hierher kommt, weil der
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
Fehler, in meinem Fall wurde es produziert, weil ich in log4j 2 (aber ich wusste nicht fügen Sie alle Dateien, die mit ihm gekommen), und einige dependency-Bibliothek log4j-1. Die Lösung war, fügen Sie die Log4j-1.x-bridge: die jar -log4j-1.2-api-<version>.jar
kommt mit log4j 2. Mehr info in der log4j 2 migration.InformationsquelleAutor ST7
Zwei verschiedene checkout Kopien des gleichen Projekts
In meinem Fall war das problem von Eclipse ist die Unfähigkeit zu unterscheiden zwischen zwei verschiedenen Kopien des gleichen Projekts. Ich habe ein gesperrt auf trunk (SVN-version) und der andere arbeitet in einem Zweig zu einem Zeitpunkt. Ich versuchte es mit einem Wechsel in die Arbeitskopie als JUnit-Testfall, zu dem extra eine private innere Klasse einer öffentlichen Klasse auf seine eigene, und während er arbeiten war, ich öffne die andere Kopie des Projekts zu suchen, um an einen anderen Teil des Codes, dass die erforderlichen änderungen. An einem gewissen Punkt, die
NoClassDefFoundError
aufgetaucht ist, beschwert sich, dass die private innere Klasse war nicht da; ein Doppelklick in dem stack-trace brachte mich auf die Quelldatei in der falschen Projekt kopieren.Schließen der trunk-Kopie des Projekts und die Durchführung des Tests Fall nochmal losgeworden, das problem.
InformationsquelleAutor manuelvigarcia
Dieser Fehler kann verursacht werden, indem Sie deaktiviert Java-version Anforderungen.
In meinem Fall war ich in der Lage diesen Fehler zu beheben, während das hohe-Profil, open-source-Projekt, mit dem Wechsel von Java 9 Java 8 mit SDKMAN!.
Dann tun, eine saubere Installation, wie unten beschrieben.
Bei der Verwendung Maven wie Ihr build-tool, ist es manchmal hilfreich-und in der Regel erfreulich, zu tun, ein sauber "installieren" bauen mit der Prüfung deaktiviert.
Nun, dass alles kompiliert und installiert wurde, können Sie gehen Sie vor und führen die tests durch.
InformationsquelleAutor nobar
Bekam ich NoClassDefFound Fehler, wenn ich es nicht exportieren einer Klasse auf die "Order and Export" - Registerkarte in der Java Build Path von meinem Projekt. Stellen Sie sicher, setzen Sie ein Häkchen in "Order and Export" - Registerkarte von alle Abhängigkeiten, die Sie hinzufügen, um das Projekt build path. Sehen Eclipse-Warnung: XXXXXXXXXXX.jar werden nicht exportiert oder veröffentlicht. Laufzeit ClassNotFoundExceptions führen kann.
InformationsquelleAutor Steve Stilson
Java war nicht in der Lage, um die Klasse zu finden, Eine in der Laufzeit.
Klasse A war in der maven-Projekt ArtClient aus einem anderen Arbeitsbereich.
Also ich importiert ArtClient zu meinem Eclipse-Projekt.
Zwei meiner Projekte war mit ArtClient als Abhängigkeit.
Ich änderte library-Referenz auf Projekt-Referenz für diese (Build-Pfad -> Configure Build Path).
Und das problem verschwunden.
InformationsquelleAutor Pekmezli Dürüm
Ich hatte das gleiche problem, und ich war Vorrat für viele Stunden.
Fand ich die Lösung. In meinem Fall gab es die statische Methode definiert durch. Die JVM kann es nicht schaffen, die ein weiteres Objekt der Klasse.
Beispielsweise
InformationsquelleAutor sudar
Bekam ich diese Meldung nach dem entfernen Sie zwei Dateien aus dem SRC-Bibliothek, und, wenn ich brachte Sie zurück, ich sah immer wieder diese Fehlermeldung.
War meine Lösung: Starten Sie Eclipse erneut. Da dann ich habe nicht gesehen, diese Nachricht wieder 🙂
InformationsquelleAutor Eliran
Stellen Sie sicher, dass diese übereinstimmungen in der
module:app
undmodule:lib
:Die Beispiel-Konfiguration ist nicht ausgeglichen (drei
{s
und zwei}
). Kann man das lösen?InformationsquelleAutor Alex