Construire un pot exécutable avec Maven?
-
06-07-2019 - |
Question
J'essaie de générer un fichier jar exécutable pour un petit projet de maison appelé & "logmanager &"; en utilisant Maven, juste comme ça:
Comment créer un fichier JAR exécutable avec des dépendances utilisant Maven?
J'ai ajouté l'extrait de code indiqué ici dans pom.xml et j'ai lancé 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. Je reçois une erreur lorsque 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 attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar
J'ai copié et collé le chemin d'accès et le nom de la classe, puis vérifié l'orthographe dans le POM. Ma classe principale se lance bien à partir d'une configuration de lancement eclipse. Quelqu'un peut-il m'aider à comprendre pourquoi mon fichier jar ne fonctionne pas? Aussi, pourquoi y a-t-il deux bocaux pour commencer? Faites-moi savoir si vous avez besoin de plus d'informations.
Voici l'intégralité pom.xml
, par référence:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gorkwobble</groupId>
<artifactId>logmanager</artifactId>
<name>LogManager</name>
<version>0.1.0</version>
<description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<!-- nothing here -->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- commons-lang -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
<!-- Quartz scheduler -->
<dependency>
<groupId>opensymphony</groupId>
<artifactId>quartz</artifactId>
<version>1.6.3</version>
</dependency>
<!-- Quartz 1.6.0 depends on commons collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<!-- Quartz 1.6.0 depends on commons logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
<!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
<scope>runtime</scope>
</dependency>
<!-- junitx test assertions -->
<dependency>
<groupId>junit-addons</groupId>
<artifactId>junit-addons</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
<!-- junit dependency; FIXME: make this a separate POM -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1</version>
</dependency>
</dependencies>
<dependencyManagement>
</dependencyManagement>
</project>
La solution
En fait, je pense que la réponse donnée dans la la question que vous avez mentionnée est juste fausse ( MISE À JOUR - 20101106: quelqu'un l'a corrigée, cette réponse fait référence à la version précédant la modification ) 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 fichier JAR du module logmanager généré lors de la package
phase par jar:jar
(car le module a un conditionnement de type jar
). Le second est l’assemblage généré par assembly:assembly
et doit contenir les classes du module actuel et ses dépendances (si vous avez utilisé le descripteur jar-with-dependencies
).
Un message d'erreur s'affiche lorsque 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 posté comme référence, vous avez configuré le plug-in jar pour produire un artefact exécutable, à peu près comme ceci:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Donc logmanager-0.1.0.jar
est bien exécutable mais 1. ce n’est pas ce que vous voulez (car il n’a pas toutes les dépendances) et 2. il ne contient pas com.gorkwobble.logmanager.LogManager
(c’est ce que dit l’erreur, cochez 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 attribute 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 obtenez quelque chose comme ceci:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
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 ne contient pas Main-Class
entrée (probablement pas le même MANIFEST.MF que dans logmanager-0.1.0.jar). Le fichier jar est en réalité non , ce qui n’est pas ce que vous voulez.
Ma suggestion serait donc de supprimer l'élément configuration
du maven-jar-plugin et de configurer le maven-assembly-plugin comme suit:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<!-- nothing here -->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sample.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Bien sûr, remplacez org.sample.App
par la classe que vous souhaitez faire exécuter. Petit bonus, j'ai lié assembly:single
à la phase mvn install
afin que vous n'ayez plus à courir mvn clean install
. Il suffit d’exécuter target
et l’assemblage sera produit lors de la construction standard.
Alors, veuillez mettre à jour votre fichier pom.xml avec la configuration donnée ci-dessus et lancer pom.xml
. Ensuite, accédez au répertoire <=> et réessayez:
java -jar logmanager-0.1.0-jar-with-dependencies.jar
Si vous obtenez une erreur, veuillez mettre à jour votre question et publier le contenu du fichier <=> ainsi que la partie correspondante de votre <=> (éléments de configuration des plugins). Aussi, merci de poster le résultat de:
java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager
pour démontrer que tout fonctionne correctement sur la ligne de commande (peu importe ce que dit éclipse).
EDIT: Pour Java 6, vous devez configurer le plug-in maven-compiler. Ajoutez ceci à votre pom.xml:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
Autres conseils
La réponse de Pascal Thivent m'a également aidée.
Mais , si vous gérez vos plug-ins dans l'élément <pluginManagement>
, vous devez définir à nouveau l'assembly en dehors de la gestion des plug-ins. Sinon, les dépendances ne sont pas contenues dans le fichier jar si vous exécutez mvn install
.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>main.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins> <!-- did NOT work without this -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<!-- dependencies commented out to shorten example -->
</dependencies>
</project>
Si vous ne souhaitez pas exécuter d'objectif d'assemblage sur le package, vous pouvez utiliser la commande suivante:
mvn package assembly:single
Le package est le mot clé.
Cliquez avec le bouton droit de la souris sur le projet et donnez maven build, maven clean, maven générer des ressources et installer maven. Le fichier jar sera généré automatiquement.