Ich habe beide Beispiele in den Java-Tutorials von Oracle ausprobiert . Beide kompilieren einwandfrei, aber zur Laufzeit tritt bei beiden der folgende Fehler auf:
Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
Ich glaube, ich habe die Main.java
Datei möglicherweise im falschen Ordner. Hier ist die Verzeichnishierarchie:
graphics
├ Main.java
├ shapes
| ├ Square.java
| ├ Triangle.java
├ linepoint
| ├ Line.java
| ├ Point.java
├ spaceobjects
| ├ Cube.java
| ├ RectPrism.java
Und hier ist Main.java
:
import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;
public class Main {
public static void main(String args[]) {
Square s = new Square(2,3,15);
Line l = new Line(1,5,2,3);
Cube c = new Cube(13,32,22);
}
}
Was mache ich hier falsch?
AKTUALISIEREN
Nachdem ich die Main
Klasse in das graphics
Paket eingefügt (hinzugefügt package graphics;
) habe, den Klassenpfad auf "_test" (Ordner mit Grafiken) gesetzt, kompiliert und mit java graphics.Main
(über die Befehlszeile) ausgeführt habe, hat es funktioniert.
Wirklich spätes UPDATE # 2
Ich habe Eclipse nicht verwendet (nur Notepad ++ und das JDK), und das obige Update hat mein Problem gelöst. Es scheint jedoch, dass viele dieser Antworten für Eclipse und IntelliJ sind, aber sie haben ähnliche Konzepte.
quelle
package graphics;
oben hätten). Istgraphics
der Leiter Ihrer Paketstruktur? Hat Squarepackage graphics.shapes
oben?Antworten:
Nachdem Sie Ihren Code kompiliert haben, erhalten Sie
.class
Dateien für jede Klasse in Ihrem Programm. Diese Binärdateien sind der Bytecode, den Java interpretiert, um Ihr Programm auszuführen. DasNoClassDefFoundError
zeigt an, dass der Klassenlader (in diesem Falljava.net.URLClassLoader
), die zur dynamischen Laden von Klassen verantwortlich ist, nicht finden kann.class
Datei für die Klasse , die Sie zu verwenden versuchen.Ihr Code würde nicht kompiliert, wenn die erforderlichen Klassen nicht vorhanden wären (es sei denn, die Klassen sind mit Reflection geladen). Daher bedeutet diese Ausnahme normalerweise, dass Ihr Klassenpfad nicht die erforderlichen Klassen enthält. Denken Sie daran, dass der Klassenladeprogramm (speziell
java.net.URLClassLoader
) im Paket abc im Ordner a / b / c / in jedem Eintrag in Ihrem Klassenpfad nach Klassen sucht.NoClassDefFoundError
kann auch darauf hinweisen, dass Ihnen eine transitive Abhängigkeit einer JAR-Datei fehlt, für die Sie kompiliert haben und die Sie verwenden möchten.Wenn Sie beispielsweise eine Klasse hätten, hätten Sie
com.example.Foo
nach dem Kompilieren eine KlassendateiFoo.class
. Angenommen, Ihr Arbeitsverzeichnis lautet.../project/
. Diese Klassendatei muss abgelegt werden.../project/com/example
, und Sie würden Ihren Klassenpfad auf festlegen.../project/
.Randnotiz: Ich würde empfehlen, die erstaunlichen Tools zu nutzen, die für Java- und JVM-Sprachen verfügbar sind. Moderne IDEs wie Eclipse und IDEA sowie Build-Management-Tools wie Maven oder Gradle helfen Ihnen dabei, sich nicht um Klassenpfade (so viel) zu kümmern und sich auf den Code zu konzentrieren! In diesem Link wird jedoch erläutert, wie Sie den Klassenpfad festlegen, wenn Sie ihn in der Befehlszeile ausführen.
quelle
Ich möchte die Perspektive anderer weiter korrigieren
NoClassDefFoundError
.NoClassDefFoundError
kann aus mehreren Gründen auftreten wieIn der ursprünglichen Frage war es der erste Fall, der korrigiert werden kann, indem CLASSPATH auf die JAR-Datei für referenzierte Klassen oder auf ihren Paketordner gesetzt wird.
Was bedeutet es, wenn "in Kompilierungszeit verfügbar" gesagt wird?
ZB: Zwei Klassen, A und B (erweitert A). Wenn B direkt im Code referenziert wird, ist es zur Kompilierungszeit verfügbar, dh A a = new B ();
Was bedeutet es, wenn "zur Kompilierungszeit nicht verfügbar" gesagt wird?
Beispiel: Zwei Klassen, A und B (erweitert A). Code hat
A a = Class.forName ("B"). NewInstance ();
quelle
package app;
und neu kompilieren, bevor ich sie in die Unterverzeichnis-App verschieben konnte.NoClassDefFoundError
für diesen FallNoClassDefFoundError
bedeutet, dass die Klasse im Klassenpfad um vorhanden istCompile time
, aber im Klassenpfad um nicht vorhanden istRuntime
.Wenn Sie Eclipse - verwenden, stellen Sie sicher , dass Sie das haben
shapes
,linepoints
und diespaceobjects
als Einträge in der.classpath
Datei.quelle
Wenn beim Kompilieren und Ausführen einer dieser Fehler aufgetreten ist:
-------------------------- LÖSUNG -----------------------
Das Problem liegt hauptsächlich in der Paketorganisation. Sie sollten Ihre Klassen in Ordnern entsprechend den Paketklassifikationen in Ihrem Quellcode ordnen.
quelle
zeigt an, dass etwas zur Kompilierungszeit gefunden wurde, aber nicht zur Laufzeit . Vielleicht müssen Sie es nur dem Klassenpfad hinzufügen.
quelle
Keine Klassendefinitionsausnahme tritt auf, wenn die beabsichtigte Klasse nicht im Klassenpfad gefunden wird. Zur Kompilierungszeitklasse: Die Klasse wurde vom Java Compiler generiert, aber zur Laufzeit wird die abhängige Klasse irgendwie nicht gefunden.
Lassen Sie uns ein einfaches Beispiel durchgehen:
}}
Nehmen wir nun an, dass die beiden oben genannten Java-Quellcodes in einem Ordner abgelegt sind, beispielsweise "NoClassDefinationFoundExceptionDemo".
Öffnen Sie nun eine Shell (vorausgesetzt, Java wird bereits korrekt eingerichtet)
quelle
NoClassDefFoundError in Java:
Definition:
NoClassDefFoundError wird angezeigt, wenn während der Kompilierungszeit eine Klasse vorhanden war, zur Laufzeit jedoch nicht im Java-Klassenpfad verfügbar war. Normalerweise wird die folgende Zeile im Protokoll angezeigt, wenn Sie NoClassDefFoundError erhalten: Ausnahme im Thread "main" java.lang.NoClassDefFoundError
Mögliche Ursachen:
Die Klasse ist in Java Classpath nicht verfügbar.
Möglicherweise führen Sie Ihr Programm mit dem Befehl jar aus, und die Klasse wurde im ClassPath-Attribut der Manifestdatei nicht definiert.
Jedes Startskript überschreibt die Umgebungsvariable Classpath.
Da NoClassDefFoundError eine Unterklasse von java.lang.LinkageError ist, kann es auch vorkommen, dass eine dieser Abhängigkeiten wie die native Bibliothek möglicherweise nicht verfügbar ist.
Suchen Sie in Ihrer Protokolldatei nach java.lang.ExceptionInInitializerError. NoClassDefFoundError aufgrund des Fehlschlags der statischen Initialisierung ist weit verbreitet.
Wenn Sie in einer J2EE-Umgebung arbeiten, kann die Sichtbarkeit von Class unter mehreren Classloadern auch zu java.lang.NoClassDefFoundError führen. Weitere Informationen finden Sie in den Beispielen und im Szenarioabschnitt.
Mögliche Lösungen:
Stellen Sie sicher, dass alle erforderlichen Java-Klassen im Klassenpfad der Anwendung enthalten sind. Der häufigste Fehler besteht darin, nicht alle erforderlichen Klassen einzuschließen, bevor eine Java-Anwendung ausgeführt wird, die von einigen externen Bibliotheken abhängig ist.
Der Klassenpfad der Anwendung ist korrekt, aber die Umgebungsvariable Classpath wird vor der Ausführung der Anwendung überschrieben.
Stellen Sie sicher, dass der oben genannte ExceptionInInitializerError nicht im Stack-Trace Ihrer Anwendung angezeigt wird.
Ressourcen:
3 Möglichkeiten, um java.lang.NoClassDefFoundError in Java J2EE zu lösen
java.lang.NoClassDefFoundError - So lösen Sie No Class Def Found Error
quelle
Wenn sich Ihr Projekt in einem Paket wie befindet
com.blahcode
und Ihre Klasse aufgerufen wirdMain
, werden die kompilierten Dateien möglicherweise in einer Verzeichnisstruktur wie ausgegeben./out/com/blahcode/Main.class
. Dies gilt insbesondere für IntelliJ IDEA.Wenn Sie versuchen, von einer Shell oder einem Cmd auszuführen, müssen Sie zu
cd
dem wechseln, dascom
als Unterverzeichnis enthalten ist.quelle
Nachdem ich viele Monate an einem NetBeans-Projekt gearbeitet hatte, erhielt ich plötzlich die Nachricht NoClassDefFoundError, kurz nachdem ich eine Warnung "Low Memory" erhalten hatte. Eine saubere Neuerstellung hat nicht geholfen, aber das Schließen von Netbeans insgesamt und das erneute Öffnen des Projekts haben keine Fehlerberichte ergeben.
quelle
Diese Antwort ist spezifisch für einen java.lang.NoClassDefFoundError, der in einem Dienst auftritt :
Mein Team hat diesen Fehler kürzlich nach dem Upgrade einer Drehzahl festgestellt, die einen Dienst bereitgestellt hat. Die Drehzahl und die darin enthaltene Software wurden mit Maven erstellt, sodass wir anscheinend eine Abhängigkeit von der Kompilierungszeit hatten, die einfach nicht in die Drehzahl aufgenommen wurde.
Bei der Untersuchung befand sich die nicht gefundene Klasse jedoch im selben Modul wie mehrere Klassen im Stack-Trace. Darüber hinaus war dies kein Modul, das erst kürzlich zum Build hinzugefügt wurde. Diese Tatsachen deuteten darauf hin, dass es sich möglicherweise nicht um ein Maven-Abhängigkeitsproblem handelt.
Die mögliche Lösung: Starten Sie den Dienst neu!
Es scheint, dass das RPM-Upgrade das Dateihandle des Dienstes für die zugrunde liegende JAR-Datei ungültig gemacht hat. Der Dienst sah dann eine Klasse, die nicht in den Speicher geladen worden war, suchte in der Liste der JAR-Dateihandles danach und konnte sie nicht finden, da das Dateihandle, aus dem die Klasse geladen werden konnte, ungültig war. Durch einen Neustart des Dienstes musste er alle Dateihandles neu laden, wodurch die Klasse geladen werden konnte, die direkt nach dem RPM-Upgrade nicht im Speicher gefunden wurde.
Hoffe, dass ein bestimmter Fall jemandem hilft.
quelle
Ich habe mich heute mit dem Problem konfrontiert. Ich habe ein Android-Projekt und nach dem Aktivieren würde
multidex
das Projekt nicht mehr gestartet.Der Grund war, dass ich vergessen hatte, die spezifische Multidex-Methode aufzurufen, die der hinzugefügt
Application class
und vor allem anderen aufgerufen werden sollte.Befolgen Sie dieses Tutorial, um Multidex korrekt zu aktivieren. https://developer.android.com/studio/build/multidex.html
Sie sollten diese Zeilen zu Ihrer Anwendungsklasse hinzufügen
quelle
Für mein Projekt löste das Problem, dass Chrome-Browser und Chromedriver nicht kompatibel waren. Ich hatte eine sehr alte Version des Treibers, die nicht einmal den Browser öffnen konnte. Ich habe gerade die neueste Version von beiden heruntergeladen und das Problem gelöst. Wie habe ich das Problem entdeckt? Da ich mein Projekt mit dem nativen Selenium-Firefox-Treiber mit einer alten Version von FF ausführte, die in meiner Anwendung enthalten war, wurde mir klar, dass das Problem in der Inkompatibilität zwischen Browser und Treiber lag.
Ich hoffe, dies kann jedem helfen, der ein ähnliches Problem wie ich hat und dieselbe Fehlermeldung generiert hat.
quelle
Meine zwei Cent in dieser Kette:
Stellen Sie sicher, dass der Klassenpfad vollständige Pfade enthält (
/home/user/lib/some_lib.jar
anstelle von~/lib/some_lib.jar
), da sonstNoClassDefFoundError
Fehler auftreten können.quelle
~
und andere Shell - Metazeichen , wenn eine Classpath Umgebungsvariable, sondern nur den Mechanismus zur Verfügung gestellt Sie verwenden die Variable zu setzen erweitert sie auf reale Pfadnamen. Wenn Sie verwendenbash
, können Sie "gemischte" Ergebnisse erhalten. Sehen Sie sich beispielsweise an, was Sie erhalten, wenn Sieecho ~:~
in die Befehlszeile eingeben. Der erste~
ist erweitert, der zweite nicht.Ich erhalte NoClassFoundError, wenn vom Runtime Class Loader geladene Klassen nicht auf Klassen zugreifen können, die bereits vom Java Rootloader geladen wurden. Da sich die verschiedenen Klassenlader in verschiedenen Sicherheitsdomänen befinden (laut Java), erlaubt die JVM nicht, dass Klassen, die bereits vom Rootloader geladen wurden, im Adressraum des Laufzeitladers aufgelöst werden.
Führen Sie Ihr Programm mit 'java -javaagent: tracer.jar [IHRE Java-ARGS]' aus.
Es wird eine Ausgabe erzeugt, die die geladene Klasse und die Loader-Umgebung zeigt, die die Klasse geladen hat. Es ist sehr hilfreich zu verfolgen, warum eine Klasse nicht aufgelöst werden kann.
quelle
Es ist mir in Android Studio passiert.
Die Lösung, die für mich funktioniert hat: Starten Sie einfach das Studio neu.
quelle
Ich hatte das gleiche Problem mit meiner Android-Entwicklung mit Android Studio. Die angebotenen Lösungen sind allgemein gehalten und haben mir nicht geholfen (zumindest für mich). Nach stundenlanger Recherche habe ich folgende Lösung gefunden und kann Android-Entwicklern helfen, die mit Android Studio entwickeln. Ändern Sie die Einstellung wie folgt: Einstellungen -> Erstellen, Ausführen, Bereitstellen -> Sofortige Ausführung -> Deaktivieren Sie die erste Option.
Mit dieser Änderung bin ich am Laufen. Hoffe das wird meinen Entwicklern helfen.
quelle
Eine Fehlerquelle für diese Ausnahme könnten inkonsistente Definitionen für Proguard sein, z. B. fehlende
-libraryJars "path.to.a.missing.jar.library".
Dies erklärt, warum das Kompilieren und Ausführen einwandfrei funktioniert, da das JAR vorhanden ist, während Clean & Build fehlschlägt. Denken Sie daran, neu hinzugefügte JAR-Bibliotheken im Proguard-Setup zu definieren!
Beachten Sie, dass Fehlermeldungen von Proguard nicht dem Standard entsprechen, da sie leicht mit ähnlichen Ameisenmeldungen verwechselt werden können, die eintreffen, wenn das Glas überhaupt nicht vorhanden ist. Nur ganz unten wird es einen kleinen Hinweis auf Proguard in Schwierigkeiten geben. Daher ist es ziemlich logisch, nach traditionellen Klassenpfadfehlern usw. zu suchen, aber dies wird vergebens sein.
Offensichtlich ist die NoClassDefFound-Ausnahme das Ergebnis, wenn z. B. die resultierende ausführbare JAR-Datei ausgeführt wird, die auf einem Mangel an Proguard-Konsistenz basiert. Manche nennen es Proguard "Hölle"
quelle
Ich benutze das FileSync Plugin für Eclipse , damit ich debug auf Tomcat leben kann und ich erhielt ,
NoClassFoundError
weil ich einen Sync - Eintrag für das hinzugefügt hattebin
Verzeichnis in dem Eclipse - Workspace=> classes
in demmetadata
für Tomcat hatte aber nicht auch einen Ordner Sync für das hinzugefügteextlib
Verzeichnis in Eclipse=>
C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib
quelle
Ich entwickle eine Eclipse-basierte Anwendung, die auch als RCP (Rich Client Platform) bekannt ist . Und ich habe dieses Problem nach dem Refactoring (Verschieben einer Klasse von einem Plug-In in ein neues) festgestellt.
Das Bereinigen des Projekts und des Maven-Updates hat nicht geholfen.
Das Problem wurde durch den Bundle-Activator verursacht, der nicht automatisch aktualisiert wurde. Die manuelle Aktualisierung des Bundle-Activators unter MANIFEST.MF im neuen PlugIn hat mein Problem behoben.
quelle
Wenn Sie kürzlich Multidex-Unterstützung in Android Studio wie folgt hinzugefügt haben:
Ihre Lösung wird also nur von MultiDexApplication anstelle von Application erweitert
quelle
Wenn Sie mehr als ein Modul verwenden, sollten Sie haben
in Ihrer Build-Datei.
quelle
Überprüfen Sie dies, wenn Sie einen statischen Handler in Ihrer Klasse haben. Wenn ja, seien Sie bitte vorsichtig, da der statische Handler nur in einem Thread mit einem Looper initiiert werden kann. Der Absturz kann folgendermaßen ausgelöst werden:
1. Erstellen Sie zunächst die Instanz der Klasse in einem einfachen Thread und fangen Sie den Absturz ab.
2. Wenn Sie die Feldmethode Class im Hauptthread aufrufen, erhalten Sie den NoClassDefFoundError.
Hier ist der Testcode:
Fügen Sie in Ihrer onCrete-Methode der Hauptaktivität den Testcodeteil hinzu:
Es gibt eine einfache Möglichkeit, das Problem mit einem handlerThread zu beheben, um den Handler zu initiieren:
quelle
Verwenden Sie keine Testklassen außerhalb des Moduls
Ich habe keine Lösung, nur eine andere Variante des Falls "Bei der Kompilierung vorhanden, zur Laufzeit abwesend".
Ich habe versucht, eine sehr bequeme Methode aus einer JUnit-Testklasse aus einer anderen Testklasse zu verwenden, die sich in einem anderen Modul befindet. Das ist ein Nein-Nein, da Testcode nicht Teil des gepackten JAR ist, aber ich habe es nicht bemerkt, weil er für die Benutzerklasse in Eclipse sichtbar erscheint.
Meine Lösung bestand darin, die Methode in eine vorhandene Dienstprogrammklasse zu platzieren, die Teil des Produktionscodes ist.
quelle
In meiner Umgebung tritt dieses Problem im Unit-Test auf. Nach dem Anhängen einer Bibliotheksabhängigkeit an * .pom ist dies behoben.
z.B:
Fehlermeldung:
pom:
quelle
Ich habe diesen Fehler nach einem Git-Zweigwechsel erhalten. Für den speziellen Fall von Eclipse fehlten Zeilen im Verzeichnis .settings für die Datei org.eclipse.wst.common.component. Wie Sie unten sehen können
Das Wiederherstellen der Projektabhängigkeiten mit Maven Install würde helfen.
quelle
Es passiert viel mit meinen Genymotion-Geräten. Stellen Sie sicher, dass auf Ihrem Laufwerk, auf dem Genymotion installiert ist, ausreichend Speicher verfügbar ist.
quelle