Construire un pot exécutable avec maven?

J’essaie de générer un fichier exécutable pour un petit projet domestique appelé “logmanager” en utilisant maven, comme ceci:

Comment créer un fichier JAR exécutable avec des dépendances utilisant Maven?

J’ai ajouté l’extrait de code affiché dans le fichier pom.xml, puis j’ai exécuté mvn assembly: assembly. Il génère deux fichiers jar dans logmanager / target: logmanager-0.1.0.jar et logmanager-0.1.0-jar-with-dependencies.jar. J’ai une erreur quand je double-clique sur le premier pot:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Une erreur légèrement différente lorsque je double-clique sur le fichier jar-with-dependencies.jar:

 Failed to load Main-Class manifest atsortingbute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

J’ai copié et collé le chemin d’access et le nom de classe et vérifié l’orthographe dans le POM. Ma classe principale se lance bien dans une configuration de lancement d’éclipse. Est-ce que quelqu’un peut m’aider à comprendre pourquoi mon fichier JAR ne fonctionnera pas? Aussi, pourquoi y a-t-il deux pots pour commencer? Faites-moi savoir si vous avez besoin de plus d’informations.

Voici le pom.xml complet, pour référence:

  4.0.0 com.gorkwobble logmanager LogManager 0.1.0 Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.    org.apache.maven.plugins maven-jar-plugin 2.2    org.apache.maven.plugins maven-assembly-plugin 2.2-beta-4   jar-with-dependencies    com.gorkwobble.logmanager.LogManager      package  single      org.apache.maven.plugins maven-comstackr-plugin  1.6 1.6        commons-lang commons-lang 2.4    opensymphony quartz 1.6.3    commons-collections commons-collections 3.1    commons-logging commons-logging 1.1    javax.transaction jta 1.1 runtime    junit-addons junit-addons 1.4 test    junit junit 4.1      

En fait, je pense que la réponse donnée dans la question que vous avez mentionnée est juste fausse ( UPDATE – 20101106: quelqu’un l’a corrigée, cette réponse fait référence à la version précédant l’édition ) et cela explique, au moins partiellement, pourquoi vous rencontrez des problèmes.


Il génère deux fichiers jar dans logmanager / target: logmanager-0.1.0.jar et logmanager-0.1.0-jar-with-dependencies.jar.

Le premier est le JAR du module logmanager généré lors de la phase du package par jar:jar (car le module a un emballage de type jar ). Le second est l’assembly généré par assembly:assembly et devrait contenir les classes du module actuel et ses dépendances (si vous avez utilisé le descripteur jar-with-dependencies ).

J’ai une erreur quand je double-clique sur le premier pot:

 Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit. 

Si vous avez appliqué la configuration suggérée du lien publié comme référence, vous avez configuré le plug-in jar pour produire un artefact exécutable, par exemple:

   org.apache.maven.plugins maven-jar-plugin    true com.gorkwobble.logmanager.LogManager     

Donc logmanager-0.1.0.jar est bien exécutable mais ce n’est pas ce que vous voulez (car il n’a pas toutes les dépendances) et il ne contient pas com.gorkwobble.logmanager.LogManager (c’est ce que erreur dit, vérifiez le contenu du pot.

Une erreur légèrement différente lorsque je double-clique sur le fichier jar-with-dependencies.jar:

 Failed to load Main-Class manifest atsortingbute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar 

Encore une fois, si vous avez configuré le plug-in d’assemblage comme suggéré, vous avez quelque chose comme ceci:

   org.apache.maven.plugins maven-assembly-plugin   jar-with-dependencies    

Avec cette configuration, logmanager-0.1.0-jar-with-dependencies.jar contient les classes du module actuel et ses dépendances mais, en fonction de l’erreur, son META-INF/MANIFEST.MF ne contient pas de Main-Class entrée (ce n’est probablement pas le même MANIFEST.MF que dans logmanager-0.1.0.jar). Le pot n’est pas exécutable, ce qui n’est pas ce que vous voulez.


Donc, ma suggestion serait de supprimer l’élément de configuration du plugin maven-jar et de configurer le plugin maven-assembly comme ceci:

   org.apache.maven.plugins maven-jar-plugin 2.2    org.apache.maven.plugins maven-assembly-plugin 2.2-beta-4   jar-with-dependencies    org.sample.App      package  single     

Bien sûr, remplacez org.sample.App par la classe que vous souhaitez exécuter. Petit bonus, j’ai enchaîné le assembly:single à la phase du package pour ne plus avoir à exécuter assembly:assembly . Il suffit de lancer mvn install et l’assemblage sera produit lors de la construction standard.

Donc, veuillez mettre à jour votre pom.xml avec la configuration donnée ci-dessus et exécuter mvn clean install . Ensuite, cd dans le répertoire target et réessayez:

 java -jar logmanager-0.1.0-jar-with-dependencies.jar 

Si vous obtenez une erreur, veuillez mettre à jour votre question avec elle et publier le contenu du fichier META-INF/MANIFEST.MF et la partie pertinente de votre pom.xml (les parties de configuration des plug-ins). Aussi s’il vous plaît poster le résultat de:

 java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager 

pour démontrer que cela fonctionne bien sur la ligne de commande (peu importe ce que l’éclipse dit).

EDIT: Pour Java 6, vous devez configurer le plugin maven-comstackr. Ajoutez ceci à votre pom.xml:

   org.apache.maven.plugins maven-comstackr-plugin  1.6 1.6   

La réponse de Pascal Thivent m’a également aidé. Mais si vous gérez vos plug-ins dans l’élément , vous devez définir l’assembly à nouveau en dehors de la gestion des plug-ins, sinon les dépendances ne sont pas compressées dans jar si vous exécutez mvn install .

  4.0.0 1.0.0-SNAPSHOT jar     org.apache.maven.plugins maven-comstackr-plugin 3.1  1.6 1.6    org.apache.maven.plugins maven-assembly-plugin 2.4    main.App    jar-with-dependencies     make-assembly package  single          org.apache.maven.plugins maven-assembly-plugin        

Si vous ne voulez pas exécuter l’objective d’assemblage sur le package, vous pouvez utiliser la commande suivante:

 mvn package assembly:single 

Ici, le package est un mot clé.

Faites un clic droit sur le projet et donnez à maven build, maven clean, maven, générez des ressources et installez install. Le fichier jar sera automatiquement généré.