在Maven 3中使用project.parent.version作为模块版本的警告


79

在我希望每个模块始终与父模块保持相同版本的Maven多模块项目中,我通常在模块的pom.xml中执行以下操作:

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

由于我开始使用maven 3.0-alpha-5,因此会收到以下警告。

[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]

我很好奇,将模块版本与父版本绑定的真正问题是什么?还是将任何表达式(无论是否为project.parent.version)用于version元素时,这都是一般警告的情况。

Answers:


91

我很好奇,知道将模块版本与父版本绑定的真正问题是什么?还是将任何表达式(无论是否为project.parent.version)用于version元素时,这都是一般警告的情况。

好吧,这很容易测试。因为我很好奇,所以我使用以下pom为您做到了:

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

Maven确实在抱怨:

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

坦白地说,我认为maven就在这里,对<version>元素使用属性没有什么意义(至少不是对project.version来说),让maven抱怨是一件很不错的事情。

而且,如果要在子模块中使用父pom版本,只需<version>从子poms中删除标签,它们就会父pom版本继承。您当前正在做的事情是不必要的。


2
只是看到您的粗体答案记录在这里: maven.apache.org/guides/introduction/…。在《 Maven:权威指南》中曾提到过这种方式,但在我阅读该指南时,我对此有所掩饰。感谢您的更正。
whaley

13
jira.codehaus.org/browse/MNG-4715中的示例似乎有一些为<version>元素使用属性的正当理由,因此我不认为这没有用,但是+1提醒我们如果您希望子模块使用父pom版本,只需删除标签并让继承起作用。
metamatt 2011年

7
那真是愚蠢:-(。我该如何在版本中使用buildnumber-maven-plugin中的$ {buildNumber}?
Nux 2014年

6
没有!在Maven版本3.2.1中,从子poms中删除版本标记,导致“项目生成错误:缺少parent.version”
Liu

6
@shanyangqu。只是在这里要清楚。正确地说,您不能从子pom的部分中删除该版本。需要指定您要继承的父对象。但是您可以忽略孩子本身的版本。它将默认为parent.version(父部分中的版本)。
drrob

2

我可能在这里讨论这个很晚。我对此有一个简单的解决方案WARNING

首先,如果希望所有子模块都采用与父模块相同的版本,则只需<version>从子POM中删除标签,然后将其包含<parent>在子POM中就可以了。

如果没有<version>子POM,它将自动采用父POM version

现在,如果要property在父POM版本中使用并且想要在所有子模块中都使用相同版本,则可以按照以下步骤进行操作。

<version>部分父项或子项POM中使用属性没有限制。但是,如果您使用自己的xml标记来指定该标记,或者使用了自己的属性,那么WARNING它就会出现(尽管这只是警告,但一切都会按预期进行)。

但是,如果您想摆脱这种情况WARNING,可以按照以下步骤操作:

  1. 如下创建<properties>内部POM.xml

    <properties>
        <revision>1.0.0</revision>  <!-- Put your version -->
    </properties>
    
  2. <version>POM.xml中,如下所示

    <version>${revision}</version>
    

示例代码段(用于多模块项目):

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

注意<revision>如果您使用其他任何名称(例如<my.version>),都将代替,WARNING

现在,如果您希望在期间传递版本mvn deploy,则也可以使用mvn deploy "-Drevision=1.0.0-SNAPSHOT"和类似的方式mvn install

现在,如果进行了上述配置,则您想用作“父” POM,并且希望version在所有子模块中都使用“ POM” ,那也可以做到。在每个中child module POM,在下面使用

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

作为参考,您可以进行Maven多模块设置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.