Introduction : découverte de l'erreur qui effraie les débutants
Vous avez écrit un programme en Java, vous l'avez compilé, empaqueté dans un fichier JAR et vous essayez fièrement de l'exécuter en double-cliquant — mais au lieu de la fenêtre de l'application, vous voyez une fenêtre de terminal noire avec un message effrayant : Can't execute jar- file: "no main manifest attribute". Cela vous dit quelque chose ? Si non, considérez que vous avez eu de la chance (pour l'instant).
Cette erreur est l'une des plus populaires sur Stack Overflow. Imaginez : des milliers de développeurs, des étudiants aux ingénieurs expérimentés, ont rencontré au moins une fois dans leur vie le fait que leur fichier JAR « refuse » de s'exécuter. Pourquoi cela se produit-il ? Le problème est que Java n'est pas simplement « emballe et exécute ». La machine virtuelle doit savoir clairement : quelle classe contient le point d'entrée ? Sans cette information, le fichier JAR reste une simple archive, et non un programme exécutable.
Dans cet article, nous allons comprendre ce qu'est le manifeste, comment il est lié au point d'entrée, et — surtout — comment faire en sorte que votre fichier JAR s'exécute sans erreur. Nous irons du simple au complexe : de la construction manuelle en ligne de commande à la configuration de l'IDE. C'est parti !
Qu'est-ce que le manifeste et à quoi sert-il ?
Chaque fichier JAR (Java Archive) contient à l'intérieur un dossier META-INF, et dans celui-ci, un fichier MANIFEST.MF. Ce n'est pas simplement un artefact technique, mais une véritable « notice d'utilisation » pour la machine virtuelle Java.
Imaginez un livre sans table des matières. Vous savez qu'il contient des chapitres, mais vous ne savez pas à quelle page commencer la lecture. Il se passe à peu près la même chose avec un fichier JAR sans indication de la classe principale. La machine virtuelle voit de nombreuses classes, mais ne sait pas laquelle contient la méthode public static void main(String[] args).
Un fichier MANIFEST.MF typique ressemble à ceci :
Manifest-Version: 1.0Created-By: 17.0.2 (Oracle Corporation)Main-Class: com.example.MainLa ligne la plus importante ici est Main-Class. Elle indique le nom complet de la classe (avec le package) que Java doit exécuter. Si cette ligne est absente ou incorrecte, vous obtenez cette fameuse erreur « no main manifest attribute ».
Pourquoi le manifeste peut-il être vide ou incorrect ?
- Construction manuelle via
jar— si vous n'avez pas spécifié le drapeau-eou créé votre propre manifeste. - Construction dans un IDE sans configuration — certains environnements de développement (en particulier les anciennes versions) n'ajoutent pas
Main-Classautomatiquement. - Erreur de nommage — par exemple, vous avez écrit
mainen minuscules ou oublié de spécifier le package. - Encodage et formatage — dans le manifeste, chaque ligne vide à la fin du fichier est importante.
Comment créer un fichier JAR exécutable : trois méthodes
Méthode 1. Ligne de commande (contrôle manuel)
Cette méthode donne une compréhension complète du processus. Supposons que nous ayons une classe simple HelloWorld.java :
package com.example;
public class HelloWorld { public static void main(String[] args) { System.out.println("Bonjour le monde ! Le JAR fonctionne !"); }}Étape 1. Compiler la classe
javac -d . HelloWorld.javaLe drapeau -d . crée la structure des packages (com/example/HelloWorld.class).
Étape 2. Créer le manifeste manuellement
Créez un fichier MANIFEST.MF (par exemple, dans le Bloc-notes) avec le contenu suivant :
Manifest-Version: 1.0Main-Class: com.example.HelloWorldImportant : après la dernière ligne, il doit obligatoirement y avoir une ligne vide ! Sans cela, le fichier JAR pourrait ne pas lire le manifeste.
Étape 3. Créer le JAR
jar cfm HelloWorld.jar MANIFEST.MF com/example/HelloWorld.classLe drapeau
Blogs
Book Recommendations
Lire aussi
Static readonly ou const en C# : que choisir en 2025 ?
C++ contre assembleur : pourquoi le compilateur surpasse le code manuel
TypeScript pour débutants : 7 erreurs fatales et comment les éviter
Frameworks C# 2025 : lequel choisir pour le backend, le web et les microservices
Créer un bot Telegram en Swift : de l'idée au déploiement