2009-12-30 10 views
66

Dans les projets multi-modules maven où je souhaite que chaque module 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:Avertissement sur l'utilisation de project.parent.version comme version d'un module dans Maven 3

<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'utilise Maven 3.0 alpha-5, je reçois de le faire l'avertissement suivant.

[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 ce que le vrai problème avec attacher la version d'un module à la version mère est, le cas échéant? Ou s'agit-il d'un avertissement général lorsqu'une expression, qu'elle soit projet.parent.version, est utilisée pour l'élément version.

Répondre

77

I'm curious to know what the real problem with tying a module's version to the parent version is, if any? Or is this a case of a general warning when any expression, regardless of whether it's project.parent.version, is used for the version element.

Eh bien, ce serait facile à tester. Parce que j'étais curieux, je l'ai fait pour vous en utilisant la pom suivante:

<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 est ici, il doesn Cela n'a pas beaucoup de sens d'utiliser une propriété pour l'élément <version> (du moins pas pour project.version) et c'est bien que maven s'en plaint.

Et si vous souhaitez utiliser la version pom parent dans les sous-modules, supprimez la balise <version> de l'enfant poms, ils hériteront la version du parent. Ce que vous faites actuellement est juste inutile. Il suffit de voir votre réponse en caractères gras documentée ici: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance.

+2

Il a été mentionné de cette façon dans Maven: Le guide définitif, mais j'ai glissé dessus au moment où je l'ai lu. Merci pour la correction. – whaley

+11

Les exemples dans http://jira.codehaus.org/browse/MNG-4715 semblent avoir des raisons valables d'utiliser une propriété pour l'élément , donc je ne suis pas convaincu que cela ne sert à rien, mais +1 pour nous rappelant que dans le cas où vous voulez que les sous-modules utilisent la version pom parent, supprimez simplement la balise et laissez l'héritage fonctionner. – metamatt

+1

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