在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元素时,都会出现一般警告。
发布于 2009-12-31 03:40:27
我很好奇将模块的版本绑定到父版本的真正问题是什么,如果有的话?或者,当任何表达式(无论是否为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版本,只需从子poms中删除 <version>
标签,它们将继承父模块的版本。您当前正在做的事情是不必要的。
发布于 2020-09-03 15:49:36
我可能会晚一点来讨论这个。对于这个WARNING
,我有一个简单的解决方案。
首先,如果您希望所有子模块都采用与父模块相同的版本,那么只需从子POM中删除<version>
标记,并且当您在子POM中包含<parent>
时,它就应该存在。
如果下级POM中没有<version>
,则会自动获取上级POM version
。
现在,如果您希望在父POM版本中使用property
,并且希望在所有子模块中都使用相同的and,您可以按照以下步骤操作。
在父或子POM的<version>
部分中使用属性没有限制。但是,如果您使用自己的xml标记来指定,或者使用自己的属性,那么就会出现WARNING
(尽管这只是一个警告,但一切都按预期运行)。
但是如果你想摆脱这个WARNING
,你可以按照以下步骤操作:
<properties>
,如下所示1.0.0
<version>
of POM.xml,如下所示${}修订版本
示例代码片段(适用于多模块项目):
<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
中,使用下面的
<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
https://stackoverflow.com/questions/1981151
复制相似问题