Impossible de trouver ou de charger Java de la classe principale? Voici comment y remédier!
Si vous continuez à obtenir l'erreur de classe principale introuvable dans votre projet Java sans raison apparente, ne vous inquiétez pas, vous n'êtes pas seul.
En tant que l'une des erreurs les plus imprévisibles et spontanées, grâce à la tendance de JVM (Java Virtual Machine) à s'en tenir à un chemin de classe par défaut, le problème de la « classe principale introuvable '' est quelque chose qui hante les amateurs et les professionnels.
Mais ce problème est en fait moins intimidant qu'il n'y paraît. Lisez la suite pour savoir comment vous pouvez vous débarrasser de cette erreur une fois pour toutes.
Pourquoi la classe principale n'a-t-elle pas été trouvée?
Avant d'essayer de comprendre comment et pourquoi JVM n'a pas pu trouver la classe principale, nous devons comprendre le concept de Classpath en Java.
Qu'est-ce que Classpath?
Le chemin d'accès aux classes est le chemin d'accès au fichier dans lequel l'environnement d'exécution Java recherche les classes et autres fichiers de ressources. Il peut être défini à l'aide de l'option -classpath lors de l'exécution d'un programme ou en définissant la variable d' environnement CLASSPATH du système.
Comme son nom l'indique, il s'agit simplement d'un chemin de fichier où les fichiers .class peuvent être trouvés dans un package ou un répertoire JDK.
Lorsque la JVM ne parvient pas à localiser la classe principale, c'est souvent parce qu'elle recherche les fichiers .class correspondants dans le mauvais chemin de classe. Bien sûr, le moyen de résoudre ce problème est de spécifier manuellement le chemin de classe en utilisant des packages ou en spécifiant le chemin de classe.
À ce stade, si vous souhaitez rafraîchir votre mémoire des classes Java, consultez notre guide de création de classes en Java .
Utilisation des packages
Créons une classe appelée Test . Placez-le dans un package appelé testPackage . Les packages sont utilisés en Java afin de regrouper des classes similaires ou de fournir un espace de noms unique pour les classes.
Dans cet exemple simple, l'utilisation d'un package vous aidera à visualiser le fonctionnement du chemin de classe de Java. Dans votre application de gestion de fichiers, un package est représenté comme un dossier indépendant.
package testPackage;
public class Test {
public static void main(String args[]) {
System.out.println("File successfully found!");
}
}
Maintenant, ouvrez un nouveau terminal et assurez-vous que votre répertoire de travail est le même que celui qui contient le dossier du package. Vous pouvez modifier le répertoire de travail à l'aide de la commande cd sur n'importe quel système d'exploitation.
Compilez Test.java en exécutant la commande suivante:
package testPackage;
javac testPackage/Test.java
Cela enregistrera le fichier binaire compilé (le fichier .class) dans testPackage.
Pour exécuter la classe compilée, vous devez taper le nom complet de la classe dans la ligne de commande. Le nom complet d'une classe Java fait référence à son nom précédé de son nom de package. Dans ce cas, cela devrait ressembler à ceci:
java testPackage.Test
Cette façon d'appeler les fichiers de classe garantit également que vous pouvez appeler des exécutables à partir de différents packages à partir du même répertoire de travail. Tout ce que vous avez à faire est de modifier le nom complet de la classe.
Dans les implémentations plus avancées, nous vous recommandons de créer des sous-dossiers séparés pour vos classes et vos fichiers source afin de mieux gérer les fichiers dans le package.
Spécification manuelle du chemin de classe
La méthode recommandée pour gérer vos fichiers java est de créer des répertoires séparés pour les fichiers source et les classes. Si vous travaillez sur un projet, il est probable que vous le fassiez déjà.
Par convention, le répertoire avec les fichiers source est étiqueté comme src et celui avec les fichiers .class est étiqueté comme classes. C'est également un moyen de garantir que la probabilité que JVM ne trouve pas la classe principale soit considérablement réduite, en raison du répertoire correctement structuré.
Si nous utilisons cette méthode, voici à quoi ressemblera la structure des répertoires avant la compilation:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
Chaque retrait de l'illustration ci-dessus correspond à un niveau de la hiérarchie de fichiers que votre projet doit suivre.
Pour compiler ceci, assurez-vous que votre répertoire de travail est myFolder. Maintenant, tapez la commande suivante:
javac -d classes src/testPackage/Test.java
L'exécutable .class doit être enregistré dans myFolder / classes / testPackage . En conséquence, la structure du répertoire de fichiers ressemble à ceci:
|---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
| |---testPackage
| |---Test.class
Pour exécuter le fichier .class , exécutez la commande Java avec le nom de classe complet et spécifiez le chemin de classe local. Chaque chemin est déclaré par rapport au répertoire de travail, qui dans ce cas est myFolder.
java -classpath classes testPackage
L'exécution de cette commande devrait vous donner la sortie souhaitée. Mais pourquoi tant de réorganisation est-elle nécessaire pour résoudre une simple erreur?
L'importance de l'organisation des fichiers en Java
La raison même pour laquelle le message «Impossible de trouver ou de charger la classe principale» est levé est que JVM n'a pas pu trouver où vos fichiers .class étaient stockés.
Le moyen le plus simple de résoudre cette erreur consiste à contrôler l'emplacement de stockage des fichiers .class et à indiquer explicitement à JVM d'y rechercher. Ceci est rendu possible en organisant vos fichiers source et exécutables séparément et en contrôlant tout à partir d'un répertoire de travail.
Au fur et à mesure que vous commencez à ajouter des constructions telles que l' héritage à votre projet, la complexité du système de fichiers est appelée à augmenter de manière multiple. Dans de tels projets ou même ceux où l'utilisation de fichiers JAR ou de bibliothèques personnalisées est requise, la simple pratique de la séparation et de la gestion des fichiers peut vous faire économiser d'innombrables heures de dépannage et de débogage.
Pour en savoir plus sur le fonctionnement du classpath en Java et sur les nombreux éléments que vous pouvez contrôler lors de l'exécution de votre code, vous pouvez également consulter la référence détaillée et conviviale d' Oracle.