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 en 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 que je dois mettre 0.1-SNAPSHOT
est A/pom.xml
. Mais si je retire la <version>0.1-SNAPSHOT</version>
de B/pom.xml
la rubrique mère, se plaint maven sur la version manquante pour le parent.
Y a-t-il un moyen que je puisse simplement utiliser ${project.version}
ou quelque chose comme ça pour éviter d'avoir 01.-SNAPSHOT
dans les deux poms?
inheritance
maven
Shengjie
la source
la source
Réponses:
EDIT: Depuis Maven 3.5.0, il existe une bonne solution pour cela en utilisant un
${revision}
espace réservé. Voir la 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, il est hérité comme version du module ce qui est souhaitable dans la plupart des cas. De plus, la déclaration de version de ce parent est automatiquement annulée par Maven Release Plugin, donc - en fait - ce n'est pas un problème que vous ayez une version à 2 endroits tant que vous utilisez Maven Release Plugin pour publier ou simplement modifier des versions.
Notez qu'il existe certains cas où ce comportement est en fait assez correct et donne plus de flexibilité dont vous pourriez avoir besoin. Parfois, vous souhaitez utiliser une partie de la version précédente du parent pour hériter, mais ce n'est pas un cas courant.
la source
${revision}
espace réservé pour cela. Voir ma réponse ;-)Maven n'est pas conçu pour fonctionner de cette façon, 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 chemin relatif plutôt que ses coordonnées maven pures, et en plus d'externaliser 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>
Enfant pom
<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 problème spécifique, sauf le fait que maven enregistre beaucoup d'avertissements au début de la construction, ce qui n'est pas très élégant.
ÉDITER
Il semble que maven 3.0.4 n'autorise plus une telle configuration.
la source
'version' contains an expression but should be a constant.
Le moyen le plus simple de mettre à jour les versions IMO:
(faites cela dans votre dossier pom racine / parent).
Vos POM sont analysés et il vous est demandé quelle version définir.
la source
mvn versions:update-child-modules
sinon toutes les versions de pom du module enfant seront ignorées.Depuis Maven 3.5.0, vous pouvez utiliser l'
${revision}
espace réservé pour cela. L'utilisation est documentée ici: Versions Maven CI Friendly .En bref, le pom 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 aussi devez utiliser le Aplatir Maven Plugin pour générer des documents pom avec le numéro de version dédiée inclus pour le déploiement. Le HowTo est documenté dans la documentation liée.
@Khmarbaise a également écrit un joli article sur cette fonctionnalité: Maven: Fichiers POM sans version?
la source
${revision}
dans le pom (dans le référentiel maven) en tant que dépendance dans un autre projet. Je ne pense pas que cela fonctionnera.Comme Yanflea l'a mentionné, il existe un moyen de contourner cela.
Dans Maven 3.5.0, vous pouvez utiliser la méthode suivante pour transférer la version du 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 ce que vous voulez qui n'est pas une propriété réservée.la source
Vous pouvez également utiliser:
pour mettre à jour les numéros de version dans vos POM.
la source
La réponse d' eFox a fonctionné pour un seul projet, mais pas lorsque je référençais un module d'un autre (le pom.xml était toujours stocké dans my
.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 les 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 danstarget
, qui est définie dans ma.gitignore
configuration:<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 pom.xml parent
la source
Utilisez
mvn -N versions:update-child-modules
pour mettre à jour la version de l'enfant pomhttps://www.mojohaus.org/versions-maven-plugin/examples/update-child-modules.html
la source
<parent> <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> </parent> <groupId>com.dummy.bla.sub</groupId> <artifactId>kid</artifactId>
Vous voulez dire que vous voulez supprimer la version du bloc parent du pom de B, je pense que vous ne pouvez pas le faire, le groupId, artifactId et la version ont spécifié les coordonnées pom du parent, ce que vous pouvez omettre est la version de l'enfant.
la source