Comment résoudre java.lang.NoClassDefFoundError?

221

J'ai essayé à la fois l'exemple dans les tutoriels Java d'Oracle . Ils compilent tous les deux très 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 Main.javafichier 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 mal ici?

METTRE À JOUR

Après avoir mis la Mainclasse dans le graphicspackage (je l'ai ajouté package graphics;), défini le chemin de classe sur "_test" (dossier contenant des graphiques), compilé et 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.

Jonathan Lam
la source
1
En regardant votre classe principale, elle n'est pas dans un package (vous auriez package graphics;en haut). Est graphicsla tête de la structure de votre package? Square a-t-il package graphics.shapesen haut?
lreeder
1
Vous indiquez où se trouvent les fichiers .java, mais comme vous obtenez un problème d' exécution , ce qui vous intéresse réellement, c'est où se trouvent les fichiers .class et s'ils se trouvent sur votre chemin de classe ou non. Comment exécutez-vous la classe principale?
Thor84no
Il vous suffit d'
appuyer
Assurez-vous que vous tapez correctement le nom de la classe. J'obtenais cette erreur parce que je n'ai pas commencé le nom de la classe avec une lettre majuscule
Jeremy Borg
Cela se produit parfois dans IntelliJ IDEA après une refactorisation majeure. Faites un clic droit sur votre projet et sélectionnez -> Module de compilation , puis redémarrez le projet et cela devrait fonctionner à nouveau.
Zar

Réponses:

223

Après avoir compilé votre code, vous vous retrouvez avec des .classfichiers pour chaque classe de votre programme. Ces fichiers binaires sont le bytecode que Java interprète pour exécuter votre programme. Le NoClassDefFoundErrorindique que le chargeur de classe (dans ce cas java.net.URLClassLoader), qui est responsable du chargement dynamique des classes, ne peut pas trouver le .classfichier de 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 de réflexion), donc généralement cette exception signifie que votre chemin de classe n'inclut pas les classes requises. N'oubliez pas que le chargeur java.net.URLClassLoaderde classe (en particulier ) recherchera les classes du package abc dans le dossier a / b / c / dans chaque entrée de votre chemin de classe. NoClassDefFoundErrorpeut également indiquer qu'il vous manque une dépendance transitive d'un 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 auriez un fichier de classe Foo.class. Disons par exemple que votre répertoire de travail est .../project/. Ce fichier de classe doit être placé dans .../project/com/exampleet vous devez définir votre chemin de classe sur .../project/.

Note latérale: je recommanderais de profiter des outils incroyables qui existent pour les langages Java et JVM. Les IDE modernes comme Eclipse et IDEA et les outils de gestion de build comme Maven ou Gradle vous aideront à ne pas vous soucier (autant) des chemins de classe et vous concentrer sur le code! Cela dit, ce lien explique comment définir le chemin de classe lorsque vous exécutez sur la ligne de commande.

Samuel
la source
Je lis ceci en raison d'une erreur que j'ai rencontrée en essayant d'exécuter un test unitaire sur Android. Il s'avère que le NoClassDefFoundError, dans mon cas, s'est produit en raison de dépendances manquantes dans le test. Je dois penser à l'injection de dépendances pour éviter des erreurs comme celle-ci. Merci pour la réponse élaborée.
Danny typique
130

Je voudrais corriger le point de vue des autres NoClassDefFoundError.

NoClassDefFoundError peut se produire pour plusieurs raisons comme

  1. ClassNotFoundException - .class introuvable pour cette classe référencée, qu'elle soit disponible au moment de la compilation ou non (c.-à-d. Classe de base / enfant).
  2. Fichier de classe localisé, mais exception levée lors de l'initialisation des variables statiques
  3. Fichier de classe localisé, 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 packages.

Qu'est-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 ();

Qu'est-ce que cela signifie en disant "non disponible au moment de la compilation"?

  • La classe de temps 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 le nom de classe de la classe enfant, par exemple Class.forName ("nom de classe")
    Par exemple: deux classes, A et B (étend A). Le code a
    A a = Class.forName ("B"). NewInstance ();
p1nkrock
la source
Dans mon cas, j'avais compilé une classe, ils l'ont déplacée dans un répertoire appelé app. J'ai dû ajouter une ligne avec package app;et recompiler avant de pouvoir la déplacer dans l'application de sous-répertoire.
taco
1
En dehors de la liste 3 ci-dessus, ClassLoaders peut également provoquer une telle erreur, qui est essentiellement ClassNotFoundException, dans ce scénario, la classe peut se présenter dans classpath mais tenter de charger à partir de ClassLoader différents
Fahad
2 et 3 sont spécifiques au chargeur de classe. Selon le javadoc, l'exception est uniquement destinée à la raison 1.
Samuel
1
J'ai testé le cas 2 et le cas 3, ce n'est pas NoClassDefFoundError, c'est ExceptionInInitializerError Cas 2.Class file found, mais Exception levée lors de l'initialisation des variables statiques Case 3.Class file located, Exception levée lors de l'initialisation des blocs statiques
Michael
1
@Michael, Ce lien indique que votre stacktrace s'affichera également NoClassDefFoundErrorpour ce cas: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier
15

NoClassDefFoundErrorsignifie que la classe est présente dans le chemin de classe à Compile time, mais qu'elle n'existe pas dans le chemin de classe à Runtime.

Si vous utilisez Eclipse, assurez - vous que vous avez la shapes, linepointset spaceobjectsque les entrées dans le .classpathfichier.

Konstantin Yovkov
la source
1
Comment gérer cela en runtime via try / catch ?
Maveň
5
Cette réponse n'est pas correcte dans la façon dont vous l'écrivez. Le correct serait: "UNE des causes possibles de cette erreur est ...." Mais il peut y avoir d'autres raisons pour lesquelles vous obtenez cette erreur, par exemple lors du chargement d'un fichier JAR au moment de l'exécution avec un chargeur de classe.
Elmue
13

si vous obtenez l'une de ces erreurs lors de la compilation et de l'exécution:

* 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)

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

le problème est principalement dans l'organisation des packages. Vous devez organiser vos classes dans des dossiers correctement en ce qui concerne les classifications de package 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]
sami
la source
Le "-d". dans la commande javac fait l'affaire, créant la structure de dossiers des packages au lieu de mettre tous les fichiers .class dans le répertoire racine, merci!
Jorge Sampayo
9
java.lang.NoClassDefFoundError

indique que quelque chose a été trouvé au moment de la compilation mais pas au moment de l' exécution . il suffit peut-être de l'ajouter au chemin de classe.

sschrass
la source
15
Comment faire ça?
Narendra Singh
dépend du contexte que vous demandez.
sschrass
6

Aucune exception de définition de classe ne se produit lorsque la classe souhaitée n'est pas trouvée dans le chemin d'accès aux classes. Au moment de la compilation: la classe a été générée à partir du compilateur Java, mais au moment de l'exécution, la classe dépendante est introuvable.

Voyons 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 soient placés dans un dossier, disons "NoClassDefinationFoundExceptionDemo"

Maintenant, ouvrez un shell (en supposant que Java est déjà configuré correctement)

  1. Accédez au 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 que ClassA.class et ClassB.class
  4. Maintenant, puisque nous remplaçons ClassPath par le répertoire de travail actuel, nous exécutons donc la commande suivante java -cp. ClassA et cela a fonctionné avec succès et vous verrez la sortie à l'écran
  5. Maintenant, disons que vous avez supprimé le fichier ClassB.class du répertoire actuel. et maintenant vous exécutez à nouveau la commande. java -cp. ClassA Maintenant, il vous accueillera avec NoClassDefFoundException. car ClassB qui est une dépendance pour ClassA ne se trouve pas dans le chemin de classe (c'est-à-dire le répertoire de travail actuel).
bharatj
la source
5

NoClassDefFoundError en Java:

Définition:

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

Causes possibles:

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

  2. Vous exécutez peut-être votre programme à l'aide de la commande jar et la classe 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, elle peut également survenir si l'une des dépendances comme la bibliothèque native n'est pas disponible.

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

  6. Si vous travaillez dans un environnement J2EE, la visibilité de Class sur plusieurs Classloaders peut également provoquer java.lang.NoClassDefFoundError, voir les exemples et la section de scénario 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 chemin de classe de l'application est correct, mais la variable d'environnement Classpath est remplacée 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 dans Java J2EE

java.lang.NoClassDefFoundError - Comment résoudre l'erreur No Class Def Found

Affy
la source
3

Si votre projet est dans un package comme com.blahcodeet 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 utiliser cdcelui qui contient comcomme sous-répertoire.

cd out
java -classpath . com.blahcode.Main
Hypershadsy
la source
1

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

Ed S
la source
1

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

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

Cependant, lors de l'enquête, la classe non 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 build. Ces faits indiquent qu'il ne s'agit peut-être pas d'un problème de dépendance Maven.

La solution éventuelle: redémarrez le service!

Il semble que la mise à niveau de rpm ait invalidé le descripteur 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 dans sa liste de descripteurs de fichier jar et n'a pas pu la trouver car le descripteur de fichier à partir duquel il pouvait charger la classe avait été invalidé. 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 de rpm.

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

John Chesshir
la source
1

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

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

 MultiDex.install(this);

Suivez ce didacticiel pour activer correctement le multidex. 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);
  }
CROSP
la source
1

Pour mon projet, ce qui a résolu le problème était que le navigateur Chrome et le chromedriver n'étaient pas compatibles. J'avais une très ancienne version du pilote qui ne pouvait même pas ouvrir le navigateur. Je viens de télécharger la dernière version des deux et le problème a été résolu. Comment ai-je découvert le problème? Parce que j'ai exécuté mon projet en utilisant le pilote Firefox natif de Selenium avec une ancienne version de FF inculquée à mon application, je me suis alors rendu compte que le problème était une incompatibilité entre navigateur et pilote.

J'espère que cela peut aider toute personne ayant un problème similaire au mien, qui a généré ce même message d'erreur.

Kyon Perez
la source
0

Mes deux cents dans cette chaîne:

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

khkarens
la source
C'est vrai en partie, mais c'est plus compliqué. 1) Vous pouvez utiliser des chemins relatifs dans le chemin de classe, mais ils doivent être résolus par la JVM ... par rapport au répertoire actuel de la JVM. Cela les rend fragiles . 2) Vous pouvez utiliser ~et d'autres méta-caractères du shell lors de la définition d'une variable d'environnement classpath, mais uniquement à condition que le mécanisme que vous utilisez pour définir la variable les développe en noms de chemin réels. Si vous utilisez bash, vous pouvez obtenir des résultats "mitigés". Par exemple, regardez ce que vous obtenez lorsque vous tapez echo ~:~sur la ligne de commande. Le premier ~est développé, mais pas le second.
Stephen C
0

J'obtiens 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 classe se trouvent dans différents domaines de sécurité (selon java), le jvm ne permettra pas aux classes déjà chargées par le rootloader d'être résolues dans l'espace d'adressage du chargeur d'exécution.

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

Il produit une sortie affichant la classe chargée, et le chargeur env 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;
            }
        });
    }
}
codeDr
la source
0

Cela m'est arrivé dans Android Studio.

La solution qui a fonctionné pour moi: redémarrez simplement le studio.

danois
la source
0

J'ai eu le même problème avec mon développement Android en utilisant Android studio. Les solutions proposées 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 avec Android Studio. modifiez le paramètre comme ci-dessous Préférences -> Build, Execution, Deployment -> Instant Run -> décochez la première option.

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

masque
la source
0

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

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

Cela explique pourquoi la compilation et l'exécution fonctionnent bien, étant donné que le pot est là, alors que le nettoyage et la construction échouent. N'oubliez pas de définir les bibliothèques jar nouvellement ajoutées dans la configuration proguard!

Notez que les messages d'erreur de Proguard ne sont vraiment pas à la hauteur, car ils sont facilement confondus avec des messages de fourmis similaires arrivant lorsque le pot n'est pas là du tout. Ce n'est que tout en bas qu'il y aura une petite pointe de proguard en difficulté. Par conséquent, il est tout à fait logique de commencer à rechercher des erreurs de chemin de classe traditionnelles, etc., mais ce sera en vain.

De toute évidence, l'exception NoClassDefFound sera le résultat lors de l'exécution, par exemple le fichier exécutable résultant construit et basé sur un manque de cohérence de proguard. Certains l'appellent proguard "Hell"

carl
la source
0

J'utilise le plugin FileSync pour Eclipse afin de pouvoir vivre le débogage sur Tomcat et j'ai reçu NoClassFoundErrorparce que j'avais ajouté une entrée de synchronisation pour le binrépertoire dans l'espace => classesde travail Eclipse dans metadatapour Tomcat mais que je n'avais pas également ajouté de synchronisation de dossier pour le extlibrépertoire dans Eclipse=>

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

Stuart Cardall
la source
0

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 refactoring (déplacement d'une classe d'un plug-in vers une nouvelle).

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

Le problème est dû au Bundle-Activator qui n'a pas été mis à jour automatiquement. La mise à jour manuelle du Bundle-Activator sous MANIFEST.MF dans le nouveau plugin a résolu mon problème.

Aleksandr Khomenko
la source
0

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'

de sorte que votre solution consiste simplement à étendre De MultiDexApplication au lieu d'Application

public class MyApp extends MultiDexApplication {
do01
la source
0

Si vous utilisez plusieurs modules, vous devriez avoir

dexOptions {
    preDexLibraries = false
}

dans votre fichier de construction.

Matin Petrulak
la source
0

Vérifiez que si vous avez un gestionnaire statique dans votre classe. Si c'est le cas, soyez prudent, car seul le gestionnaire statique pourrait être initié dans le thread qui a un looper, le crash pourrait être déclenché de cette façon:

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

2.appelez ensuite la méthode field de Class 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 d'activité principale, ajoutez une partie de code de test:

@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 corriger en utilisant un gestionnaire handlerThread pour lancer le gestionnaire:

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

N'utilisez pas de classes de test en dehors du module

Je n'ai pas de solution, juste une autre saveur du cas "présent à la compilation, absent au moment de l'exécution".

J'essayais d'utiliser une méthode très pratique à partir d'une classe de test JUnit d'une autre classe de test qui réside dans un module différent. C'est un non-non, car le code de test ne fait pas partie du pot emballé, mais je ne m'en suis pas rendu compte car il semble visible pour la classe d'utilisateurs depuis Eclipse.

Ma solution a été de placer la méthode dans une classe d'utilitaires existante qui fait partie du code de production.

manuelvigarcia
la source
0

Dans mon environnement, je rencontre ce problème dans le test unitaire. Après avoir ajouté une dépendance de bibliothèque à * .pom, ce problème est résolu.

par exemple:

Message d'erreur:

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
la source
0

J'ai eu cette erreur après un changement de branche Git. Pour le cas spécifique d'Eclipse, il y avait des lignes manquées dans le répertoire .settings du fichier org.eclipse.wst.common.component. Comme vous pouvez le voir ci-dessous

La restauration des dépendances du projet avec Maven Install serait utile.

entrez la description de l'image ici

Leonardo
la source
0

si vous utilisez gradlew, accédez à ./gradle/wrapper/gradle-wrapper.propertieset passez distributionUrlà la version correcte de gradle.

Si vous utilisez JDK14, essayez

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
ehacinom
la source
-1

Cela arrive souvent avec mes appareils Genymotion. Assurez-vous que vous disposez d'une bonne quantité de mémoire sur votre lecteur sur lequel Genymotion est installé.

totteire
la source
Avez-vous une référence pour cela?
Wai Ha Lee
Non, je viens de manquer d'espace disque régulièrement et à moins que je libère une bonne quantité + supprime / réinstalle un périphérique virtuel Genymotion, je continue à recevoir cette erreur.
totteire