web-dev-qa-db-fra.com

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

158
Shengjie

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.

68

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

Pom parent

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

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

MODIFIER

Semble que maven 3.0.4 n’autorise plus une telle configuration.

81
Yanflea

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.

72
pai

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?

37
FrVaBe

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:

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

19
eFox

Vous pouvez aussi utiliser:

$ mvn release:update-versions -DdevelopmentVersion={version}

pour mettre à jour les numéros de version dans vos POM.

17
Jerry Jin

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

7
LeoLozes