253 votes

Héritage de la version du projet Maven - dois-je spécifier la version parent ?

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 du parent, donc le seul endroit dans mon cas où j'ai besoin de mettre 0.1-SNAPSHOT es 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.

Y a-t-il un moyen pour que je puisse simplement utiliser ${project.version} ou quelque chose comme ça pour éviter d'avoir 01.-SNAPSHOT dans les deux poms ?

5 votes

Vous devrez attendre la version 3.1 de Maven pour cela, j'en ai peur.

3 votes

0 votes

150voto

FrVaBe Points 14559

Depuis Maven 3.5.0, vous pouvez utiliser la fonction ${revision} pour cela. L'utilisation est documentée ici : Versions adaptées à Maven CI .

En bref, le pom parent ressemble à ceci (cité dans la documentation d'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 le pom enfant comme ceci

<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 aussi doivent utiliser le Plugin Maven Flatten 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.

@khmarbaise a également écrit un billet sur cette fonctionnalité : Maven : Fichiers POM sans version ?

107voto

Michal Kalinowski Points 3404

EDIT : Depuis Maven 3.5.0, il existe une solution intéressante à ce problème en utilisant ${revision} placeholder. Voir La réponse de FrVaBe pour les 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, elle est héritée comme la version du module, ce qui est souhaitable dans la plupart des cas. De plus, la déclaration de la version de ce parent est automatiquement modifiée par Maven Release Plugin, donc - en fait - ce n'est pas un problème d'avoir une version à deux endroits tant que vous utilisez Maven Release Plugin pour publier ou simplement modifier les versions.

Notez qu'il y a des cas où ce comportement est en fait tout à fait correct et donne plus de flexibilité dont vous pouvez avoir besoin. Parfois, vous souhaitez utiliser une partie de la version du parent précédent pour hériter, mais ce n'est pas un cas courant.

6 votes

Maintenant, vous pouvez utiliser le ${revision} pour cela. Voir ma réponse ;-)

3 votes

Cette réponse est maintenant périmée - consultez la réponse de @FrVaBe ici : stackoverflow.com/a/51969067/514483

0 votes

@FrVaBe : que se passe-t-il si nous avons des parents imbriqués avec des versions différentes ? Nous ne pouvons pas utiliser une seule propriété ${revision} dans ce cas, ce n'est pas suffisant.

92voto

Yanflea Points 1817

Maven n'est pas conçu pour fonctionner de cette manière, mais une solution de contournement existe pour atteindre cet objectif (peut-être avec des effets secondaires, vous devrez essayer). L'astuce consiste à dire au projet enfant de trouver son parent via son fichier chemin relatif plutôt que ses coordonnées maven pures, et en plus d'externaliser le numéro de version dans une propriété :

Parent pom

<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>

Pompe pour enfant

<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 certain temps pour l'un de mes projets, sans problème particulier, si ce n'est le fait que maven enregistre beaucoup d'avertissements au début de la construction, ce qui n'est pas très élégant.

EDITAR

Il semble que maven 3.0.4 ne permette plus une telle configuration.

2 votes

Oui, je crains que maven ne soit pas conçu pour fonctionner de cette façon, il vaut mieux s'en tenir à mettre les versions dans le sous pom.xml. le plugin release de maven ne se soucie pas vraiment des versions ici de toute façon.

0 votes

Tout à fait d'accord. Si vous voulez vraiment utiliser le plugin release, l'autre réponse est certainement la meilleure, s'en tenir au numéro de version dans les deux pom.xml. C'est la façon standard d'implémenter l'héritage avec maven. J'ai juste pensé qu'il était intéressant de mentionner qu'une telle solution de contournement existe, juste au cas où.

0 votes

Il y a un problème avec cette solution : elle ne fonctionne pas, du moins avec Maven 3.0.4.

91voto

pai Points 899

C'est le moyen le plus simple de mettre à jour les versions, selon moi :

$ mvn versions:set -DgenerateBackupPoms=false

(faites-le dans votre dossier Root/parent pom).

Vos POMs sont analysés et il vous est demandé quelle version définir.

24voto

eFox Points 373

Comme Yanflea l'a mentionné, il existe un moyen de contourner ce problème.

Dans Maven 3.5.0 vous pouvez utiliser la méthode suivante pour transférer la version vers le bas à partir du projet parent :

POM parent.xml

<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>

Module POM.xml

<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 à ce que vous voulez qui n'est pas une propriété réservée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X