83

在我希望每个模块始终与父模块保持相同版本的 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)用于版本元素时,这是一个一般警告的情况。

4

2 回答 2

94

我很想知道将模块版本与父版本绑定的真正问题是什么,如果有的话?或者,当任何表达式(无论它是否为 project.parent.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 版本,只需从子 pom 中删除<version>标签,它们将继承父版本的版本。您当前正在做的事情是不必要的。

于 2009-12-30T19:40:27.053 回答
10

我可能会迟到在这里讨论这个问题。我有一个简单的解决方案WARNING

首先,如果您希望所有子模块都采用与父模块相同的版本,那么您只需<version>从子 POM 中删除标签,并且当您包含<parent>在子 POM 中时,它应该在那里。

在没有<version>子 POM 的情况下,它将自动采用 Parent POM version

现在,如果您想property在父 POM 版本中使用并希望在所有子模块中使用相同的版本,您可以按照以下方式进行操作。

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

但是如果你想摆脱这个WARNING,你可以按照以下步骤操作:

  1. 在 POM.xml 中创建<properties>如下

    <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在所有子模块中使用相同的,也可以这样做。在每个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 多模块设置

于 2020-09-03T07:49:36.040 回答