Description du problème
Nous avons un pom d'agrégateur Maven avec quelques poms enfants (modules) ayant tous la même version :
pom.xml (parent zoo, version 2.0.0)
|-- pom.xml (child module cat, version 2.0.0)
|-- pom.xml (child module dog, version 2.0.0)
|-- ...
Dans la section de gestion des dépendances, tous les enfants sont déclarés avec la version du projet pour faciliter la déclaration des dépendances. Le pom parent ressemble à
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>
<modules>
<module>cat</module>
<module>dog</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<version>${project.version}</version>
</dependency>
<!-- other child modules go here -->
</dependencies>
</dependencyManagement>
Les poms enfants sont définis comme suit
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>
Il y a un autre pom qui déclare le pom parent comme son parent aussi (héritage) mais n'est pas listé comme sous-module dans ce parent (pas d'agrégation). Ce pom a une version différente.
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>
<groupId>com.acme</groupId>
<artifactId>boo</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>
En fait, nous nous attendions à ce que la version de la dépendance com.acme.dog
est tiré de la section de gestion des dépendances du pom parent com.acme.zoo
et est égal à 2.0.0
. Cependant, le Documentation Maven sur l'interpolation des projets et les variables dit
Un facteur à noter est que ces variables sont traitées après l'héritage comme indiqué ci-dessus. Cela signifie que si un projet parent utilise une variable, c'est sa définition dans le projet enfant, et non dans le projet parent, qui sera finalement utilisée.
C'est-à-dire : dans la construction du réacteur, la variable ${project.version}
utilisé dans la section de gestion des dépendances du pom parent com.acme.zoo
est évalué par rapport à com.acme.bar
et égale à 1.0.0
ce qui n'est pas comme prévu.
Nota
Il existe une solution de contournement consistant à utiliser une variable dans le pom parent qui doit être maintenue en synchronisation avec les versions du pom parent. Cependant, cette solution est incompatible avec le Plugin Maven Release .
Question
Comment pouvons-nous obtenir le comportement souhaité
- pom de l'agrégateur avec des enfants ayant la même version
- déclaration des enfants dans la section de gestion des dépendances pour s'assurer que toutes les dépendances ont la même version
- utilisation de l'héritage avec des versions différentes
- la compatibilité avec
maven-release-plugin
sans les écueils de l'interpolation des variables du projet ?