
Dans le développement en Java de projets construits avec Maven, la gestion précise des versions est primordiale. Tout le mécanisme de gestion des dépendances est basé sur des versions précises de tous les « artefacts ».
Dans le cas d’un projet simple, il suffit souvent d’aller modifier le fichier pom.xml qui contient l’ensemble de la description du projet. Cela devient nettement plus sensible dans le cas où les projet est composé de plusieurs modules devant avoir des versions cohérentes. Il faut alors aller mettre à jour la version dans tous les descripteurs, et souvent en double (version du module et version du module parent).
Pour se simplifier la vie, il est possible d’utiliser le « maven-release-plugin ». Celui-ci est principalement destiné à gérer complètement la création d’une nouvelle release du projet. Il va procéder ainsi sur l’ensemble des modules:
- L’utilisateur saisit la nouvelle version de développement X.Y.Z
- Changement de la version courante de A.B.C-SNAPSHOT en A.B.C
- Création d’un tag A.B.C dans le système de versionning
- Changement de la version courante en X.Y.Z-SNAPSHOT
L’astuce que je vais vous présenter ici est qu’il est également possible de l’utiliser pour uniquement mettre à jour la version spécifiée dans les descripteurs maven, sans tag ni commit. Je vais utiliser pour l’exemple mon projet d’émulateur d’ordinateur Matra Alice.
La version courante était « 1.0-SNAPSHOT », mais ce n’était pas cohérent avec le fait que la première release planifiée sera la « 0.1.0″, la version de développement devrait donc logiquement être « 0.1.0-SNAPSHOT »…
Tout d’abord, il faut déclarer le plugin dans le pom.xml racine du projet:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
L’option « autoVersionSubmodules » permet de n’avoir à saisir qu’un seul numéro de version qui sera appliqué de façon homogène à l’ensemble des sous-modules.
Ensuite, nous invoquons la cible « release:update-versions » qui va nous demander de saisir interactivement les versions des modules et mettra les références à jour automatiquement dans les fichiers pom.xml du projet.
macpro:Emulation yk$ mvn release:update-versions
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] Emulation
[INFO] Emulation Core Components
[INFO] Motorola 6847 GPU emulation
[INFO] Motorola 6800 CPU family emulation
[INFO] Matra Alice Computer Emulation
[INFO] ------------------------------------------------------------------------
[INFO] Building Emulation
[INFO] task-segment: [release:update-versions] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [release:update-versions {execution: default-cli}]
What is the new development version for "Emulation"? (org.alcibiade:emulation) 1.1-SNAPSHOT: : 0.1.0-SNAPSHOT
[INFO] Transforming 'Emulation'...
[INFO] Transforming 'Emulation Core Components'...
[INFO] Transforming 'Motorola 6847 GPU emulation'...
[INFO] Transforming 'Motorola 6800 CPU family emulation'...
[INFO] Transforming 'Matra Alice Computer Emulation'...
[INFO] Cleaning up after release...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9 seconds
[INFO] Finished at: Sat Feb 19 11:37:14 CET 2011
[INFO] Final Memory: 21M/81M
[INFO] ------------------------------------------------------------------------
Et voilà, le tour est joué !
Encore un détail, ce plugin agira sur les versions des modules et des déclarations de parents, mais pas sur les dépendances. Pour que les dépendances entre modules référencent bien toujours la même version, il faut utiliser ${project.version}:
<dependency>
<groupId>org.alcibiade</groupId>
<artifactId>emulation-motorola-68xx</artifactId>
<version>${project.version}</version>
</dependency>