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