J'ai deux projets: Projet parent: A, Sous projet: B
A/pom.xml:
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>
Et dans B/pom.xml, j'ai:
<parent>
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
</parent>
<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>
Je veux que B hérite de la version de parent de la version, de sorte que le seul endroit où je dois mettre 0.1-SNAPSHOT
est A/pom.xml
. Mais si je supprime le <version>0.1-SNAPSHOT</version>
de B/pom.xml
sous la section parent, Maven se plaint de la version manquante pour le parent.
Est-il possible d’utiliser ${project.version}
ou quelque chose du genre pour éviter d’avoir 01.-SNAPSHOT
dans les deux poms?
EDIT: Depuis Maven 3.5.0, il existe une solution intéressante pour cela avec ${revision}
placeholder. Voir réponse de FrVaBe pour plus de détails. Pour les versions précédentes de Maven, voir ma réponse originale ci-dessous.
Non, il n'y en a pas. Vous devez toujours spécifier la version du parent. Heureusement, la version du module en hérite, ce qui est souhaitable dans la plupart des cas. De plus, la déclaration de version de ce parent est automatiquement supprimée par Maven Release Plugin. Ainsi, en fait, il n’ya pas de problème si vous avez une version à 2 endroits tant que vous utilisez Maven Release Plugin pour publier ou simplement modifier des versions.
Notez que dans certains cas, ce comportement est assez correct et donne plus de flexibilité dont vous pourriez avoir besoin. Parfois, vous souhaitez utiliser une version de la version précédente du parent pour hériter, mais ce n'est pas un cas courant.
Maven n’est pas conçu pour fonctionner de cette façon, mais il existe une solution de contournement pour atteindre cet objectif (avec des effets secondaires, vous devrez peut-être essayer). L'astuce consiste à indiquer au projet enfant de trouver son parent via son chemin relatif plutôt que ses coordonnées maven pures, et d'extérioriser le numéro de version dans une propriété:
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>
<properties>
<!-- Unique entry point for version number management -->
<global.version>0.1-SNAPSHOT</global.version>
</properties>
<parent>
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<relativePath>..</relativePath>
</parent>
<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>
J'ai utilisé cette astuce pendant un moment pour l'un de mes projets, sans aucun problème particulier, sauf le fait que Maven enregistre beaucoup d'avertissements au début de la construction, ce qui n'est pas très élégant.
Semble que maven 3.0.4 n’autorise plus une telle configuration.
Le moyen le plus simple de mettre à jour les versions IMO:
$ mvn versions:set -DgenerateBackupPoms=false
(faites-le dans votre dossier pom racine/parent).
Vos POM sont analysés et il vous est demandé quelle version définir.
Depuis Maven 3.5.0, vous pouvez utiliser l’espace réservé ${revision}
pour cela. L'utilisation est documentée ici: Maven CI Friendly Versions .
En résumé, le parent parent ressemble à ceci (cité dans la documentation Apache):
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.Apache</groupId>
<artifactId>Apache</artifactId>
<version>18</version>
</parent>
<groupId>org.Apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}</version>
...
<properties>
<revision>1.0.0-SNAPSHOT</revision>
</properties>
<modules>
<module>child1</module>
..
</modules>
</project>
et l'enfant pom comme ça
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.Apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<version>${revision}</version>
</parent>
<groupId>org.Apache.maven.ci</groupId>
<artifactId>ci-child</artifactId>
...
</project>
Vous devez également utiliser le Flatten Maven Plugin pour générer des documents pom avec le numéro de version dédié inclus pour le déploiement. Le HowTo est documenté dans la documentation liée.
Aussi, @khmarbaise a écrit un article blob sympa sur cette fonctionnalité: Maven: Fichiers POM sans version en elle?
Comme Yanflea l'a mentionné, il existe un moyen de contourner ce problème.
Dans Maven .5., vous pouvez utiliser le moyen suivant pour transférer la version depuis le projet parent:
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mydomain</groupId>
<artifactId>myprojectparent</artifactId>
<packaging>pom</packaging>
<version>${myversion}</version>
<name>MyProjectParent</name>
<properties>
<myversion>0.1-SNAPSHOT</myversion>
</properties>
<modules>
<module>modulefolder</module>
</modules>
...
</project>
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mydomain</groupId>
<artifactId>myprojectmodule</artifactId>
<version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
</parent>
<groupId>se.car_o_liner</groupId>
<artifactId>vinno</artifactId>
<packaging>war</packaging>
<name>Vinno</name>
<!-- Note that there's no version specified; it's inherited from parent -->
...
</project>
Vous êtes libre de changer myversion
pour tout ce que vous voulez qui n'est pas une propriété réservée.
Vous pouvez aussi utiliser:
$ mvn release:update-versions -DdevelopmentVersion={version}
pour mettre à jour les numéros de version dans vos POM.
La réponse de eFox a fonctionné pour un seul projet, mais pas lorsque je faisais référence à un module provenant d'un autre (le pom.xml était toujours stocké dans mon .m2
avec la propriété au lieu de la version ).
Cependant, cela fonctionne si vous le combinez avec le flatten-maven-plugin
, car il génère le poms avec la version correcte, pas la propriété.
La seule option que j'ai modifiée dans la définition du plug-in est la outputDirectory
, elle est vide par défaut, mais je préfère l'avoir dans target
, qui est définie dans ma configuration .gitignore
:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.0.1</version>
<configuration>
<updatePomFile>true</updatePomFile>
<outputDirectory>target</outputDirectory>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
La configuration du plug-in va dans le parent pom.xml