Impossible de trouver ou de charger la classe principale en Java

Le message "Erreur : impossible de trouver ou de charger la classe principale" apparaît lorsqu'on lance une application Java en ligne de commande et que la JVM ne parvient pas à trouver ou charger la classe spécifiée comme point d'entrée. Pas de panique : la cause est presque toujours triviale.

Le message typique

$ java MonApplication
Erreur : impossible de trouver ou de charger la classe principale MonApplication
Cause : java.lang.ClassNotFoundException: MonApplication

Cause n° 1 : ajouter l'extension .class

Erreur classique des débutants :

# ❌ Incorrect : Java pense qu'il s'agit d'une classe nommée "MonApplication.class"
java MonApplication.class

# ✅ Correct : pas d'extension
java MonApplication

L'outil java attend un nom de classe qualifié, pas un nom de fichier.

Cause n° 2 : mauvais répertoire de travail

La JVM cherche la classe dans le classpath, qui par défaut inclut seulement le répertoire courant (.). Si votre fichier MonApplication.class est ailleurs, elle ne le trouvera pas.

ls  # doit montrer MonApplication.class
java MonApplication

Sinon, indiquez explicitement le classpath avec -cp :

java -cp /chemin/vers/dossier/classes MonApplication

Cause n° 3 : omettre le package

Si la classe est déclarée dans un package, son nom complet est package.ClassName. Vous devez utiliser le nom entièrement qualifié :

package com.example;

public class MonApplication {
    public static void main(String[] args) { ... }
}

Et le lancement :

# ❌ Incorrect
java MonApplication

# ✅ Correct
java com.example.MonApplication

Important : vous devez vous placer au-dessus du dossier com/, ou l'inclure dans le classpath.

# Structure des fichiers :
#   projet/classes/com/example/MonApplication.class

cd projet/classes
java com.example.MonApplication

# OU
java -cp projet/classes com.example.MonApplication

Cause n° 4 : classpath incorrect avec -cp

Le flag -cp (ou -classpath) écrase le classpath par défaut. Si vous le spécifiez sans inclure le dossier courant, Java ne trouvera pas les classes compilées dans . :

# ❌ Le dossier courant est exclu
java -cp lib/mylib.jar MonApplication

# ✅ Ajoutez explicitement le dossier courant
java -cp .:lib/mylib.jar MonApplication       # Linux/macOS
java -cp .;lib\mylib.jar MonApplication       # Windows

Attention au séparateur : : sur Unix, ; sur Windows.

Cause n° 5 : un JAR exécutable sans Main-Class

Pour un JAR, la classe principale doit être déclarée dans le MANIFEST.MF :

Manifest-Version: 1.0
Main-Class: com.example.MonApplication

Lancement :

java -jar mon-app.jar

Si le manifeste est absent ou la Main-Class incorrecte, vous aurez l'erreur.

Cause n° 6 : classe publique et fichier mal nommé

Java exige que le nom du fichier source corresponde exactement à celui de la classe publique qu'il contient. Si MonApplication.java contient public class monapplication (minuscule), ça compile, mais le fichier généré s'appelle monapplication.class — et java MonApplication ne le trouvera pas sur un système sensible à la casse.

Diagnostic en 3 étapes

  1. Vérifier que le fichier .class existe dans le bon dossier :
    find . -name "*.class"
  2. Vérifier le nom de package en tête du fichier source ;
  3. Reconstruire avec javac et lancer dans la foulée :
    javac -d out src/com/example/MonApplication.java
    java -cp out com.example.MonApplication

Avec Eclipse ou IntelliJ

Quand l'erreur apparaît dans l'IDE :

  • Eclipse : Project → Clean… puis relancer. Vérifiez que Project → Build Automatically est coché.
  • IntelliJ : Build → Rebuild Project, puis vérifier la configuration Run/Debug — le Module classpath doit inclure votre module.

Neuf fois sur dix, un clean + rebuild suffit à régler l'erreur dans un IDE.

Vérification express

Créez le plus petit exemple reproductible possible :

// Fichier : Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("OK");
    }
}
javac Hello.java
java Hello

Si ce test échoue, votre installation Java est en cause (PATH, JAVA_HOME). S'il fonctionne, le problème est dans votre projet — revenez aux causes 2 à 6 ci-dessus.