Wie löse ich java.lang.NoClassDefFoundError?

220

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.javaDatei 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 MainKlasse in das graphicsPaket 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.

Jonathan Lam
quelle
1
Wenn Sie Ihre Hauptklasse betrachten, ist sie nicht in einem Paket enthalten (das Sie package graphics;oben hätten). Ist graphicsder Leiter Ihrer Paketstruktur? Hat Square package graphics.shapesoben?
Lreeder
1
Sie listen auf, wo sich die .java-Dateien befinden, aber da es sich um ein Laufzeitproblem handelt , interessiert Sie tatsächlich, wo sich die .class-Dateien befinden und ob sie sich in Ihrem Klassenpfad befinden oder nicht. Wie führen Sie die Hauptklasse aus?
Thor84no
Drücken Sie einfach Umschalt + Strg + O in Eclipse, um Ihre Importe zu organisieren
happybuddha
Stellen Sie sicher, dass Sie den Klassennamen richtig eingeben. Ich habe diesen Fehler erhalten, weil ich den Klassennamen nicht mit einem Großbuchstaben begonnen habe
Jeremy Borg
Dies tritt in IntelliJ IDEA manchmal nach einem umfassenden Refactoring auf. Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie -> Modul kompilieren. Starten Sie das Projekt dann neu und es sollte wieder funktionieren.
Zar

Antworten:

223

Nachdem Sie Ihren Code kompiliert haben, erhalten Sie .classDateien für jede Klasse in Ihrem Programm. Diese Binärdateien sind der Bytecode, den Java interpretiert, um Ihr Programm auszuführen. Das NoClassDefFoundErrorzeigt an, dass der Klassenlader (in diesem Fall java.net.URLClassLoader), die zur dynamischen Laden von Klassen verantwortlich ist, nicht finden kann .classDatei 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. NoClassDefFoundErrorkann 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.Foonach dem Kompilieren eine Klassendatei Foo.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.

Samuel
quelle
Ich lese dies aufgrund eines Fehlers, der beim Versuch, einen Komponententest unter Android auszuführen, aufgetreten ist. Es stellt sich heraus, dass der NoClassDefFoundError in meinem Fall aufgrund fehlender Abhängigkeiten im Test aufgetreten ist. Ich muss über die Abhängigkeitsinjektion nachdenken, um solche Fehler zu vermeiden. Danke für die ausführliche Antwort.
typisch danny
130

Ich möchte die Perspektive anderer weiter korrigieren NoClassDefFoundError.

NoClassDefFoundError kann aus mehreren Gründen auftreten wie

  1. ClassNotFoundException - .class für diese referenzierte Klasse nicht gefunden, unabhängig davon, ob sie zur Kompilierungszeit verfügbar ist oder nicht (dh Basis- / untergeordnete Klasse).
  2. Klassendatei gefunden, aber Ausnahme beim Initialisieren statischer Variablen ausgelöst
  3. Klassendatei gefunden, Ausnahme beim Initialisieren statischer Blöcke ausgelöst

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

  • Die referenzierte Klasse wird im Code verwendet.
    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?

  • Die Kompilierungszeitklasse und die Laufzeitklasse sind unterschiedlich, dh zum Beispiel wird die Basisklasse unter Verwendung des Klassennamens der untergeordneten Klasse geladen, zum Beispiel Class.forName ("Klassenname").
    Beispiel: Zwei Klassen, A und B (erweitert A). Code hat
    A a = Class.forName ("B"). NewInstance ();
p1nkrock
quelle
In meinem Fall hatte ich eine Klasse kompiliert und sie in ein Verzeichnis namens App verschoben. Ich musste eine Zeile mit hinzufügen package app;und neu kompilieren, bevor ich sie in die Unterverzeichnis-App verschieben konnte.
Taco
1
Abgesehen von den oben aufgeführten 3 kann ClassLoaders auch einen solchen Fehler verursachen, der im Grunde genommen ClassNotFoundException ist. In diesem Szenario kann die Klasse im Klassenpfad vorhanden sein, versucht jedoch, um
Fahad
2 und 3 sind klassenladerspezifisch. Laut Javadoc ist die Ausnahme nur aus Grund 1 vorgesehen.
Samuel
1
Ich habe Fall 2 und Fall 3 getestet, es ist nicht NoClassDefFoundError, es ist ExceptionInInitializerError Fall 2.Klassendatei gefunden, aber Ausnahme beim Initialisieren statischer Variablen ausgelöst Fall 3.Klassendatei gefunden, Ausnahme beim Initialisieren statischer Blöcke ausgelöst
Michael
1
@ Michael, Dieser Link sagt, dass Ihr Stacktrace auch NoClassDefFoundErrorfür diesen Fall
angezeigt
15

NoClassDefFoundErrorbedeutet, dass die Klasse im Klassenpfad um vorhanden ist Compile time, aber im Klassenpfad um nicht vorhanden ist Runtime.

Wenn Sie Eclipse - verwenden, stellen Sie sicher , dass Sie das haben shapes, linepointsund die spaceobjectsals Einträge in der .classpathDatei.

Konstantin Yovkov
quelle
1
Wie gehe ich zur Laufzeit mit try / catch damit um ?
Maveň
5
Diese Antwort ist nicht korrekt, wie Sie sie schreiben. Richtig wäre: "EINE mögliche Ursache für diesen Fehler ist ..." Es kann aber auch andere Gründe geben, warum Sie diesen Fehler erhalten, beispielsweise wenn Sie eine JAR-Datei zur Laufzeit mit einem Klassenladeprogramm laden.
Elmue
13

Wenn beim Kompilieren und Ausführen einer dieser Fehler aufgetreten ist:

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- LÖSUNG -----------------------

Das Problem liegt hauptsächlich in der Paketorganisation. Sie sollten Ihre Klassen in Ordnern entsprechend den Paketklassifikationen in Ihrem Quellcode ordnen.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]
Sami
quelle
Das D ." Der Befehl in javac erledigt den Trick, indem er die Ordnerstruktur der Pakete erstellt, anstatt alle .class-Dateien im Stammverzeichnis abzulegen. Danke!
Jorge Sampayo
9
java.lang.NoClassDefFoundError

zeigt an, dass etwas zur Kompilierungszeit gefunden wurde, aber nicht zur Laufzeit . Vielleicht müssen Sie es nur dem Klassenpfad hinzufügen.

sschrass
quelle
15
Wie geht das?
Narendra Singh
hängt von dem Kontext ab, nach dem Sie fragen.
Sschrass
6

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:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

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)

  1. Gehen Sie zum Ordner "NoClassDefinationFoundExceptionDemo"
  2. Kompilieren Sie Java-Quelldateien javac ClassB javac ClassA
  3. Beide Dateien werden erfolgreich kompiliert und Klassendateien im selben Ordner wie ClassA.class und ClassB.class generiert
  4. Jetzt, da wir ClassPath auf das aktuelle Arbeitsverzeichnis überschreiben, führen wir den folgenden Befehl java -cp aus. ClassA und It haben erfolgreich funktioniert und Sie sehen die Ausgabe auf dem Bildschirm
  5. Nehmen wir an, Sie haben die ClassB.class-Datei aus dem Present Directory entfernt. und jetzt führen Sie den Befehl erneut aus. java -cp. ClassA Jetzt werden Sie mit NoClassDefFoundException begrüßt. als ClassB, die eine Abhängigkeit für ClassA darstellt, wird im Klassenpfad (dh im aktuellen Arbeitsverzeichnis) nicht gefunden.
Bharatj
quelle
5

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:

  1. Die Klasse ist in Java Classpath nicht verfügbar.

  2. Möglicherweise führen Sie Ihr Programm mit dem Befehl jar aus, und die Klasse wurde im ClassPath-Attribut der Manifestdatei nicht definiert.

  3. Jedes Startskript überschreibt die Umgebungsvariable Classpath.

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

  5. Suchen Sie in Ihrer Protokolldatei nach java.lang.ExceptionInInitializerError. NoClassDefFoundError aufgrund des Fehlschlags der statischen Initialisierung ist weit verbreitet.

  6. 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:

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

  2. Der Klassenpfad der Anwendung ist korrekt, aber die Umgebungsvariable Classpath wird vor der Ausführung der Anwendung überschrieben.

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

Affy
quelle
3

Wenn sich Ihr Projekt in einem Paket wie befindet com.blahcodeund Ihre Klasse aufgerufen wird Main, 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 cddem wechseln, das comals Unterverzeichnis enthalten ist.

cd out
java -classpath . com.blahcode.Main
Hypershadsy
quelle
1

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.

Ed S.
quelle
1

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.

John Chesshir
quelle
1

Ich habe mich heute mit dem Problem konfrontiert. Ich habe ein Android-Projekt und nach dem Aktivieren würde multidexdas Projekt nicht mehr gestartet.

Der Grund war, dass ich vergessen hatte, die spezifische Multidex-Methode aufzurufen, die der hinzugefügt Application classund vor allem anderen aufgerufen werden sollte.

 MultiDex.install(this);

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

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
CROSP
quelle
1

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.

Kyon Perez
quelle
0

Meine zwei Cent in dieser Kette:

Stellen Sie sicher, dass der Klassenpfad vollständige Pfade enthält ( /home/user/lib/some_lib.jaranstelle von ~/lib/some_lib.jar), da sonst NoClassDefFoundErrorFehler auftreten können.

Khkarens
quelle
Dies ist teilweise richtig, aber komplizierter. 1) Sie können relative Pfade im Klassenpfad verwenden, diese müssen jedoch von der JVM aufgelöst werden können ... relativ zum aktuellen Verzeichnis der JVM. Das macht sie zerbrechlich . 2) Sie können verwenden ~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 verwenden bash, können Sie "gemischte" Ergebnisse erhalten. Sehen Sie sich beispielsweise an, was Sie erhalten, wenn Sie echo ~:~in die Befehlszeile eingeben. Der erste ~ist erweitert, der zweite nicht.
Stephen C
0

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.

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}
codeDr
quelle
0

Es ist mir in Android Studio passiert.

Die Lösung, die für mich funktioniert hat: Starten Sie einfach das Studio neu.

Yanish
quelle
0

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.

Maske
quelle
0

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"

Carl
quelle
0

Ich benutze das FileSync Plugin für Eclipse , damit ich debug auf Tomcat leben kann und ich erhielt , NoClassFoundErrorweil ich einen Sync - Eintrag für das hinzugefügt hatte binVerzeichnis in dem Eclipse - Workspace => classesin dem metadatafür Tomcat hatte aber nicht auch einen Ordner Sync für das hinzugefügte extlibVerzeichnis in Eclipse=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib

Stuart Cardall
quelle
0

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.

Aleksandr Khomenko
quelle
0

Wenn Sie kürzlich Multidex-Unterstützung in Android Studio wie folgt hinzugefügt haben:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

Ihre Lösung wird also nur von MultiDexApplication anstelle von Application erweitert

public class MyApp extends MultiDexApplication {
do01
quelle
0

Wenn Sie mehr als ein Modul verwenden, sollten Sie haben

dexOptions {
    preDexLibraries = false
}

in Ihrer Build-Datei.

Matin Petrulak
quelle
0

Ü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:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

Fügen Sie in Ihrer onCrete-Methode der Hauptaktivität den Testcodeteil hinzu:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

Es gibt eine einfache Möglichkeit, das Problem mit einem handlerThread zu beheben, um den Handler zu initiieren:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}
Michael
quelle
0

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.

manuelvigarcia
quelle
0

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:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>
Mystic Lin
quelle
0

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.

Geben Sie hier die Bildbeschreibung ein

Leonardo
quelle
-1

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.

totteire
quelle
Haben Sie eine Referenz dafür?
Wai Ha Lee
Nein, mir geht regelmäßig der Speicherplatz aus. Wenn ich nicht genügend Geld freigebe und ein virtuelles Genymotion-Gerät entferne / neu installiere, wird dieser Fehler immer wieder angezeigt.
Totteire