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.java
fichier 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 Main
classe dans le graphics
package (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.
la source
package graphics;
en haut). Estgraphics
la tête de la structure de votre package? Square a-t-ilpackage graphics.shapes
en haut?Réponses:
Après avoir compilé votre code, vous vous retrouvez avec des
.class
fichiers pour chaque classe de votre programme. Ces fichiers binaires sont le bytecode que Java interprète pour exécuter votre programme. LeNoClassDefFoundError
indique que le chargeur de classe (dans ce casjava.net.URLClassLoader
), qui est responsable du chargement dynamique des classes, ne peut pas trouver le.class
fichier 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.URLClassLoader
de classe (en particulier ) recherchera les classes du package abc 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 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 classeFoo.class
. Disons par exemple que votre répertoire de travail est.../project/
. Ce fichier de classe doit être placé dans.../project/com/example
et 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.
la source
Je voudrais corriger le point de vue des autres
NoClassDefFoundError
.NoClassDefFoundError
peut se produire pour plusieurs raisons commeDans 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"?
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"?
Par exemple: deux classes, A et B (étend A). Le code a
A a = Class.forName ("B"). NewInstance ();
la source
package app;
et recompiler avant de pouvoir la déplacer dans l'application de sous-répertoire.NoClassDefFoundError
pour ce cas: archive.is/YPbYI#selection-2107.0-2115.13NoClassDefFoundError
signifie 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
,linepoints
etspaceobjects
que les entrées dans le.classpath
fichier.la source
si vous obtenez l'une de ces erreurs lors de la compilation et de l'exécution:
-------------------------- 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.
la source
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.
la source
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:
}
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)
la source
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:
La classe n'est pas disponible dans Java Classpath.
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.
Tout script de démarrage remplace la variable d'environnement Classpath.
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.
Recherchez java.lang.ExceptionInInitializerError dans votre fichier journal. NoClassDefFoundError en raison de l'échec de l'initialisation statique est assez courant.
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:
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.
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.
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
la source
Si votre projet est dans un package comme
com.blahcode
et que votre classe est appeléeMain
, 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
cd
celui qui contientcom
comme sous-répertoire.la source
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.
la source
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.
la source
J'ai fait face au problème aujourd'hui. J'ai un projet Android et après avoir activé
multidex
le 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 class
et invoquée avant tout le reste.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
la source
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.
la source
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 à uneNoClassDefFoundError
erreur.la source
~
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 utilisezbash
, vous pouvez obtenir des résultats "mitigés". Par exemple, regardez ce que vous obtenez lorsque vous tapezecho ~:~
sur la ligne de commande. Le premier~
est développé, mais pas le second.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.
la source
Cela m'est arrivé dans Android Studio.
La solution qui a fonctionné pour moi: redémarrez simplement le studio.
la source
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.
la source
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"
la source
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 lebin
répertoire dans l'espace=> classes
de travail Eclipse dansmetadata
pour Tomcat mais que je n'avais pas également ajouté de synchronisation de dossier pour leextlib
répertoire dans Eclipse=>
C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib
la source
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.
la source
si vous avez récemment ajouté le support multidex dans Android Studio comme ceci:
de sorte que votre solution consiste simplement à étendre De MultiDexApplication au lieu d'Application
la source
Si vous utilisez plusieurs modules, vous devriez avoir
dans votre fichier de construction.
la source
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:
dans votre méthode onCrete d'activité principale, ajoutez une partie de code de test:
il existe un moyen simple de le corriger en utilisant un gestionnaire handlerThread pour lancer le gestionnaire:
la source
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.
la source
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:
pom:
la source
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.
la source
si vous utilisez
gradlew
, accédez à./gradle/wrapper/gradle-wrapper.properties
et passezdistributionUrl
à la version correcte de gradle.Si vous utilisez JDK14, essayez
la source
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é.
la source