web-dev-qa-db-fra.com

Comment résoudre ClassNotFoundException?

J'essaie de lancer une application Java mais j'obtiens l'erreur suivante: 

Java.lang.ClassNotFoundException: 

Après les deux points vient l'emplacement de la classe qui manque. Cependant, je sais que cet endroit n’existe pas puisque la classe est située ailleurs. Comment puis-je mettre à jour le chemin de cette classe? Cela a-t-il quelque chose à voir avec le chemin de classe?

78
user2426316

Votre chemin de classe est cassé (problème très courant dans le monde Java). 

Selon le mode de démarrage de votre application, vous devez modifier l'argument en -cp, votre entrée Class-Path dans MANIFEST.MF ou la structure de votre disque.

26

Un classpath est une liste d'emplacements pour charger des classes. 

Ces "emplacements" peuvent être des répertoires ou des fichiers jar. 

Pour les répertoires, la JVM suivra un modèle attendu pour le chargement d'une classe. Si j'ai le répertoire C:/myproject/classes dans mon chemin de classe et que je tente de charger une classe com.mycompany.Foo , elle recherchera un répertoire appelé com , puis sous un répertoire appelé mycompany , et enfin, il recherchera un fichier appelé Foo.class dans ce répertoire.

Dans le deuxième cas, pour les fichiers JAR, il recherchera le fichier JAR pour cette classe. Un fichier JAR est en réalité juste une collection zippée de répertoires comme ci-dessus. Si vous décompressez un fichier JAR, vous obtiendrez une multitude de répertoires et de fichiers de classe en suivant le schéma ci-dessus. 

Ainsi, la machine virtuelle Java parcourt un chemin de classe du début à la fin en recherchant la définition de la classe lorsqu'elle tente de charger la définition de la classe. Par exemple, dans le classpath:

C:/myproject/classes; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

La machine virtuelle Java tente de rechercher dans le répertoire classes , puis dans stuff.jar et enfin dans otherstuff.jar .

Lorsque vous obtenez une exception ClassNotFoundException, cela signifie que la machine virtuelle Java a traversé l'intégralité du chemin d'accès aux classes et n'a pas trouvé la classe que vous avez tenté de référencer. La solution, comme cela arrive souvent dans le monde Java, consiste à vérifier votre classpath.

Vous définissez un chemin de classe sur la ligne de commande en disant Java -cp puis votre chemin de classe. Dans un IDE tel que Eclipse, vous aurez une option de menu pour spécifier votre chemin de classe.

37
user2000590

C’est la meilleure solution j’ai trouvé jusqu’à présent.

Supposons que nous ayons un paquet nommé org.mypackage contenant les classes:

  • HelloWorld (classe principale) 
  • SupportClass 
  • UtilClass

et les fichiers définissant ce paquet sont stockés physiquement dans le répertoire D:\myprogram (sous Windows) ou /home/user/myprogram (sous Linux).

La structure du fichier ressemblera à ceci:  enter image description here

Lorsque nous appelons Java, nous spécifions le nom de l'application à exécuter: org.mypackage.HelloWorld. Cependant, nous devons également indiquer à Java où chercher les fichiers et les répertoires définissant notre paquet. Donc, pour lancer le programme, nous devons utiliser la commande suivante:  enter image description here

NOTE: Vous devez exécuter la commande Java ci-dessus quelle que soit votre position actuelle. Mais ce n'est pas le cas pour javac. Pour en compilant, vous pouvez même aller directement dans le répertoire où vous avez vos fichiers .Java et exécutez directement javac ClassName.Java.

10
Ram Patra

Si vous connaissez le chemin de la classe ou le jar contenant la classe, ajoutez-le à votre chemin de classe lors de son exécution. Vous pouvez utiliser le classpath tel que mentionné ici:

sous Windows

Java -classpath .;yourjar.jar YourMainClass

sous UNIX/Linux

Java -classpath .:yourjar.jar YourMainClass
6
Juned Ahsan

Essayez-les si vous utilisez Maven. J'utilise maven pour mon projet et quand je fais mvn clean install et que j'essaie de lancer un programme, il lève l'exception. Donc, je nettoie le projet et le lance à nouveau et cela fonctionne pour moi. 

J'utilise Eclipse IDE.

Pour l'exception de classe introuvable lors de l'exécution du test Junit, essayez d'exécuter mvn clean test une fois. Il va compiler toutes les classes de test.

4
Arun

Ajoutez le chemin complet du fichier jar au CLASSPATH . Sous Linux, utilisez: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Une autre façon de travailler (sans modifier le CLASSPATH) consistait à décompresser le fichier jar dans le dossier du projet en cours.

Les moyens n'ont pas fonctionné pour moi:

1) Utilisation de l’option -cp avec le chemin complet du fichier jar.

2) Utiliser -cp avec uniquement le nom du fichier jar lorsqu'il est situé dans le dossier actuel

3) Copier le fichier jar dans le dossier du projet en cours

4) Copier le fichier jar vers l’emplacement standard des fichiers jar Java (/ usr/share/Java)

Cette solution a été signalée pour la classe com.mysql.jdbc.Driver dans mysql-connector-Java.5 - *. Jar, fonctionnant sous Linux avec OpenJDK version 1.7

3
Annonnymous Person

Utilisation ';' comme séparateur. Si vos variables d'environnement sont correctement définies, vous devriez voir vos paramètres. Si votre PATH et votre CLASSPATH sont corrects, Windows devrait reconnaître ces commandes. Vous n'avez PAS besoin de redémarrer votre ordinateur pour installer Java.

3
Kiran S Kulkarni

Pour ajouter l'emplacement d'une classe à votre chemin de classe via la ligne de commande, ajoutez simplement -cp ou -classpath et l'emplacement de la classe lors de son exécution. C'EST À DIRE.

Java -cp "c:/location/of/file" YourProgram

Ou, si vous exécutez un IDE tel qu'Eclipse, vous pouvez cliquer avec le bouton droit de la souris sur le project -> build path -> configure build path.__ et ajouter le fichier JAR externe contenant votre classe au chemin de génération, alors tout devrait fonctionner correctement.

3
invictvs1

Je me suis aussi heurté à cela et j'ai essayé toutes les autres solutions. Je n'avais pas le fichier .class dans mon dossier HTML, je n'avais que le fichier .Java. Une fois que j'ai ajouté le fichier .class, le programme a bien fonctionné.

2
Jason Robertson
  1. Cela peut arriver si votre chemin de classe n'est pas correct 

  2. Posons une classe sérialisable et une classe désérialisable sous le même nom de projet. Vous exécutez la classe sérialisable en créant un objet sérialisable dans un dossier spécifique. Vous avez maintenant besoin des données désattribuées. En attendant, si vous modifiez le nom du projet, cela ne fonctionnera pas. Vous devez d'abord exécuter la classe sérialisable, puis désérialiser le fichier. 

2
Omar Faroque Anik

Si vous utilisez maven Essayez de mettre à jour maven tous les projets et de forcer les instantanés . Il nettoiera également et reconstruira tous les classpath .. Cela résoudra mon problème ..

2
ibrahimgunes

Montez en haut et supprimez l'instruction d'importation s'il en existe une, puis importez à nouveau la classe. Mais si ce n'est pas le cas, effectuez un nettoyage, puis construisez. Utilisez-vous Netbeans ou Eclipse?

2
yams

Je viens de faire 

1.Invalider les caches et redémarrer 

2. Reconstruit mon projet qui a résolu le problème

2
Jyoti JK

Cela peut se produire sous Windows après une mise à jour Java où l'ancienne version du SDK Java est manquante et une nouvelle est présente. Je vérifierais si votre IDE utilise la version du SDK Java installée (IntelliJ: CTRL + SHIFT + ALT + S)

1
s5s

J'essayais d'exécuter .jar à partir de code C # en utilisant la classe Process. Le code Java a été exécuté avec succès à partir d'Eclipse, mais pas à partir de C # visual studio et même en cliquant directement sur le fichier jar, il s'est toujours arrêté avec une exception ClassNotFoundException:. La solution pour moi était d’exporter le programme Java en tant que "fichier JAR exécutable" au lieu de "fichier JAR". J'espère que ça peut aider quelqu'un.

1
Dani Aya

Si vous avez ajouté plusieurs bibliothèques (tiers) ** et extensions ** Application class

Ensuite, cela pourrait se produire.

Pour cela, vous devez définir multiDexEnabled true et remplacer votre classe Application étendue par MultiDexApplication.

Ce sera résolu.

0
Parth Patel

Question générique de base - Réponse générique la plus simple;)

Étant donné les informations, je pars du principe que vous essayez peut-être une approche de base en matière de codage, de construction/compilation et d’exécution d’une application console simple telle que "Hello World", en utilisant un simple éditeur de texte et un certain Command Shell.

Cette erreur se produit dans le scénario suivant:

..\SomePath>javac HelloWorld.Java
..\SomePath>Java HelloWorld.class

En d'autres termes, utilisez:

..\SomePath>Java HelloWorld

P.S. L'ajout de l'extension de fichier .class produit la même erreur . Assurez-vous également que le dossier bin de Java (JDK/JRE) se trouve dans le chemin PATH des variables d'environnement du système d'exploitation (recherchez d'autres détails à ce sujet). PPS Ai-je raison dans mes hypothèses?

0
Vasil