web-dev-qa-db-fra.com

Version Maven avec une propriété

J'ai un gros projet Maven (Tycho) qui contient environ 400 plug-ins.

Nous avons spécifié la version de l'application dans chaque fichier POM.

Existe-t-il un moyen de spécifier la version de tous les POM: s sur un seul emplacement?

Je pense que certains pensent comme:

<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>

....

<version>${buildVersion}</version>

Nous avons un parent pom.xml:

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>pom</packaging>

Ensuite, dans chaque POM, référence au POM parent:

<parent>
  <artifactId>build.parent</artifactId>
  <groupId>company</groupId>
  <relativePath>../build.parent/pom.xml</relativePath>
  <version>1.1.2-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>Eclipse-plugin</packaging>
39
Jan Pešta

Si vous avez un projet parent, vous pouvez définir la version dans le pom parent et dans les enfants, vous pouvez référencer les bibliothèques sœurs à l'aide de $ {project.version} ou $ {version} = propriétés.

Si vous voulez éviter de répéter la version du parent dans chaque enfant, procédez comme suit:

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>

<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>

Et puis dans vos enfants pom vous devez faire:

    <parent>
      <artifactId>build.parent</artifactId>
      <groupId>company</groupId>
      <relativePath>../build.parent/pom.xml</relativePath>
      <version>${my.version}</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>company</groupId>
    <artifactId>artifact</artifactId>
    <packaging>Eclipse-plugin</packaging>

    <dependencies>
        <dependency> 
           <groupId>company</groupId>
           <artifactId>otherartifact</artifactId>   
           <version>${my.version}</version>
or
           <version>${project.version}</version>
        </dependency>
    </dependencies>

hth

29
Frederic Close

L'utilisation d'une propriété pour la version génère l'avertissement suivant:

[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

Si votre problème est que vous devez changer de version à plusieurs endroits parce que vous changez de version, la bonne chose à faire est d'utiliser le plug-in Maven Release qui le fera automatiquement pour vous.

14

Avec une version Maven de 3.5 ou supérieure, vous devriez pouvoir utiliser un espace réservé (par exemple $ {revision}) dans la section parent et dans le reste du pom, vous pouvez utiliser ${project.version}.

En fait, vous pouvez également omettre les propriétés du projet en dehors de parent qui sont identiques, car elles seront héritées. Le résultat ressemblerait à ceci:

<project>
    <parent>
    <artifactId>build.parent</artifactId>
    <groupId>company</groupId>
    <relativePath>../build.parent/pom.xml</relativePath>
    <version>${revision}</version>  <!-- use placeholder -->
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <artifactId>artifact</artifactId>
    <!-- no 'version', no 'groupId'; inherited from parent -->
    <packaging>Eclipse-plugin</packaging>

    ...
</project>

Pour plus d'informations, en particulier sur la manière de résoudre le paramètre fictif lors de la publication, reportez-vous à la section Versions conviviales Maven CI | Configuration multi-modules .

6
Kariem

La réponse correcte est la suivante (exemple de version):

  • Dans pom.xml parent, vous devriez avoir (pas à l'intérieur de properties):

    <version>0.0.1-SNAPSHOT</version>
    
  • Dans tous les modules enfants, vous devriez avoir:

    <parent>
        <groupId>com.vvirlan</groupId>
        <artifactId>grafiti</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    

Donc, il est codé en dur.

Maintenant, pour mettre à jour la version, procédez comme suit:

mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
mvn versions:commit # Necessary to remove the backup file pom.xml

et tous vos 400 modules auront la version parent mise à jour.

6
ACV

Si vous utilisez Maven 3, une solution pour contourner ce problème consiste à utiliser le plugin versions http://www.mojohaus.org/versions-maven-plugin/

Plus précisément les commandes,

mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit

Ceci mettra à jour les poms parent et enfant en 2.0-RELEASE. Vous pouvez exécuter ceci comme une étape de construction avant.

Contrairement au plug-in de publication, il n'essaie pas de parler à votre contrôle de source

2
rince

Voir le forum Maven - Utilisateurs 'version' contient une expression mais doit être une constante. Mieux moyen d'ajouter une nouvelle version? :

voici pourquoi c'est un mauvais plan.

le pom déployé n'aura pas la valeur de la propriété résolue; ainsi, toute personne dépendant de ce pom choisira la dépendance comme étant la chaîne non interpolée avec le symbole $ {} et une grande partie de l'hilarité s'ensuivra dans votre processus de génération.

dans maven 2.1.0 et/ou 2.2.0, une tentative de déploiement de poms avec des propriétés résolues ... a dépassé les attentes, raison pour laquelle ces deux versions ne sont pas recommandées, 2.2.1 étant la version 2.x recommandée .

0
Gerold Broser