Comment résoudre ClassNotFoundException?

106

J'essaie d'exécuter une application Java, mais j'obtiens cette erreur:

java.lang.ClassNotFoundException:

Après les deux-points vient l'emplacement de la classe qui manque. Cependant, je sais que cet emplacement 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 des classes?

user2426316
la source
1
Vous devez ajouter le pot qui a la classe manquante à la classptah
Crom
si votre classe a un package, allez dans le dossier contenant la classe. Par exemple, si le package est le package test.abc, allez dans le dossier avant le test, puis faites java -cp. test.abc.CLASSNAME (sans .class). S'il n'y a pas de paquet, allez dans le dossier contenant la classe et dites java -cp. CLASSNAME
Facultatif
Soit une classe n'a pas été déployée sur votre runtime (par exemple jar manquant), soit la classe n'est pas visible dans un chargeur de classe donné, vérifiez cet outil qui aide à résoudre ces problèmes: jhades.org
Angular University
1
Je rencontre aussi cela parfois. Cette exception viole clairement la règle qui consiste à indiquer tout le contexte nécessaire dans un message d'exception. Il doit mentionner il a essayé de chercher la chose, ce qui se trouve sur votre chemin de classe. Veuillez créer de meilleurs messages d'exception. Ne nous faites pas chercher des informations qui pourraient aider à résoudre le problème.
masterxilo

Réponses:

32

Votre classpath est cassé (ce qui est un problème très courant dans le monde Java).

Selon la façon dont vous démarrez votre application, vous devez réviser l'argument de -cp, votre entrée Class-Path dans MANIFEST.MF ou votre disposition de disque.

Thorbjørn Ravn Andersen
la source
34
Pouvez-vous être plus spécifique à l'éclipse? Que dois-je faire?
user2426316
24
Votre question ne contient pas suffisamment d'informations pour fournir une réponse plus précise. Pensez à ajouter cela.
Thorbjørn Ravn Andersen
Les incompatibilités de résolution / version des dépendances sont un problème très courant dans pratiquement tous les environnements de programmation. Nous pourrions dire que tout ce qu'un programme fait, c'est résoudre de telles définitions ... la question est toujours de savoir quelle / où est la définition et quelle version voulez-vous dire?
masterxilo
2
Je souligne simplement qu'outre le monde Java, tous les logiciels se battent pour s'assurer que les versions correctes des dépendances sont trouvées. Je peux citer dll-hell, les gestionnaires de paquets, les gestionnaires de version, la nomenclature de printemps et les conteneurs de docker comme exemples de ce problème et des solutions possibles. Plus la fraction de code étranger est grande, plus le problème s'aggrave.
masterxilo
@masterxilo Oui, mais ce n'est pas nécessairement le problème ici et vous pouvez aboyer dans le mauvais arbre. Tout ce que l'on peut dire, c'est que le chemin des classes est cassé.
Thorbjørn Ravn Andersen
45

Un classpath est une liste d'emplacements à partir desquels charger les 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 j'essaye de charger une classe com.mycompany.Foo , il cherchera sous le répertoire des classes un répertoire appelé com , puis sous celui-ci un répertoire appelé mycompany , et enfin, il cherchera un fichier appelé Foo.class dans ce répertoire.

Dans le second cas, pour les fichiers jar, il recherchera le fichier jar pour cette classe. Un fichier jar n'est en réalité qu'une collection compressée de répertoires comme ci-dessus. Si vous décompressez un fichier jar, vous obtiendrez un tas de répertoires et de fichiers de classe suivant le modèle ci-dessus.

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

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

La JVM essaiera d'abord de chercher dans les classes du répertoire , puis dans stuff.jar et enfin dans otherstuff.jar .

Lorsque vous obtenez une ClassNotFoundException, cela signifie que la machine virtuelle Java a parcouru tout le chemin de classe et n'a pas trouvé la classe que vous avez tenté de référencer. La solution, comme souvent dans le monde Java, est de vérifier votre chemin de classe.

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 qu'Eclipse, vous aurez une option de menu pour spécifier votre chemin de classe.

user2000590
la source
13

C'est la meilleure solution que j'ai trouvée jusqu'à présent.

Supposons que nous ayons un package appelé org.mypackagecontenant les classes:

  • HelloWorld (classe principale)
  • SupportClass
  • UtilClass

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

La structure du fichier ressemblera à ceci: entrez la description de l'image ici

Lorsque nous invoquons Java, nous précisons le nom de l'application à exécuter: org.mypackage.HelloWorld. Cependant, nous devons également indiquer à Java où chercher les fichiers et répertoires définissant notre package. Donc, pour lancer le programme, nous devons utiliser la commande suivante: entrez la description de l'image ici

REMARQUE: vous devez exécuter la javacommande ci-dessus, quel que soit votre emplacement actuel. Mais ce n'est pas le cas javac. Pour la compilation, vous pouvez même aller directement dans le répertoire où vous avez vos .javafichiers et exécuter directement javac ClassName.java.

Ram Patra
la source
6

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

sous Windows

java -classpath .;yourjar.jar YourMainClass

sous UNIX / Linux

java -classpath .:yourjar.jar YourMainClass
Juned Ahsan
la source
4

Essayez-les si vous utilisez maven. J'utilise maven pour mon projet et quand je fais mvn clean installet essaie d'exécuter un programme, il lève l'exception. Donc, je nettoie le projet et le relance et cela fonctionne pour moi.

J'utilise eclipse IDE.

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

Arun
la source
dans quel répertoire étiez-vous lorsque vous avez exécuté "mvn clean test"? est-il dans le même répertoire que le POM?
TacoB0t
1
Oui. Ran it à partir du répertoire où le fichier pom est présent.
Arun
3

Pour ajouter l'emplacement d'une classe à votre chemin de classe via la ligne de commande, ajoutez simplement -cpou -classpathet 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 sur project -> build path -> configure build path et ajouter le JAR externe contenant votre classe au chemin de construction, cela devrait fonctionner correctement.

invictvs1
la source
3

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

Kiran S Kulkarni
la source
5
C'est sur windows (point-virgule), sur unix / linux c'est ':' (deux-points)
Joeblade
3

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

Les moyens n'ont pas fonctionné pour moi:

1) Utilisation de l' -cpoption avec le chemin complet du fichier jar.

2) Utilisation -cp uniquement avec le nom du pot lorsqu'il se trouve dans le dossier actuel

3) Copie du pot dans le dossier du projet actuel

4) Copie du fichier jar à l'emplacement standard des fichiers java (/ usr / share / java)

Cette solution est rapportée pour la classe com.mysql.jdbc.Driver dans mysql-connector-java.5 - *. Jar, fonctionnant sous linux avec OpenJDK version 1.7

Personne annonyme
la source
Seule la décompression du JAR a fonctionné pour moi, aucune des autres solutions n'a fonctionné
OverCoder
2

Montez en haut et supprimez l'instruction d'importation s'il y en a une, puis réimportez la classe. Mais si ce n'est pas le cas, nettoyez puis construisez. Utilisez-vous Netbeans ou Eclipse?

ignames
la source
2

J'ai rencontré cela aussi 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é.

Jason Robertson
la source
2
  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, créant un objet sérialisable dans un dossier spécifique. Vous avez maintenant besoin des données désaréalisé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.

Omar Faroque Anik
la source
2

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

ibrahimgunes
la source
2

je viens de faire

1. invalider les caches et redémarrer

2. J'ai reconstruit mon projet qui a résolu le problème

Jyoti JK
la source
1

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

Dani Aya
la source
1

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)

s5s
la source
1

Si vous avez ajouté plusieurs bibliothèques (tierces) ** et une classe d' application Extends **

Cela pourrait alors arriver.

Pour cela, vous devez définir multiDexEnabled trueet remplacer votre Applicationclasse étendue par MultiDexApplication.

Il sera résolu.

Parth Patel
la source
1

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

Compte tenu des informations, je supposerai que vous essayez peut-être une approche basique du codage, de la construction / compilation et de l'exécution d'une application console simple comme "Hello World", en utilisant un simple éditeur de texte et un certain Command Shell.

Cette erreur se produit dans le scénario de mise en jachère:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

En d'autres termes, utilisez:

..\SomePath>java HelloWorld

PS L'ajout de l'extension de fichier .class produit la même erreur. Assurez-vous également d'avoir le dossier bin de Java (JDK / JRE) dans le PATH des variables d'environnement du système d'exploitation. (Recherchez plus de détails sur d'autres articles à ce sujet)

Vasil
la source
1

Si vous utilisez maven, vérifiez que vous avez ce plugin dans votre pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

Cela mettra votre dépendance (la raison de l'exception) dans votre fichier jar.

FYI : cela inclura toutes les dépendances gonflées dans le pot final

techkuz
la source
@Archit ajouté.
techkuz le
0

Dans mon cas, la classe lancée en tant qu'exception de classe non trouvée a des propriétés liées aux certificats SSL. Fermez l'éclipse et ouvrez en tant que «Exécuter en tant qu'administrateur», puis le problème a été résolu. Comme eclipse a une autorisation liée à un problème, elle lèvera ce type d'exception.

Shaik Elias
la source
-7

Mettez tout le code dans le bloc try puis attrapez l'exception dans un bloc catch

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}
sharukh
la source
5
Cela ne résout pas l'exception. Cela cache l'exception. De plus, "e1.getmessage ()" est a) la mauvaise capitalisation de getMessage () et b) ne va pas faire grand-chose car il renvoie une chaîne avec un message et vous ne l'imprimez pas ou ne l'enregistrez pas ou quoi que ce soit!
IBBoard