Optimisation des déploiements Java avec le plugin Maven Assembly

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'id sera ajouté en suffixe au nom du fichier généré (ex: mon-projet-1.0-bin-dist.zip). Les formats définissent les types d'archives souhaités.
  • fileSets : Cette section permet de copier des répertoires entiers. L'attribut fileMode est 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 unpack défini à false conserve les dépendances sous forme de fichiers JAR distincts dans le dossier de destination, ce qui facilite la gestion du classpath.

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.

Étiquettes: Maven Java maven-assembly-plugin devops packaging

Publié le 8 juin à 16h02