【问题标题】:Warning on using project.parent.version as the version of a module in Maven 3在 Maven 3 中使用 project.parent.version 作为模块版本的警告
【发布时间】:2010-12-31 04:04:38
【问题描述】:

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

【问题讨论】:

    标签: maven maven-3


    【解决方案1】:

    我很想知道将模块版本与父版本绑定的真正问题是什么,如果有的话?或者,当任何表达式(无论它是否为 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 就在这里,为 &lt;version&gt; 元素使用属性没有多大意义(至少对于 project.version 而言不是),并且很高兴 maven 抱怨它.

    如果您想在子模块中使用父 pom 版本,只需从子 pom 中删除 &lt;version&gt; 标签,它们将从父 pom 继承版本。您当前正在做的事情是不必要的。

    【讨论】:

    • 只是看到您在此处记录的粗体答案:maven.apache.org/guides/introduction/…。在 Maven: The Definitive guide 中提到过这种方式,但我在阅读时忽略了这一点。谢谢指正。
    • jira.codehaus.org/browse/MNG-4715 中的示例似乎有一些正当理由为 元素使用属性,所以我不相信这样做没有用,但 +1 提醒我们如果您希望子模块使用父 pom 版本,只需删除标签并让继承工作。
    • 太愚蠢了 :-(。如何在版本中使用 buildnumber-maven-plugin 中的 ${buildNumber}?
    • 不!在 Maven 版本 3.2.1 中,从子 pom 中删除版本标签,导致 'project build error: parent.version is missing'
    • @shanyangqu。在这里要清楚。你说你不能从子 pom 的 parent 部分中删除版本是正确的。这需要指定您从中继承的父级。但是您可以忽略孩子本身的版本。它将默认为 parent.version(父部分中的版本)。
    【解决方案2】:

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

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

    如果子 POM 中没有 &lt;version&gt;,它会自动取 Parent POM version

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

    在父或子 POM 的 &lt;version&gt; 部分中使用属性没有限制。但是,如果您使用自己的 xml 标签来指定或使用自己的属性,那么 WARNING 就会出现(虽然这只是警告,但一切都按预期工作)。

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

    1. 在 POM.xml 中创建&lt;properties&gt;,如下所示

      <properties>
          <revision>1.0.0</revision>  <!-- Put your version -->
      </properties>
      
    2. 在POM.xml的&lt;version&gt;中,放如下

      <version>${revision}</version>
      

    示例代码 sn-p(用于多模块项目):

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

    注意:如果您使用任何其他名称(例如&lt;my.version&gt;),而不是&lt;revision&gt;,您将面对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 multi module setup

    【讨论】:

      猜你喜欢
      • 2015-12-22
      • 2019-01-14
      • 2021-04-08
      • 2017-04-14
      • 2012-02-24
      • 2015-08-27
      • 2022-01-26
      • 2011-05-06
      • 2019-05-09
      相关资源
      最近更新 更多