Un problème courant rencontré par les nouveaux développeurs Java est que leurs programmes ne s'exécutent pas avec le message d'erreur suivant: Could not find or load main class ...
Qu'est-ce que cela signifie, qu'est-ce qui le cause et comment devriez-vous le réparer?
Java <class-name>
Tout d'abord, vous devez comprendre la bonne façon de lancer un programme à l'aide de la commande Java
(ou javaw
).
La syntaxe normale1 est-ce:
Java [ <option> ... ] <class-name> [<argument> ...]
où <option>
est une option de ligne de commande (commençant par un caractère "-"), <class-name>
est un nom de classe qualifié Java et <argument>
est une commande arbitraire. argument de ligne qui est passé à votre application.
1 - Il existe une deuxième syntaxe pour les fichiers JAR "exécutables" que je décrirai plus bas.
Le nom complet de la classe (FQN) est généralement écrit comme vous le feriez dans le code source Java. par exemple.
packagename.packagename2.packagename3.ClassName
Toutefois, certaines versions de la commande Java
vous permettent d'utiliser des barres obliques au lieu de points. par exemple.
packagename/packagename2/packagename3/ClassName
qui (déroutant) ressemble à un chemin de fichier, mais n'en est pas un. Notez que le terme nom complet est standard Java terminologie ... pas quelque chose que je viens de créer pour vous embrouiller :-)
Voici un exemple de ce à quoi une commande Java
devrait ressembler:
Java -Xmx100m com.acme.example.ListUsers fred joe bert
Ce qui précède va entraîner la commande Java
:
com.acme.example.ListUsers
.main
avec signature, type de retour et modificateurs donné par public static void main(String[])
. (Notez que le nom de l'argument de la méthode est PAS une partie de la signature.)String[]
.Lorsque vous recevez le message "Impossible de trouver ou de charger la classe principale ...", cela signifie que la première étape a échoué. La commande Java
n'a pas pu trouver la classe. Et en effet, le "..." dans le message sera le nom de classe complet que Java
cherche.
Alors, pourquoi pourrait-il être incapable de trouver la classe?
La première cause probable est que vous avez peut-être fourni un nom de classe incorrect. (Ou ... le bon nom de classe, mais sous une forme erronée.) Considérant l'exemple ci-dessus, voici une variété de mauvaises manières de spécifier la classe. Nom:
Exemple # 1 - un nom de classe simple:
Java ListUser
Lorsque la classe est déclarée dans un package tel que com.acme.example
, vous devez utiliser le nom de classe complet y compris le nom du package dans la commande Java
; par exemple.
Java com.acme.example.ListUser
Exemple # 2 - un nom de fichier ou un chemin d'accès plutôt qu'un nom de classe:
Java ListUser.class
Java com/acme/example/ListUser.class
Exemple # 3 - un nom de classe avec une casse incorrecte:
Java com.acme.example.listuser
Exemple n ° 4 - une faute de frappe
Java com.acme.example.mistuser
Exemple # 5 - un nom de fichier source
Java ListUser.Java
Exemple # 6 - vous avez complètement oublié le nom de la classe
Java lots of arguments
La deuxième cause probable est que le nom de la classe est correct mais que la commande Java
ne peut pas trouver la classe. Pour comprendre cela, vous devez comprendre le concept de "classpath". Ceci est expliqué bien par la documentation Oracle:
Java
Donc ... si vous avez correctement spécifié le nom de la classe, la prochaine chose à vérifier est que vous avez correctement spécifié le chemin de la classe:
Java
. Vérifiez que les noms de répertoire et les noms de fichier JAR sont corrects.Java
.;
sous Windows et :
sous les autres. Si vous utilisez le mauvais séparateur pour votre plate-forme, vous n'obtiendrez pas de message d'erreur explicite. Vous obtiendrez plutôt un fichier inexistant. ou répertoire sur le chemin qui sera silencieusement ignoré.)Lorsque vous placez un répertoire sur le chemin d'accès aux classes, il correspond théoriquement à la racine de l'espace de noms qualifié. Les classes sont situées dans la structure de répertoires située sous cette racine, en mappant le nom qualifié complet sur un chemin. Ainsi, par exemple, si "/ usr/local/acme/classes" figure dans le chemin de classe, lorsque la machine virtuelle recherche une classe appelée com.acme.example.Foon
, elle recherche un fichier ".class" avec ce chemin:
/usr/local/acme/classes/com/acme/example/Foon.class
Si vous aviez placé "/ usr/local/acme/classes/com/acme/exemple" sur le chemin d'accès aux classes, la machine virtuelle Java ne pourrait pas trouver la classe.
Si votre classe FQN est com.acme.example.Foon
, la machine virtuelle Java recherchera "Foon.class" dans le répertoire "com/acme/example":
Si la structure de votre répertoire ne correspond pas à la dénomination du paquet conformément au modèle ci-dessus, la machine virtuelle Java ne trouvera pas votre classe.
Si vous essayez renommer une classe en la déplaçant, cela échouera également ... mais l'exception stacktrace sera différente. Il est susceptible de dire quelque chose comme ceci:
Caused by: Java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
car le FQN dans le fichier de classe ne correspond pas à ce que le chargeur de classes s'attend à trouver.
Pour donner un exemple concret, en supposant que:
com.acme.example.Foon
,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,ensuite:
# wrong, FQN is needed
Java Foon
# wrong, there is no `com/acme/example` folder in the current working directory
Java com.acme.example.Foon
# wrong, similar to above
Java -classpath . com.acme.example.Foon
# fine; relative classpath set
Java -classpath ../../.. com.acme.example.Foon
# fine; absolute classpath set
Java -classpath /usr/local/acme/classes com.acme.example.Foon
Remarques:
-classpath
peut être réduite à -cp
dans la plupart des versions de Java. Vérifiez les entrées manuelles respectives pour Java
, javac
et ainsi de suite.Le chemin de classe doit inclure toutes les autres (non-systèmes) classes dont dépend votre application. (Les classes système sont automatiquement localisées et vous devez rarement vous en préoccuper.) Pour que la classe principale soit chargée correctement, la machine virtuelle Java doit rechercher:
(Remarque: les spécifications JLS et JVM permettent à une machine virtuelle de charger des classes "paresseusement", ce qui peut avoir une incidence sur le déclenchement d'une exception de chargeur de classe.)
Il arrive parfois que quelqu'un mette un fichier de code source dans le mauvais dossier de son arborescence, ou omette la déclaration package
. Si vous faites cela dans un IDE, le compilateur de l'EDI vous en informera immédiatement. De même, si vous utilisez un outil de construction correct Java, l'outil exécutera javac
de manière à détecter le problème. Cependant, si vous construisez votre code Java à la main, vous pouvez le faire de sorte que le compilateur ne remarque pas le problème et que le fichier ".class" résultant ne se trouve pas à la place attendez-vous à ce qu'il le soit.
Il y a beaucoup de choses à vérifier, et il est facile de rater quelque chose. Essayez d’ajouter l’option -Xdiag
à la ligne de commande Java
(en premier lieu après Java
). Il produira diverses informations sur le chargement de classe, ce qui peut vous donner des indices sur le problème réel.
En outre, envisagez les problèmes éventuels liés au copier-coller de caractères invisibles ou non-ASCII à partir de sites Web, de documents, etc. Et considérons les "homoglyphes", où deux lettres ou symboles se ressemblent ... mais ne le sont pas.
Java -jar <jar file>
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 de point d'entrée (c'est-à-dire com.acme.example.ListUser
) et le chemin d'accès aux classes sont spécifiés dans le MANIFEST du fichier JAR.
Un Java IDE typique prend en charge l'exécution d'applications Java dans la JVM IDE ou dans une JVM enfant. Ceux-ci sont généralement à l'abri de cette exception particulière, car la IDE utilise ses propres mécanismes pour construire le chemin d'accès aux classes à l'exécution, identifier la classe principale et créer la ligne de commande Java
.
Cependant, il est toujours possible que cette exception se produise si vous effectuez des tâches dans le dos de l'EDI. Par exemple, si vous avez déjà configuré un programme de lancement d'applicatifs pour votre application Java dans Eclipse, puis que vous avez déplacé le fichier JAR contenant la classe "principale" vers un emplacement différent dans le système de fichiers: sans le dire à Eclipse, Eclipse lancerait involontairement la machine virtuelle Java avec un chemin d'accès aux classes incorrect.
En bref, si vous rencontrez ce problème dans un environnement de développement intégré, recherchez des éléments tels que l'état obsolète IDE, les références de projet interrompues ou les configurations de programme de lancement défaillantes.
Il est également possible qu'un IDE s'embrouille simplement. Les IDE sont des logiciels extrêmement compliqués comprenant de nombreuses parties en interaction. Bon nombre de ces composants adoptent diverses stratégies de mise en cache afin de rendre l'ensemble IDE réactif. Celles-ci peuvent parfois mal tourner et l'un des symptômes possibles est le problème lors du lancement d'applications. Si vous pensez que cela pourrait se produire, il est intéressant de redémarrer votre IDE.
Si votre nom de 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 ceci:
Java HelloWorld
Si vos classes sont dans des packages alors vous devez cd
dans le répertoire racine de votre projet et l'exécuter à l'aide du nom complet de la classe (packageName.MainClassName).
Exemple:
Mes cours sont ici:
D:\project\com\cse\
Le nom complet de ma classe principale est:
com.cse.Main
Donc, je cd
retour au répertoire du projet racine:
D:\project
Puis lancez la commande Java
:
Java com.cse.Main
Cette réponse sert à sauver les programmeurs débutants Java de la frustration causée par une erreur commune, je vous recommande de lire la réponse acceptée pour obtenir des informations plus détaillées sur le Java classpath.
Si vous définissez la classe principale et la méthode principale dans un package
, vous devez l'exécuter sur le répertoire hiérarchique, en utilisant le nom complet de la classe (packageName.MainClassName
).
Supposons qu'il existe un fichier de code source (Main.Java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
Pour exécuter ce code, vous devez placer Main.Class
dans le paquet tel que le répertoire ./com/test/Main.Java
. Et dans le répertoire racine, utilisez Java com.test.Main
.
Lorsque le même code fonctionne sur un PC, mais qu'il montre l'erreur sur un autre, la meilleure solution que j'ai jamais trouvée consiste à compiler comme suit:
javac HelloWorld.Java
java -cp . HelloWorld
Ce qui m'a aidé a été de spécifier le chemin d'accès aux classes sur la ligne de commande, par exemple:
Créez un nouveau dossier, C:\temp
Créez 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]);
}
}
Ouvrez une ligne de commande dans le dossier C:\temp
et écrivez la commande suivante pour compiler la classe Temp:
javac Temp.Java
Exécutez la classe Java compilée en ajoutant l'option -classpath
pour indiquer à JRE où trouver la classe:
Java -classpath C:\temp Temp Hello!
Selon le message d'erreur ("Impossible de trouver ou de charger la classe principale"), il existe deux catégories de problèmes:
La classe principale ne peut pas être trouvée quand il y a typo ou syntaxe incorrecte dans le nom de classe complet ou n'existe pas dans le chemin de classe fourni.
La classe principale ne peut pas être chargée quand la classe ne peut pas être initiée, la classe principale étend généralement une autre classe et cette classe n'existe pas dans le chemin de classe fourni.
Par exemple:
public class YourMain extends org.Apache.camel.spring.Main
Si chamel-spring n'est pas inclus, cette erreur sera signalée.
J'ai eu une telle erreur dans ce cas:
Java -cp lib.jar com.mypackage.Main
Cela fonctionne avec ;
pour Windows et :
pour Unix:
Java -cp lib.jar; com.mypackage.Main
Parfois, la cause du problème n'a rien à voir avec la classe principale et je devais trouver cela à la dure. C’est une bibliothèque référencée que j’ai déplacée et elle m’a donné le:
Impossible de trouver ou de charger la classe principale xxx Linux
Je viens de supprimer cette référence, de l'ajouter à nouveau et cela a fonctionné à nouveau.
Utilisez cette commande:
_Java -cp . [PACKAGE.]CLASSNAME
_
Exemple: Si votre nom de classe est Hello.class créé à partir de Hello.Java, utilisez la commande ci-dessous:
_Java -cp . Hello
_
Si votre fichier Hello.Java se trouve dans le package com.demo, utilisez la commande ci-dessous.
_Java -cp . com.demo.Hello
_
Il arrive souvent que le fichier de classe soit présent dans le même dossier avec JDK 8, mais la commande Java
attend un chemin de classe et, pour cette raison, nous ajoutons -cp .
dossier comme référence pour classpath.
Essayez - Xdiag .
La réponse de Steve C couvre bien les cas possibles, mais parfois pour déterminer si la classe ne peut pas être trouvée ou chargée pourrait ne pas être si facile. Utilisez Java -Xdiag
(depuis JDK 7). Ceci affiche un Nice stacktrace qui fournit un indice sur la signification du message Could not find or load main class
.
Par exemple, il peut vous indiquer d'autres classes utilisées par la classe principale qui étaient introuvables et qui ont empêché le chargement de la classe principale.
Dans cet exemple, vous avez:
Impossible de trouver ou de charger la classe principale ? Classpath
C'est parce que vous utilisez "-classpath", mais le tiret n'est pas le même que celui utilisé par Java
dans l'invite de commande. J'ai eu cette question copier et coller de Notepad à cmd.
Dans mon cas, une erreur est apparue parce que j'avais fourni le nom du fichier source au lieu du nom de la classe.
Nous devons fournir le nom de la classe contenant la méthode principale à l'interpréteur.
J'ai eu le même problème et finalement trouvé mon erreur :) J'ai utilisé cette commande pour la compilation et cela a fonctionné correctement.
javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.Java
mais cette commande n'a pas fonctionné pour moi (impossible de trouver ou de charger la classe principale qrcode)
Java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode
Enfin, je viens d'ajouter le caractère ':' en fin de classpath et le problème résolu.
Java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode
)
J'ai passé un temps décent à essayer de résoudre ce problème. Je pensais que mon chemin de classe était mal défini, mais le problème était que je tapais:
Java -cp C:/Java/MyClasses C:/Java/MyClasses/utilities/myapp/Cool
au lieu de:
Java -cp C:/Java/MyClasses utilities/myapp/Cool
Je pensais que la signification de "pleinement qualifié" voulait dire inclure le nom de chemin complet au lieu du nom complet du package.
Cela pourrait vous aider si votre cas ressemble plus particulièrement au mien: en tant que débutant, j'ai également rencontré ce problème lorsque j'ai essayé de lancer un programme Java.
Je l'ai compilé comme ceci:
javac HelloWorld.Java
Et j'ai essayé de courir aussi avec la même extension:
Java Helloworld.Java
Quand j'ai enlevé le .Java
et réécrit la commande comme Java HelloWorld
, le programme s'est parfaitement déroulé. :)
Ce qui a résolu le problème dans mon cas était:
Faites un clic droit sur le projet/la classe que vous voulez exécuter, puis sur Run As
-> Run Configurations
. Ensuite, vous devez soit corriger votre configuration existante, soit en ajouter une nouvelle de la manière suivante:
ouvrez l'onglet Classpath
, cliquez sur le bouton Advanced...
puis ajoutez dossier bin
de votre projet.
Toutes les réponses ici sont dirigées vers les utilisateurs de Windows, semble-t-il. Pour Mac, le séparateur de chemin de classe est :
, pas ;
. Comme une erreur lors de la définition du chemin de classe à l'aide de ;
n'est pas générée, cela peut être difficile à détecter si vous passez de Windows à Mac.
Voici la commande Mac correspondante:
Java -classpath ".:./lib/*" com.test.MyClass
Où, dans cet exemple, le package est com.test
et un dossier lib
doit également être inclus dans le chemin de classe.
Commencez par définir le chemin à l'aide de cette commande.
set path="paste the set path address"
Ensuite, vous devez charger le programme. Tapez "cd (nom du dossier)" dans le lecteur stocké et compilez-le. Par exemple, si mon programme est enregistré sur le lecteur D, tapez "D:", appuyez sur Entrée et tapez "cd (nom du dossier)".
Si vous utilisez Maven pour construire le fichier JAR, veillez à spécifier la classe principale dans le fichier pom.xml:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>class name us.com.test.abc.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Sous Windows, mettez .;
à la valeur CLASSPATH au début.
Le . (point) signifie "regarder dans le répertoire en cours". C'est une solution permanente.
Aussi, vous pouvez le définir "une fois" avec set CLASSPATH=%CLASSPATH%;.
. Cela durera aussi longtemps que votre fenêtre cmd est ouverte.
C'est un cas spécifique, mais puisque je suis venu sur cette page à la recherche d'une solution et que je ne l'ai pas trouvée, je l'ajouterai ici.
Windows (testé avec 7) n'accepte pas les caractères spéciaux (tels que á
) dans les noms de classe et de package. Linux le fait cependant.
Je l'ai découvert en construisant un .jar
dans NetBeans et en essayant de l'exécuter en ligne de commande. Il s'est exécuté dans NetBeans mais pas en ligne de commande.
Vous devez vraiment faire cela à partir du dossier src
. Là vous tapez la ligne de commande suivante:
[name of the package].[Class Name] [arguments]
Supposons que votre classe s'appelle CommandLine.class
et que le code ressemble à ceci:
package com.tutorialspoint.Java;
/**
* Created by mda21185 on 15-6-2016.
*/
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
Ensuite, vous devriez cd
dans le dossier src et la commande à exécuter ressemblerait à ceci:
Java com.tutorialspoint.Java.CommandLine this is a command line 200 -100
Et la sortie sur la ligne de commande serait:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
Parfois, dans certains compilateurs en ligne que vous avez pu essayer, vous obtiendrez cette erreur si vous n'écrivez pas public class [Classname]
mais simplement class [Classname]
.
Lorsque vous exécutez la Java
avec l'option -cp
annoncée dans Windows PowerShell, vous risquez d'obtenir une erreur ressemblant à ceci:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Pour que PowerShell accepte la commande, les arguments de l'option -cp
doivent être entre guillemets, comme suit:
Java -cp 'someDependency.jar;.' ClassName
Cette commande devrait permettre à Java de traiter correctement les arguments du chemin d'accès aux classes.
J'ai également rencontré des erreurs similaires lors du test d'une connexion JDBC MongoDB Java. Je pense qu'il est bon de résumer ma solution finale en résumé afin que tout le monde puisse à l'avenir consulter directement les deux commandes et qu'il soit bon d'aller plus loin.
Supposons que vous vous trouvez dans le répertoire où se trouvent votre fichier Java et vos dépendances externes (fichiers JAR).
Compiler:
javac -cp mongo-Java-driver-3.4.1.jar JavaMongoDBConnection.Java
Run:
Java -cp mongo-Java-driver-3.4.1.jar: JavaMongoDBConnection
Bon, beaucoup de réponses déjà, mais personne n’a mentionné le cas où l’autorisation de fichier peut être le coupable. Lors de l'exécution, l'utilisateur n'a pas accès au fichier jar ou à l'un des répertoires du chemin. Par exemple, considérons:
Fichier Jar dans /dir1/dir2/dir3/myjar.jar
L'utilisateur 1 à qui appartient le pot peut faire:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
Mais ça ne marche toujours pas:
# Running as User2
Java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
En effet, l'utilisateur en cours d'exécution (User2) n'a pas accès à dir1, dir2, javalibs ou dir3. Cela peut rendre fou quelqu'un lorsque l'utilisateur1 peut voir les fichiers et y accéder, mais l'erreur persiste pour l'utilisateur2
Dans mon cas, j'ai eu l'erreur parce que j'avais mélangé les noms de paquet majuscules et minuscules sur un système Windows 7. Changer les noms de paquet en minuscules a résolu le problème. Notez également que dans ce scénario, aucune erreur ne s'est produite lors de la compilation du fichier .Java dans un fichier .class; il ne fonctionnerait tout simplement pas à partir du même répertoire (sous-sous-sous-).
En Java, lorsque vous exécutez parfois la machine virtuelle Java à partir de la ligne de commande à l'aide de l'exécutable Java et tentez de démarrer un programme à partir d'un fichier de classe avec un public principal (PSVM), vous risquez de rencontrer l'erreur ci-dessous. même si le paramètre classpath de la machine virtuelle Java est précis et que le fichier de classe est présent sur le classpath:
Error: main class not found or loaded
Cela se produit si le fichier de classe avec PSVM n'a pas pu être chargé. Une des raisons possibles est que la classe peut implémenter une interface ou étendre une autre classe qui n’est pas sur le chemin de classe. Normalement, si une classe ne se trouve pas dans le chemin de classe, l'erreur renvoyée indique le contraire. Toutefois, si la classe utilisée est étendue ou implémentée, Java ne peut pas charger la classe elle-même.
Référence: https://www.computingnotes.net/Java/error-main-class-not-found-or-loaded/
J'ai été incapable de résoudre ce problème avec les solutions énoncées ici (bien que la réponse indiquée ait sans doute clarifié mes concepts). J'ai fait face à ce problème deux fois et chaque fois j'ai essayé différentes solutions (dans l'IDE Eclipse).
main
dans différentes classes de mon projet. J'ai donc supprimé la méthode main
des classes suivantes.J'ai eu un étrange.
Erreur: impossible de trouver ou de charger la classe principale mypackage.App
Il s'est avéré que j'avais une configuration pom (parent) dans le fichier pom.xml de mon projet (le fichier pom.xml de mon projet pointait vers un fichier pom.xml parent) et que le chemin relatif était désactivé/incorrect.
Vous trouverez ci-dessous une partie du fichier pom.xml de mon projet.
<parent>
<groupId>myGroupId</groupId>
<artifactId>pom-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../badPathHere/pom.xml</relativePath>
</parent>
Une fois que j'ai résolu pom relativePath, l'erreur a disparu.
Allez comprendre.
J'ai eu cette erreur après avoir fait mvn Eclipse:eclipse
Cela a un peu gâché mon fichier .classpath
.
J'ai dû changer les lignes dans .classpath
de
<classpathentry kind="src" path="src/main/Java" including="**/*.Java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.Java"/>
à
<classpathentry kind="src" path="src/main/Java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Parfois, il est préférable de supprimer les fichiers JAR ajoutés et de les ajouter à nouveau avec des aides de construction appropriées. Pour moi, cela a été un problème régulier, et j'ai suivi la même approche:
Dans le contexte du développement de IDE (Eclipse, NetBeans ou autre), vous devez configurer les propriétés de votre projet de sorte à avoir une classe principale, afin que votre IDE sache où se trouve la classe principale. être exécuté lorsque vous cliquez sur "Play".
Cela m'est arrivé aussi. Dans mon cas, cela ne s'est produit que lorsqu'une classe HttpServlet
était présente dans le code source (Idea Intellij n'a pas donné d'erreur de compilation, le package de servlet a été importé parfaitement, mais au moment de l'exécution, il y avait ce main class
erreur).
J'ai réussi à le résoudre. Je suis allé dans Fichier - Structure du projet:
Puis aux modules:
Il y avait une portée fournie près du module de servlet. Je l'ai changé pour Compiler:
Et ça a marché!
Par défaut, Java utilise .
, le répertoire de travail actuel, par défaut CLASSPATH
. Cela signifie que lorsque vous tapez une commande à l'invite, par exemple. Java MyClass
, la commande est interprétée comme si vous aviez tapé Java -cp . MyClass
. Avez-vous vu ce point entre -cp
et MyClass
? (cp est l'abréviation de l'option la plus longue classpath)
Cela suffit dans la plupart des cas et les choses semblent bien fonctionner jusqu'à ce que vous essayiez d'ajouter un répertoire à votre CLASSPATH
. Dans la plupart des cas, lorsque les programmeurs doivent le faire, ils exécutent simplement une commande telle que set CLASSPATH=path\to\some\dir
. Cette commande crée une nouvelle variable d'environnement appelée CLASSPATH
ayant la valeur path\to\some\dir
ou remplace sa valeur par path\to\some\dir
si CLASSPATH
était déjà défini auparavant.
Lorsque cela est fait, vous disposez maintenant d'une variable d'environnement CLASSPATH
et Java n'utilise plus son chemin d'accès aux classes par défaut (.
) mais celui que vous avez défini. Donc, le lendemain, vous ouvrez votre éditeur, écrivez un programme Java, cd
dans le répertoire où vous l'avez enregistré, compilez-le et essayez de l'exécuter avec la commande Java MyClass
, et vous êtes accueilli avec une sortie Nice: Impossible de trouver ou de charger la classe principale ... (Si vos commandes fonctionnaient bien avant et vous obtenez maintenant cette sortie, alors cela pourrait être le cas pour vous).
En effet, lorsque vous exécutez la commande Java MyClass
, Java, le fichier de classe nommé MyClass
est recherché dans le ou les répertoires définis dans votre CLASSPATH
et pas votre répertoire de travail actuel, il ne trouve donc pas votre fichier de classe et se plaint donc.
Ce que vous devez faire est d’ajouter .
à votre chemin de classe, ce qui peut être fait avec la commande set CLASSPATH=%CLASSPATH%;.
(remarquez le point après le point-virgule). En clair, cette commande dit "Choisissez ce qui était initialement la valeur de CLASSPATH
(%CLASSPATH%
), ajoutez .
(;.
) et affectez le résultat à CLASSPATH
".
Et voila , vous pouvez à nouveau utiliser votre commande Java MyClass
comme d'habitude.