Java : que veut dire le message d'erreur Could not find or load main class ?

L'erreur Could not find or load main class ... se produit lorsque Java n'a pas pu trouver une classe lors de l'exécution de la commande.

L'erreur Could not find or load main class ... se produit lorsque Java n'a pas pu trouver une classe lors de l'exécution de la commande (les ... dans l'erreur sont remplacés par le nom de la classe que Java a recherchée). Elle peut se produire dans différents cas.

Le cas le plus courant a lieu lorsque l'on utilise directement Java en ligne de commande. La syntaxe pour utiliser la commande Java avec une classe est java [options] nom_de_la_classe [arguments]. Java va alors chercher la classe, la charger, chercher la méthode avec la signature static void main(String[]), puis exécuter cette méthode en lui donnant en arguments les arguments de l'exécution de la commande. Voici un exemple de commande Java :

java com.test.exemple.utilisateur joe

Ici, la classe appelée est la classe utilisateur, issu du package com.test.exemple et l'argument passé à la méthode main est la chaîne de caractères joe. Si cette erreur se produit, il faut tout d'abord vérifier que le nom de la classe est parfaitement écrit (pas de faute de frappe en écrivant le nom, respect de la casse). Si la classe est incluse dans un package, il faut que ce package soit écrit dans la commande. Il faut bien utiliser un nom de classe et non un nom de fichier pour la commande.

Voici quelques erreurs possibles :

# erreur car il manque le package
java utilisateur joe
# erreur dans le nom de la classe
Java com.test.exemple.utilisateur joe
# erreur car c'est un fichier qui est inscrit
Java com/test/exemple/utilisateur.class joe

Si le nom de la classe est correct, alors l'erreur provient du fait que Java ne trouve pas la classe. Il faut alors regarder la variable d'environnement Classpath et vérifier que la classe est accessible à partir des répertoires présents dans cette variable. Si l'on ne souhaite pas modifier cette variable, alors il faut vérifier qu'elle est disponible depuis le répertoire où l'on exécute la commande. On peut également indiquer un chemin relatif afin de trouver la classe :

java ../usr/local/com.test.exemple.utilisateur joe

Il faut également bien distinguer le répertoire où se trouve le fichier du package, qui correspond aussi à des répertoires. Notre classe d'exemple com.test.exemple.utilisateur signifie que la classe se trouve dans le répertoire com/test/exemple/. Dans la variable Classpath ou dans la commande, il faut inclure le chemin qui mène jusqu'au répertoire com et non pas jusqu'au fichier de la classe.

Si vous avez du mal à comprendre toutes ces notions, la documentation d'Oracle vous aidera à trouver votre erreur :

http://docs.oracle.com/javase/7/docs/technotes/tools/Windows/java.HTML
http://docs.oracle.com/javase/7/docs/technotes/tools/Windows/classpath.HTML
http://docs.oracle.com/javase/tutorial/essential/environment/paths.HTML

Si vous exécutez un fichier JAR exécutable avec la commande java -jar, l'erreur peut également se produire. Si c'est le cas, il faut regarder le fichier MANIFEST présent dans l'archive. Ce fichier contient entre autres le Classpath et le nom de la classe utilisée comme point d'entrée pour l'application.

Si vous travaillez avec un IDE (par exemple, Eclipse ou Netbeans), cette erreur ne peut pas se produire en principe, car c'est l'environnement de développement qui gère les noms de classes et les chemins d'exécution. Mais l'erreur peut apparaître si vous avez modifié des fichiers en dehors de l'IDE sans le lui avoir indiqué. Ainsi, si vous avez préparé le lancement d'une application mais que vous déplacez la classe principale de l'application dans un autre répertoire et que vous ne l'indiquez pas à l'IDE, le lancement de l'application échouera. Il faut penser dans ce cas-là à vérifier si l'IDE signale des références vers des classes cassées ou un problème signalé dans la configuration du lanceur d'applications.

Java