Comment résoudre java.lang.NoClassDefFoundError?


J'ai essayé à la fois l'exemple dans les didacticiels Java d'Oracle. Ils compilent tous les deux bien, mais au moment de l'exécution, les deux arrivent avec cette erreur:

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

Je pense que je pourrais avoir le fichier Main.java dans le mauvais dossier. Voici la hiérarchie des répertoires:

graphics
├ Main.java
├ shapes
|   ├ Square.java
|   ├ Triangle.java
├ linepoint
|   ├ Line.java
|   ├ Point.java
├ spaceobjects
|   ├ Cube.java
|   ├ RectPrism.java

Et voici 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);
    }
}

Qu'est-ce que je fais de mal ici?

Mise à JOUR

Après avoir mis la classe Main dans le paquet graphics (j'y ai ajouté package graphics;), définissez le chemin de classe sur " _test" (dossier contenant des graphiques), l'a compilé et l'a exécuté en utilisant java graphics.Main (à partir de la ligne de commande), cela a fonctionné.

Mise à JOUR vraiment tardive#2

Je n'utilisais pas Eclipse (juste Notepad++ et le JDK), et la mise à jour ci-dessus a résolu mon problème. Cependant, il semble que beaucoup de ces réponses soient pour Eclipse et IntelliJ, mais elles ont des concepts similaires.

Author: Yu Hao, 2013-07-31

23 answers

Après avoir compilé votre code, vous vous retrouvez avec .class fichiers pour chaque classe de votre programme. Ces fichiers binaires sont le bytecode que Java interprète pour exécuter votre programme. Le NoClassDefFoundError indique que le classloader (dans ce cas java.net.URLClassLoader), qui est responsable du chargement dynamique des classes, ne peut pas trouver le fichier .class pour la classe que vous essayez d'utiliser.

Votre code ne compilerait pas si les classes requises n'étaient pas présentes (sauf si les classes sont chargées avec réflexion), donc habituellement, cette exception signifie que votre chemin de classe n'inclut pas les classes requises. N'oubliez pas que le classloader (en particulier java.net.URLClassLoader) recherchera les classes dans le package a. b. c dans le dossier a/b/c/ dans chaque entrée de votre chemin de classe. NoClassDefFoundError peut également indiquer qu'il vous manque une dépendance transitive de a.fichier jar que vous avez compilé et que vous essayez d'utiliser.

Par exemple, si vous aviez une classe com.example.Foo, après la compilation vous avez un fichier de classe Foo.class. Dites par exemple votre travail le répertoire est .../project/. Cette classe fichier doit être placé dans .../project/com/example, et vous définissez votre chemin de classe de .../project/.

Note latérale: Je recommanderais de profiter de l'incroyable outillage qui existe pour les langages Java et JVM. LesE modernes comme Eclipse et IDEA and build management tools comme Maven ou Gradle vous aideront à ne pas avoir à vous soucier des chemins de classe (autant) et à vous concentrer sur le code! Cela dit, ce lien explique comment définir le chemin de classe lorsque vous exécutez la commande ligne.

 175
Author: Samuel, 2017-10-01 06:55:03

Je voudrais corriger le point de vue des autres sur NoClassDefFoundError.

NoClassDefFoundError peut se produire pour plusieurs raisons, comme

  1. ClassNotFoundException -- .classe introuvable pour cette classe référencée, qu'elle soit disponible au moment de la compilation ou non(c'est-à-dire la classe de base/enfant).
  2. Fichier de classe situé, mais Exception levée lors de l'initialisation des variables statiques
  3. Fichier de classe situé, Exception levée lors de l'initialisation des blocs statiques

Dans la question d'origine, c'était le premier cas qui peut être corrigé en définissant CLASSPATH sur le fichier jar des classes référencées ou sur son dossier de package.

Ce que cela signifie en disant "disponible au moment de la compilation"?

  • La classe référencée est utilisée dans le code.
    Par exemple: Deux classes, A et B(étend A). Si B est référencé directement dans le code, il est disponible au moment de la compilation, c'est-à-dire A a = new B ();

Ce que cela signifie en disant "pas disponible au moment de la compilation"?

  • La classe de compilation et la classe d'exécution sont différentes, c'est-à-dire que par exemple la classe de base est chargée en utilisant classname de la classe enfant par exemple Classe.forName ("classname")
    Par exemple: Deux classes, A et B(étend A). Le code a
    A A = de Classe.forName ("B").newInstance();
 101
Author: p1nkrock, 2014-11-14 17:40:21

NoClassDefFoundError signifie que la classe est présent dans le classpath à Compile time, mais il n'existe pas dans le classpath à Runtime.

Si vous utilisez Eclipse, assurez-vous d'avoir le shapes, linepoints et les spaceobjects en tant qu'entrées dans le fichier .classpath.

 12
Author: Konstantin Yovkov, 2013-07-31 15:02:26

Si vous avez une de ces erreurs lors de la compilation et de l'exécution:

  • NoClassDefFoundError

  • Erreur: impossible de trouver ou charger la classe principale de bonjour

  • Exception dans le thread" main " java.lang.NoClassDefFoundError: javaTest / test / bonjour ( mauvais nom: test/bonjour) à java.lang.Chargeur de classe.defineClass1 (Méthode native) à java.lang.Chargeur de classe.defineClass (Source inconnue) à java.sécurité.SecureClassLoader.defineClass (Source inconnue) à java. net. URLClassLoader. defineClass(Source inconnue) dans java. net. URLClassLoader. access 1 100 (Source inconnue) dans java. net. URLClassLoader$1. exécuter(Source inconnue) dans java. net. URLClassLoader$1. exécuter(Source inconnue) à java.sécurité.AccessController.doPrivileged (Méthode native) dans java. net. URLClassLoader. findClass(Source inconnue) à java.lang.Chargeur de classe.Classe de charge (Source inconnue) au coucher du soleil.misc.Lanceur App AppClassLoader.Classe de charge (Source inconnue) à Java.lang.Chargeur de classe.Classe de charge (Source inconnue) au coucher du soleil.lanceur.LauncherHelper.checkAndLoadMain (Source inconnue)

-------------------------- SOLUTIION -----------------------

Le problème réside principalement dans l'organisation des paquets. Vous devez organiser vos classes dans des dossiers correctement en ce qui concerne les classifications de paquets dans votre code source.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]
 10
Author: sami, 2014-10-07 11:23:51
java.lang.NoClassDefFoundError

Indique que quelque chose a été trouvé à compile-time, mais pas à runtime. peut-être que vous avez juste à l'ajouter au classpath.

 8
Author: sschrass, 2013-07-31 15:03:00

Aucune exception de définition de classe ne se produit lorsque la classe prévue n'est pas trouvée dans le chemin de la classe. Au moment de la compilation, Class: Class a été généré à partir du compilateur Java, Mais d'une manière ou d'une autre au moment de l'exécution, la classe dépendante n'est pas trouvée.

Permet de passer par un exemple simple:

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";
 }
}

Supposons maintenant que les deux Codes source Java ci-dessus sont placés dans un dossier, disons "NoClassDefinationFoundExceptionDemo"

Ouvrez maintenant un shell (en supposant que Java est déjà être configuré correctement)

  1. Allez dans le dossier "NoClassDefinationFoundExceptionDemo"
  2. Compiler les fichiers Source Java javac ClassB javac ClassA
  3. Les deux fichiers sont Compilés avec succès et les fichiers de classe générés dans le même dossier comme ClassA.classe et ClassB.classe
  4. Maintenant que nous remplaçons ClassPath dans le répertoire de travail actuel par conséquent, nous exécutons la commande suivante java -cp . ClassA et Cela a fonctionné avec succès et vous verrez le Sortie à l'écran
  5. Disons maintenant que Vous avez supprimé ClassB.fichier de classe du répertoire actuel. et maintenant, vous exécutez à nouveau la commande. java -cp . ClassA Maintenant, il vous accueillera avec NoClassDefFoundException. comme ClassB qui est une dépendance pour ClassA ne se trouve pas dans le classpath(c'est-à-dire le répertoire de travail actuel).
 6
Author: bharatj, 2015-03-22 16:28:32

NoClassDefFoundError en Java:

Définition:

NoClassDefFoundError viendra si une classe était présente pendant la compilation mais non disponible dans java classpath pendant l'exécution. Normalement vous verrez la ligne ci dessous dans le journal lorsque vous obtenez NoClassDefFoundError: Exception in thread "main" java.lang.NoClassDefFoundError

Causes Possibles:

  1. La classe n'est pas disponible dans Java Classpath.

  2. Vous pourriez être l'exécution de votre programme à l'aide de la commande et de la classe jar n'a pas été définie dans l'attribut ClassPath du fichier manifeste.

  3. Tout script de démarrage remplace la variable d'environnement Classpath.

  4. Parce que NoClassDefFoundError est une sous-classe de java.lang.LinkageError il peut également venir si l'une de ses dépendances comme la bibliothèque native peut ne pas être disponible.

  5. Vérifiez java.lang.ExceptionInInitializerError dans votre fichier journal. NoClassDefFoundError en raison de l'échec de l'initialisation statique est assez courante.

  6. Si vous travaillez dans un environnement J2EE, la visibilité de la classe parmi plusieurs Classloader peut également provoquer java.lang.NoClassDefFoundError, voir la section exemples et scénarios pour une discussion détaillée.

Résolutions Possibles:

  1. Vérifiez que toutes les classes Java requises sont incluses dans le chemin de classe de l'application. L'erreur la plus courante est de ne pas inclure toutes les classes nécessaires, avant de commencer à exécuter une application Java qui a des dépendances sur certaines bibliothèques externes.

  2. Le classpath de l'application est correcte, mais la variable d'environnement Classpath est remplacé avant l'exécution de l'application.

  3. Vérifiez que l'ExceptionInInitializerError susmentionnée n'apparaît pas dans la trace de pile de votre application.

Ressources:

3 façons de résoudre java.lang.NoClassDefFoundError en Java J2EE

Java.lang.NoClassDefFoundError-Comment résoudre aucune erreur de classe trouvée par Def

 3
Author: Aftab Virtual, 2016-08-08 08:19:18

Si votre projet est dans un paquet comme com.blahcode et que votre classe est appelée Main, les fichiers compilés peuvent être sortis dans une structure de répertoires comme ./out/com/blahcode/Main.class. Cela est particulièrement vrai pour IntelliJ IDEA.

Lorsque vous essayez d'exécuter à partir d'un shell ou d'un cmd, vous devez cd à celui qui contient com en tant que sous-répertoire.

cd out
java -classpath . com.blahcode.Main
 2
Author: Hypershadsy, 2014-09-27 23:32:39

J'ai fait face au problème aujourd'hui. J'ai un projet Android et après avoir activé multidex, le projet ne démarrerait plus.

La raison en était que j'avais oublié d'appeler la méthode multidex spécifique qui devrait être ajoutée au Application class et invoquée avant tout le reste.

 MultiDex.install(this);

Suivez ce tutoriel pour activer multidex correctement. https://developer.android.com/studio/build/multidex.html

Vous devez ajouter ces lignes à votre classe d'application

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
 2
Author: CROSP, 2017-11-24 14:50:29

Après avoir travaillé sur un projet NetBeans pendant de nombreux mois, j'ai soudainement reçu le message NoClassDefFoundError peu de temps après avoir reçu une alerte "Faible mémoire". Faire une reconstruction propre n'a pas aidé, mais en fermant Netbeans complètement et en rouvrant le projet, il n'y avait aucun rapport d'erreur.

 1
Author: Ed S, 2016-04-14 13:51:35

Cette réponse est spécifique à un java.lang.NoClassDefFoundError se produisant dans un service :

Mon équipe a récemment vu cette erreur après la mise à niveau d'un rpm qui fournissait un service. Le rpm et le logiciel à l'intérieur avaient été construits avec Maven, il semblait donc que nous avions une dépendance au moment de la compilation qui n'avait tout simplement pas été incluse dans le rpm.

Cependant, lors de l'enquête, la classe qui n'a pas été trouvée se trouvait dans le même module que plusieurs des classes de la trace de pile. De plus, ce n'était pas un module qui n'avait été ajouté que récemment à la construction. Ces faits ont indiqué que ce n'était peut-être pas un problème de dépendance Maven.

La solution éventuelle: Redémarrez le service!

Il semble que la mise à niveau rpm ait invalidé le handle de fichier du service sur le fichier jar sous-jacent. Le service a ensuite vu une classe qui n'avait pas été chargée en mémoire, l'a recherchée parmi sa liste de descripteurs de fichiers jar et n'a pas réussi à la trouver car le gestionnaire de fichiers qu'il peut charger la classe avait été invalidée. Le redémarrage du service l'a forcé à recharger tous ses descripteurs de fichiers, ce qui lui a ensuite permis de charger cette classe qui n'avait pas été trouvée en mémoire juste après la mise à niveau rpm.

J'espère que ce cas spécifique aide quelqu'un.

 1
Author: John Chesshir, 2016-12-02 16:33:37

Mes deux cents dans cette chaîne:

Assurez-vous que le chemin de classe contient des chemins complets (/home/user/lib/some_lib.jar au lieu de ~/lib/some_lib.jar) sinon vous pouvez toujours faire face à une erreur NoClassDefFoundError.

 0
Author: khkarens, 2015-06-17 15:02:50

Je reçois NoClassFoundError lorsque les classes chargées par le chargeur de classe d'exécution ne peuvent pas accéder aux classes déjà chargées par le rootloader java. Étant donné que les différents chargeurs de classes se trouvent dans des domaines de sécurité différents (selon java), la jvm n'autorisera pas les classes déjà chargées par le rootloader à être résolues dans l'espace d'adressage du chargeur d'exécution.

Exécutez votre programme avec 'java-javaagent:tracer.jar [VOS ARGUMENTS java] '

Il produit une sortie montrant la classe chargée et l'env du chargeur qui a chargé la classe. Il est très utile de savoir pourquoi une classe ne peut pas être résolue.

// 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;
            }
        });
    }
}
 0
Author: codeDr, 2015-09-09 12:04:30

Cela arrive souvent avec mes appareils genymotion. Assurez-vous d'avoir une bonne quantité de mémoire disponible sur votre disque où Genymotion est installé.

 0
Author: totteire, 2016-01-13 10:55:00

Cela m'est arrivé dans Android Studio.

La solution qui a fonctionné pour moi: suffit de redémarrer le studio.

 0
Author: yanish, 2016-04-13 11:21:16

J'ai eu le même problème avec mon développement Android en utilisant Android studio. Les solutions fournies sont générales et ne m'ont pas aidé ( du moins pour moi). Après des heures de recherche, j'ai trouvé la solution suivante et peut aider les développeurs Android qui font du développement en utilisant Android studio. modifiez le paramètre comme ci-dessous Préférences ->Construire, l'Exécution, le Déploiement -> Instantanée Exécuter -> décochez la première option.

Avec ce changement, je suis opérationnel. J'espère que cela aidera mes amis de développement.

 0
Author: mask, 2016-04-28 17:29:43

Si vous utilisez plus d'un module, vous devez avoir

dexOptions { preDexLibraries = false }

Dans votre fichier de construction.

 0
Author: Matin Petrulak, 2017-04-20 08:47:45

Une source d'erreur pour cette exception pourrait provenir de définitions incohérentes pour Proguard, par exemple un{[1 manquant]}

- libraryJars "path. to. a. missing.jar. library".

Cela explique pourquoi la compilation et l'exécution fonctionnent correctement, étant donné que le jar est là, tandis que clean & build échoue. N'oubliez pas de définir les bibliothèques jar nouvellement ajoutées dans proguard setup!

Notez que les messages d'erreur de Proguard ne sont vraiment pas à la hauteur, car ils sont facilement confondus avec des messages ant similaires arriver quand le pot n'est pas là du tout. Seulement tout en bas il y aura un petit soupçon de proguard en difficulté. Par conséquent, il est tout à fait logique de commencer à rechercher des erreurs classpath traditionnelles, etc., mais ce sera en vain.

Évidemment, l'exception NoClassDefFound sera les résultats lors de l'exécution, par exemple le jar exécutable résultant construit et basé sur un manque de cohérence proguard. Certains l'appellent proguard "Enfer"

 0
Author: carl, 2017-11-02 20:04:06

J'utilise le plugin FileSync pour Eclipse afin de pouvoir vivre le débogage sur Tomcat et j'ai reçu NoClassFoundError parce que j'avais ajouté une entrée de synchronisation pour le répertoire bin dans l'espace de travail Eclipse => classes dans le metadata pour Tomcat mais je n'avais pas également ajouté de synchronisation de dossier pour]}

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

 0
Author: Stuart Cardall, 2017-12-06 10:56:16

1) Première méthode: j'ai résolu ce problème En supprimant certaines Dépendances de la classe de les retirer de code ci-dessous ce problème, j'ai affronté sur 4.2.2

compile 'com.google.android.gms:play-services-gcm:11.0.4'
compile 'com.google.android.gms:play-services:11.0.4'

Ceux-ci sont supplémentaires dans mon code, je les ai supprimés

 dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile files('libs/ypylibs.jar')
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.google.android.gms:play-services-gcm:11.0.4'
compile 'com.google.android.gms:play-services:11.0.4'
compile 'com.google.android.gms:play-services-ads:11.0.4'
compile 'com.dailymotion.dailymotion-sdk-android:sdk:0.1.12'
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'commons-io:commons-io:1.3.2'
compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'

} (2) Méthode: Une autre façon de résoudre ce problème est de créer une nouvelle classe Myapplication

public class MyApplication extends Application {

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

}

Puis ajoutez-le dans le fichier mainfest et dans la balise d'application

 <application
    android:allowBackup="true"
    android:name=".gps.navigation.map.MyApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"></application>

Après cela dans votre activité principale, supprimez appcompactactivity si nécessaire et étendez votre classe avec l'activité, cela fonctionnera alors.

 0
Author: Najaf Ali, 2018-01-25 12:31:41

Je développe une application basée sur Eclipse également connue sous le nom de RCP (Rich Client Platform). Et j'ai été confronté à ce problème après le refactoring (déplacement d'une classe d'un plugIn vers une nouvelle).

Le nettoyage du projet et la mise à jour Maven n'ont pas aidé.

Le problème a été causé par le Bundle-Activator qui n'a pas été mis à jour automatiquement. Mise à jour manuelle de l'activateur de bundle sous MANIFEST.MF dans le nouveau PlugIn a résolu mon problème.

 0
Author: Aleksandr Khomenko, 2018-04-06 08:41:28

Si vous avez récemment ajouté le support multidex dans Android studio comme ceci:

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

Votre solution est donc simplement étendue à partir de MultiDexApplication au lieu de Application

public class MyApp extends MultiDexApplication {
 0
Author: do01, 2018-04-30 06:36:14

Vérifiez que si vous avez un gestionnaire statique dans votre classe, si c'est le cas, veuillez faire attention, car le gestionnaire statique ne peut être initié que dans un thread qui a un boucleur, le crash pourrait être déclenché de cette façon:

1.tout d'abord, créez l'instance de class dans un thread simple et attrapez le crash.

2.ensuite, appelez la méthode field de la classe dans le thread principal, vous obtiendrez le NoClassDefFoundError.

Voici le code de test:

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

}

Dans votre méthode onCrete de Main activité, ajouter test code partie:

@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
}

Il existe un moyen simple de le réparer en utilisant un handlerThread to init handler:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}
 0
Author: Michael, 2018-09-27 13:50:24