1694 votes

Que signifie "Impossible de trouver ou de charger la classe principale" ?

Un problème courant que rencontrent les nouveaux développeurs Java est que leurs programmes ne s'exécutent pas avec le message d'erreur : Could not find or load main class ...

Qu'est-ce que cela signifie, quelles en sont les causes et comment y remédier ?

1519voto

Stephen C Points 255558

Le site java <class-name> syntaxe des commandes

Tout d'abord, vous devez comprendre la manière correcte de lancer un programme à l'aide de la fonction java (ou javaw ).

La syntaxe normale 1 c'est ça :

    java [ <option> ... ] <class-name> [<argument> ...]

<option> est une option de ligne de commande (commençant par le caractère "-"), <class-name> est un nom de classe Java entièrement qualifié, et <argument> est un argument de ligne de commande arbitraire qui est passé à votre application.

1 - Il existe une deuxième syntaxe pour les fichiers JAR "exécutables" que je décrirai en bas de page.

Par exemple :

    java -Xmx100m com.acme.example.ListUser fred

Ce que cela va faire est le suivant :

  1. Recherchez la version compilée de l com.acme.example.ListUser classe.
  2. Charger la classe.
  3. Vérifiez que la classe possède un main avec la signature static void main(String[]) .
  4. Appelez cette méthode en lui transmettant les arguments de la ligne de commande sous forme de fichier String[] .

Raisons pour lesquelles Java ne peut pas trouver la classe

Lorsque vous obtenez le message "Could not find or load main class ...", cela signifie que la première étape a échoué. Le site java n'a pas été en mesure de trouver la classe. Et en effet, le "..." dans le message sera le nom de classe entièrement qualifié que java recherche.

Alors pourquoi ne peut-il pas trouver la classe ? En fait, il y a deux causes principales :

La première cause probable est que vous avez peut-être fourni le mauvais nom de classe. (Ou ... le bon nom de classe, mais sous une forme erronée). mauvaises manières pour spécifier le nom de la classe :

  • Exemple n° 1 - un nom de classe simple :

    ListUser
  • Exemple n° 2 - un nom de fichier ou un chemin d'accès plutôt qu'un nom de classe :

    ListUser.class
    com/acme/example/ListUser.class
  • Exemple n° 3 - un nom de classe dont la casse est incorrecte :

    com.acme.example.listuser
  • Exemple n° 4 - une faute de frappe

    com.acme.example.mistuser

La deuxième cause probable est que le nom de la classe est correct, mais que l'option java ne peut pas trouver la classe. Pour comprendre cela, vous devez comprendre le concept de "classpath". Ceci est expliqué bien par la documentation d'Oracle :

Donc ... si vous avez spécifié le nom de la classe correctement, la prochaine chose à vérifier est que vous avez spécifié le classpath correctement :

  1. Lisez les trois documents liés ci-dessus. (Oui ... LISEZ-les.)
  2. Regardez la ligne de commande et / ou la variable d'environnement CLASSPATH qui est en vigueur lorsque vous exécutez la commande java commande. Vérifiez que les noms des répertoires et des fichiers JAR sont corrects.
  3. S'il y a relatif dans le classpath, vérifiez qu'ils se résolvent correctement ... à partir du répertoire courant qui est en vigueur lorsque vous exécutez la commande java commandement.
  4. Vérifiez que la classe (mentionnée dans le message d'erreur) peut être localisée dans le répertoire de l'utilisateur. efficace classpath.

Notes supplémentaires :

  1. Lorsque vous placez un répertoire sur le classpath, il correspond théoriquement à la racine de l'espace de nom qualifié. Les classes sont situées dans la structure de répertoires sous cette racine, en faisant correspondre le nom pleinement qualifié à un chemin d'accès . Ainsi, par exemple, si "/usr/local/acme/classes" se trouve dans le chemin des classes, alors lorsque la JVM recherche une classe appelée com.acme.example.Foon il cherchera un fichier ".class" avec ce nom de chemin :

        /usr/local/acme/classes/com/acme/example/Foon.class

    Si vous aviez mis "/usr/local/acme/classes/com/acme/example" dans le classpath, la JVM ne pourrait pas trouver la classe.

  2. Le classpath doit inclure tous les fichiers autre les classes (non système) dont dépend votre application. (Les classes système sont localisées automatiquement, et vous devez rarement vous en préoccuper).

Le site java -jar <jar file> syntaxe

La syntaxe alternative utilisée pour les fichiers JAR "exécutables" est la suivante :

    java [ <option> ... ] -jar <jar-file-name> [<argument> ...]

par exemple

    java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

Dans ce cas, le nom de la classe du point d'entrée (c'est-à-dire le nom de la classe du point d'entrée). com.acme.example.ListUser ) et le classpath sont spécifiés dans le MANIFEST du fichier JAR.

IDEs

Un IDE Java classique prend en charge l'exécution d'applications Java dans la JVM de l'IDE elle-même ou dans une JVM enfant. Ces dernières sont généralement est à l'abri de cette exception particulière, car l'IDE utilise ses propres mécanismes pour construire le classpath d'exécution, identifier la classe principale et créer le fichier java ligne de commande.

Cependant, il est toujours possible que cette exception se produise, si vous faites des choses derrière l'IDE pour casser les choses. Par exemple, si vous avez précédemment configuré un lanceur d'applications pour votre application Java dans Eclipse, et que vous avez ensuite déplacé le fichier JAR contenant la classe "main" à un autre endroit du système de fichiers, vous pouvez faire ce qui suit sans dire à Eclipse Eclipse lance alors involontairement la JVM avec un classpath incorrect.

En bref, si vous rencontrez ce problème dans un IDE, vérifiez que l'état de l'IDE n'est pas périmé et que les références du projet ou les configurations du lanceur ne sont pas brisées.

Autres références

278voto

panoet Points 135

Si le nom de votre code source est HelloWorld.java, votre code compilé sera HelloWorld.class.

Vous obtiendrez cette erreur si vous l'appelez en utilisant :

java HelloWorld.class

Au lieu de cela, utilisez ce :

java HelloWorld

J'espère que cela vous aidera.

86voto

Razavi Points 37

Si votre méthode principale se trouve dans une classe sous un package, vous devez l'exécuter sur le répertoire hiérarchique.
Supposons qu'il existe un code source (Main.java) :

package com.test;

public class Main {

public static void main(String[] args) {
    System.out.println("salam 2iran\n");
  }
}

Pour exécuter ce code, vous devez placer Main.Class dans le répertoire des paquets. ./come/test/Main.Java et dans le répertoire Root, utilisez java come.test.Main

40voto

Celebes Points 420

Ce qui m'a aidé, c'est de spécifier le classpath en ligne de commande, par exemple :

  1. Créer un nouveau dossier C:\temp

  2. Créer le fichier Temp.java dans C:\temp avec la classe suivante :

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
  3. Ouvrir la ligne de commande dans le dossier C:\temp écrivez la commande suivante pour compiler la classe Temp :

    javac Temp.java
  4. Exécutez la classe java compilée en ajoutant l'option -classpath pour que le JRE sache où trouver la classe :

    java -classpath C:\temp Temp Hello!

16voto

Eduardo Dennis Points 799

Parfois, ce qui peut causer le problème n'a rien à voir avec la classe principale. J'ai dû le découvrir à la dure, c'était une bibliothèque référencée que j'ai déplacée et qui m'a donné le message :

Impossible de trouver ou de charger la classe principale xxx Linux

J'ai simplement supprimé cette référence et l'ai rajoutée, et cela a fonctionné à nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X