Constuire une archive ZIP avec Maven lors de vos builds

Pour un projet (Java + Maven), j’ai eu besoin de constituer un livrable sous forme de ZIP contenant divers composantes:

  • binaire principal de l’application
  • fichier de configuration
  • fichiers utilisés par l’application
  • scripts de lancement Shell (GNU/Linux) et Bat (Windows)

J’avais déjà câblé le projet sur la chaine d’intégration continue, donc un job (de release) Jenkins produisait le binaire principal de l’application et le déposait sur le repository Maven (Nexus) d’entreprise.

Dans la même dynamique d’automatisation, j’ai donc crée un 2nd Job donc le but était de produire en sortie l’archive prête à l’emploi (assez pratique pour ne pas s’embêter à copier/coller + zipper des petits bouts). Le nom du ZIP final prenant dynamiquement en compte la version du POM (On aurait pu être plus fin que ça et y ajouter par exemple le numéro de révision SVN, de commit git, ou de build Jenkins…)

Pour ce genre de besoin, il existe le plugin maven-assembly-plugin.

Usage:

Comme tout plugin maven, il doit être déclarer et configurer au niveau du POM (pom.xml) de votre projet.

                      <plugin>
                              <groupId>org.apache.maven.plugins</groupId>
                              <artifactId>maven-assembly-plugin</artifactId>
                              <configuration>
                                <descriptor>src/assembly/zip.xml</descriptor>
                                <finalName>ZIPDemoProject-${version}</finalName>
                              </configuration>
                              <executions>
                                <execution>
                                  <phase>install</phase>
                                  <goals>
                                    <goal>single</goal>
                                  </goals>
                                </execution>
                              </executions>
                        </plugin>
 

Vous l’aurez remarqué, la configuration nécessite un descripteur, le mien je l’ai nommé zip.xml et placé dans le répertoire src/assembly du projet Java. Que contient-il ? Voilààààà:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id></id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory> <!-- si true: alors votre archive contiendra un dossier parent, qui lui contiendra vos fichiers choisis -->
<fileSets>
  <fileSet>
    <outputDirectory>/</outputDirectory>
    <directory>${basedir}/target/ZIPDemoProject</directory>
    <includes>
        <include>**/*.*</include> <!-- J'aurai bien pu ne selectionner que les .txt en mettant *.txt -->
    </includes>
  </fileSet>
</fileSets>
</assembly>

Explications:

Le plugin est capable de lancer plusieurs opérations de construction appelées « execution ». Chacune doit disposer d’un goal  qui est en faite la phase de déclenchement en rapport avec le cycle de vie Maven. Dans l’exemple que j’ai pris, je zippe un dossier, qui lui a été constitué en copiant des fichiers lors de la phase de package (L’article la dessus est disponible ici)

En indiquant la phase install, je suis donc sûr d’avoir les pré-requis.

Pour en savoir plus sur le plugin-maven-assenbly:

http://maven.apache.org/plugins/maven-assembly-plugin/

Comme toujours, n’hésitez pas à commenter et à me poser des questions si vous avez des difficultés la dessus.

@++

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s