Comment créer un JAR exécutable avec ses dépendances ?

L'outil Maven est utilisé pour gérer le cycle de production d'une application Java. Il est possible de créer des Jar pour votre application et celles-ci pourront être exécutés. Il est même possible d'inclure les dépendances nécessaires. Il existe pour cela deux solutions qui se basent sur deux plugins de Maven différent.

Avec le plugin Maven Assembly, il est possible de spécifier que la Jar de votre application doit inclure les dépendances. Dans le fichier pom.xml, insérez les lignes suivantes pour que les dépendances soient automatiquement ajoutées :

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

Pour lancer la création de la Jar, utilisez la commande mvn clean compile assembly:single. Il faut bien penser à inclure la chaîne compile car sinon les sources de votre projet ne seront pas incluses. Si vous souhaitez que le Jar s'exécute automatiquement lors de la compilation, il est nécessaire de rajouter une section execution dans le XML.

<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- Cet attribut est utilisé lors des fusions avec héritage -->
<phase>package</phase> <!-Lie à la phase de package -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

Une autre solution consiste à utiliser le plugin gérant les dépendances de Maven, maven-dependency, pour générer toutes les dépendances dans un répertoire séparé. Cette inclusion est faite dans la phase de package et le chemin vers le répertoire est alors intégré au paramètre classpath. Insérez le code suivant dans le fichier pom.xml :

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>theMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>

Si vous remplacez la valeur stockée dans l'attribut outputDirectory par ${project.build.directory}/classes/lib, alors toutes les Jar seront automatiquement intégrées dans la Jar principale.

Java