首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Maven3中使用project.parent.version作为模块版本的警告

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

Stack Overflow用户
提问于 2009-12-31 00:48:01
回答 2查看 103.1K关注 0票数 81

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

代码语言:javascript
运行
复制
  <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以来,我收到了以下警告。

代码语言:javascript
运行
复制
[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元素时,都会出现一般警告。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-31 03:40:27

我很好奇将模块的版本绑定到父版本的真正问题是什么,如果有的话?或者,当任何表达式(无论是否为project.parent.version )用于version元素时,都会出现一般警告。

嗯,这很容易测试。因为我很好奇,所以我用下面的pom帮你做了:

代码语言:javascript
运行
复制
<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确实在抱怨:

代码语言:javascript
运行
复制
[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版本,只需从子poms中删除 <version> 标签,它们将继承父模块的版本。您当前正在做的事情是不必要的。

票数 93
EN

Stack Overflow用户

发布于 2020-09-03 15:49:36

我可能会晚一点来讨论这个。对于这个WARNING,我有一个简单的解决方案。

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

如果下级POM中没有<version>,则会自动获取上级POM version

现在,如果您希望在父POM版本中使用property,并且希望在所有子模块中都使用相同的and,您可以按照以下步骤操作。

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

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

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

1.0.0

  1. In <version> of POM.xml,如下所示

${}修订版本

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

代码语言:javascript
运行
复制
<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>

注意:如果您使用任何其他名称(例如,<my.version>)而不是<revision>,您将面对该WARNING

现在,如果你想在mvn deploy中传递版本,你可以使用mvn deploy "-Drevision=1.0.0-SNAPSHOT",对于mvn install也可以使用类似的方法。

现在,如果上面的配置,你想要使用作为父POM,并且你想要在所有子模块中使用相同的version,这也可以完成。在每个child module POM中,使用下面的

代码语言:javascript
运行
复制
<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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1981151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档