jeudi 29 novembre 2012

[Maven] Générer un ZIP contenant un autre ZIP

Pour changer un peu, un article bien technique pour répondre à un besoin que j'ai rencontré : générer un premier ZIP puis un second contenant le premier ZIP, et éventuellement d'autres fichiers.

Je partage ici la solution, avec quelques explications, si toutefois ça peut servir à d'autres.

Point de départ

Avec le plugin maven-assembly-plugin, je sais générer un ZIP contenant des dépendances (ou des fichiers).

Il me faut un fichier pom.xml contenant le plugin :
Et un fichier assembly-final-classic.xml comme par exemple celui-là pour assembler les dépendances (avec le chemin "libs" dans le ZIP) et les fichiers du répertoire "zip-final" :


Solution avec module

Une première solution, déjà éprouvée  pourrait consister à créer un module pour générer le premier ZIP, et mettre cet artefact comme dépendance. Le ZIP final contiendrait alors bien le premier ZIP issu du module.

Pour différentes raisons, je ne pouvais pas trop m'orienter vers cette solution, il me fallait trouver une solution pour faire cette double génération au sein du même projet/module Maven.

Générer le premier ZIP

La solution consiste :

  • à ajouter une section <execution>
  • à l'attacher à la phase "prepare-package" pour être sûr qu'elle soit exécutée avant l'autre <execution>
  • à créer un autre assembly.xml pour décrire le contenu de ce premier ZIP
  • à ne pas "attacher" le fichier généré à l'artefact courant Maven (<attach>false</attach>), car on ne peut attacher qu'un seul fichier généré par artefact 
  • à spécifier un répertoire de destination spécifique pour faciliter la suite (<outputDirectory>${project.build.directory}/inter</outputDirectory>)

Le fichier pom.xml final est alors de la forme :
Et le fichier assembly-inter.xml peut par exemple assembler des fichiers d'un répertoire "zip-inter" comme ceci :

Intégrer ce ZIP dans le ZIP final

Il faut maintenant compléter le fichier "assembly-final.xml" pour y ajouter le (ou les) fichier(s) précédemment générés dans "${project.build.directory}/inter" :
Et voilà, on obtient un fichier "test-0.0.1-SNAPSHOT-final.zip" qui contient, en autre, le fichier "test-0.0.1-SNAPSHOT-inter.zip".

Tous les extraits ci-dessus sont là : https://gist.github.com/4164987

Aucun commentaire:

Enregistrer un commentaire