95 votes

Avertissement sur l'utilisation de project.parent.version comme version d'un module dans Maven 3

Dans les projets maven multi-modules où je veux que chacun des modules conserve toujours la même version que le parent, j'ai généralement fait quelque chose comme ce qui suit dans le pom.xml du module :

  <parent>
    <groupId>com.groupId</groupId>
    <artifactId>parentArtifactId</artifactId>
    <version>1.1-SNAPSHOT</version>
  </parent>

  <groupId>com.groupId</groupId>
  <artifactId>artifactId</artifactId>
  <packaging>jar</packaging>
  <version>${project.parent.version}</version>
  <name>name</name>

Depuis que j'ai commencé à utiliser maven 3.0-alpha-5, je reçois l'avertissement suivant pour ce faire.

[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.groupid.artifactId:name:jar:1.1-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ com.groupid.artifactId:name::${project.parent.version}, /Users/whaley/path/to/project/child/pom.xml
[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]

Je suis curieux de savoir quel est le vrai problème de lier la version d'un module à la version parent, s'il y en a un ? Ou s'agit-il d'un cas d'avertissement général lorsque n'importe quelle expression, indépendamment du fait qu'il s'agisse de project.parent.version, est utilisée pour l'élément version.

99voto

Pascal Thivent Points 295221

Je suis curieux de savoir quel est le vrai problème de lier la version d'un module à la version parent, s'il y en a un ? Ou s'agit-il d'un cas d'avertissement général lorsque n'importe quelle expression, indépendamment du fait qu'il s'agisse de project.parent.version, est utilisée pour l'élément version.

Eh bien, ce serait facile à tester. Comme j'étais curieux, je l'ai fait pour vous en utilisant le pom suivant :

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>com.mycompany</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>com.mycompany</groupId>
  <artifactId>module</artifactId>
  <version>${myversion}</version>
  <name>module</name>
  <url>http://maven.apache.org</url>
  <properties>
    <myversion>1.0-SNAPSHOT</myversion>
  </properties>
  ...
</project>

Et maven se plaint en effet :

[WARNING] 'version' contains an expression but should be a constant. @ com.mycompany:module:${myversion}, /home/pascal/Projects/maven-maven3-testcase/module/pom.xml

Pour être honnête, je pense que maven a raison ici, cela n'a pas beaucoup de sens d'utiliser une propriété pour l'attribut <version> (du moins pas pour project.version) et c'est bien que maven s'en plaigne.

Et si vous voulez utiliser la version de pom parent dans les sous-modules, il suffit de retirer le <version> tag de l'enfant poms ils hériteront de la version du parent. Ce que vous faites actuellement est inutile.

2 votes

Je vois juste que votre réponse en gras est documentée ici : maven.apache.org/guides/introduction/ . C'est ce qui est mentionné dans Maven : The Definitive guide, mais je n'en ai pas tenu compte au moment où je l'ai lu. Merci pour la correction.

14 votes

Les exemples dans jira.codehaus.org/browse/MNG-4715 semblent avoir des raisons valables pour utiliser une propriété pour l'élément <version>, donc je ne suis pas convaincu qu'il n'y a pas d'utilité pour cela, mais +1 pour nous rappeler que dans le cas où vous voulez que les submodules utilisent la version du pom parent, il suffit de supprimer la balise et laisser l'héritage fonctionner.

1 votes

À partir de Spring Roo 1.3.0.BUILD-SNAPSHOT, si vous supprimez l'option <version> -d'un pom enfant, il commencerait à se plaindre que Version is required for ... . Mais c'est la faute de Spring Roo, pas celle de Maven. Maven fonctionne très bien sans l'étiquette de version.

24voto

S.MANDAL Points 124

Je suis peut-être en retard pour discuter de ce sujet. J'ai une solution simple pour cela WARNING .

Tout d'abord, si vous voulez que tous les modules enfants prennent la même version que le parent, il vous suffit de supprimer <version> du POM enfant et comme vous incluez <parent> dans child POM, ça devrait être là.

En l'absence de <version> dans la POM enfant, il prendra automatiquement la POM parent version .

Maintenant, si vous voulez utiliser property dans la version POM parent et que vous voulez obtenir la même chose dans tous les modules enfants, vous pouvez procéder comme suit.

Il n'y a pas de limitation à l'utilisation des biens dans <version> partie du POM parent ou enfant. Mais si vous utilisez votre propre balise xml pour spécifier cela ou si vous utilisez votre propre propriété, alors WARNING (bien que ce ne soit qu'un avertissement, tout fonctionne comme prévu).

Mais si tu veux te débarrasser de cette WARNING vous pouvez suivre les étapes suivantes :

  1. Créer <properties> dans POM.xml comme ci-dessous

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
  2. En <version> du POM.xml, mettez comme suit

    <version>${revision}</version>

Exemple d'extrait de code (pour un projet multi-modules) :

<groupId>abc.xyz</groupId>
<artifactId>pqr</artifactId>
<!-- <version>1.0.0</version> -->
<version>${revision}</version>
<packaging>pom</packaging>
<description>Parent POM</description>

<properties>
    <revision>1.0.0</revision>
</properties>

Nota : Au lieu de <revision> si vous utilisez un autre nom (par exemple, <my.version> ), vous verrez que WARNING

Maintenant si vous voulez passer la version pendant mvn deploy vous pouvez utiliser mvn deploy "-Drevision=1.0.0-SNAPSHOT" et de même pour mvn install également.

Maintenant, si la configuration ci-dessus, vous voulez utiliser comme POM Parent, et vous voulez utiliser le même version dans tous les modules enfants, cela peut également être fait. Dans chaque child module POM utiliser ci-dessous

<parent>
    <groupId>abc.xyz</groupId>
    <artifactId>Parent</artifactId>
    <!-- <version>1.0.0</version> -->
    <version>${revision}</version>
</parent>

<groupId>abc.xyz</groupId>
<artifactId>Child</artifactId>
<!-- <version>1.0.0</version> -->     <!-- Automatically inherit parent POM version -->
<name>Demo</name>

À titre de référence, vous pouvez consulter configuration multi-modules maven

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X