Lors de la phase de construction d'un projet Java avec Maven, le choix du plugin de packaging est déterminant pour la structure finale du livrable. On distingue généralement trois outils majeurs :
- maven-jar-plugin : l'outil par défaut pour générer des fichiers JAR simples.
- maven-shade-plugin : idéal pour créer des "fat JARs" (Uber-JARs) regroupant toutes les classes dans une archive unique.
- maven-assembly-plugin : la solution la plus flexible pour assembler des distributions complexes incluant des scripts Shell, des fichiers de configuration externes (YAML, XML) et une arborescence de répertoires spécifique.
Le plugin maven-assembly-plugin est particulièrement prisé dans les architectures Big Data ou les microservices où il est nécessaire de livrer un paquetage prêt à l'emploi (souvent en format .tar.gz ou .zip) contenant non seulement le code compilé mais aussi les dépendances et les scripts d'exécution.
Configuraton du plugin dans le fichier pom.xml
Pour intégrer ce plugin, il suffit de l'ajouter à la section <build> de votre projet. Voici un exemple de configuration liant l'exécution à la phase package :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>create-distribution</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- Référence au fichier de description personnalisé -->
<descriptors>
<descriptor>src/main/resources/assemblies/dist-layout.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
</build>
Définition du descripteur d'assemblage
Le cœur de la personnalisation réside dans le fichier XML de description. Il permet de définir précisément quels fichiers inclure et comment les organiser. Voici un modèle type pour une structure de projet standardisée :
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
<id>bin-dist</id>
<formats>
<format>tar.gz</format>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- Scripts d'exécution avec permissions spécifiques -->
<fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>scripts</outputDirectory>
<fileMode>0755</fileMode>
<includes>
<include>*.sh</include>
</includes>
</fileSet>
<!-- Fichiers de configuration -->
<fileSet>
<directory>src/main/resources</directory>
<outputDirectory>config</outputDirectory>
<includes>
<include>*.yaml</include>
<include>*.properties</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>libs</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<scope>runtime</scope>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
</assembly>
Analyse des composants clés
- id & formats : L'
idsera ajouté en suffixe au nom du fichier généré (ex:mon-projet-1.0-bin-dist.zip). Lesformatsdéfinissent les types d'archives souhaités. - fileSets : Cette section permet de copier des répertoires entiers. L'attribut
fileModeest crucial pour les environnements Unix afin de rendre les scripts exécutables (0755). - dependencySets : Gère l'inclusion des bibliothèques externes. Le paramètre
unpackdéfini àfalseconserve les dépendances sous forme de fichiers JAR distincts dans le dossier de destination, ce qui facilite la gestion duclasspath.
Une fois la commande mvn package lancée, le plugin génère une archive structurée dans le répertoire target. Cette approche garantit une cohérence parfaite entre les environnements de développement et de production, en isolant proprement le code, ses réglages et ses dépendances.