25 juin 2009

assembly mon amour...

Le plugin maven-assembly est probablement le plus énervant de la galaxie Maven.

Comme de nombreux Mavenistes j'utilise "l'héritage naturel" qui consiste à utiliser un même POM pour définir les modules du projet et comme parent commun.

Effet de bord : la construction mvn install commence par le parent, puis les modules, ce qui est logique si on veut que les modules "voient" leur parent dans son état final.

Maintenant, si je veux produire un assembly, ce plugin doit s'exécuter ... après les modules. Le bon vieux problème de l'oeuf et de la poule !

Une solution simple qui peut servir à d'autres : un POM "pom-assembly.xml" qui ne déclare que le plugin assembly attaché à la phase install et un unique module "."

<modules>
<module>.</module>
</modules>

<build>
<defaultgoal>install</defaultgoal>
<plugins>
<plugin>
<artifactid>maven-assembly-plugin</artifactid>
<inherited>false</inherited>
...
</plugin>
</plugins>
</build>

en lançant un mvn -f pom-assembly.xml install maven va enchaîner l'install des modules mais pas celle de ce POM qui n'est plus le parent global.

D:\projets\xx>mvn -f pom-assembly.xml
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] xx parent
[INFO] xx :: Composants GWT
[INFO] xx :: configuration
[INFO] xx :: infrastructure
[INFO] xx :: wsdl
[INFO] xx :: modele
[INFO] xx :: services
[INFO] xx :: persistance
[INFO] xx :: ordonnanceur
[INFO] xx :: services web
[INFO] xx :: batchs
[INFO] xx :: simulateurs
[INFO] xx :: ear
[INFO] xx :: tests d'intÚgration
[INFO] xx :: assembly
[INFO] -----------------------------------------------

Je sais, ça sent le gros hack à deux cents, mais ça dépanne en attendant Maven 3

2 commentaires:

bengali a dit…

Merci pour l'astuce. Une autre façon de faire est de créer un module assembly avec son pom et le plugin assembly bindé à la phase install. Et dans ce pom mettre les autres modules en dépendance pour que ce module soit buildé en dernier. Cela oblige également dans l'assembly à utiliser des <dependencySet> au lieu de <moduleSet>.

Luc D

nicolas deloof a dit…

Oui, cette autre "astuce" est d'ailleurs documentée dans la FAQ du plugin, seulement comme tu le souligne cela oblige à déclarer les modules cibles comme dépendances. Dans mon cas ça deviendrait pénible avec 5 modules au moins à déclarer.

Bref, sur ce coup là la gestion du cycle de vie de Maven2 montre ses limites. Vivement Maven3 :)