我有大量的Maven(第谷)项目,大约有400个插件。
我们在每个POM文件中指定了应用程序版本。
有没有办法如何在一个地方指定所有POM的版本?
我希望有人会这样想:
<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>
....
<version>${buildVersion}</version>
我们有父pom.xml
:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>pom</packaging>
然后在每个POM中引用父POM:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>1.1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
答案 0 :(得分:29)
如果您有父项目,您可以在父pom和子项中设置版本,您可以使用 $ {project.version} 或 $ {version}引用同级库。 属性。
如果您想避免在每个孩子中重复父母的版本:您可以这样做:
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>
<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>
然后在你的孩子们身上,你必须这样做:
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${my.version}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<packaging>eclipse-plugin</packaging>
<dependencies>
<dependency>
<groupId>company</groupId>
<artifactId>otherartifact</artifactId>
<version>${my.version}</version>
or
<version>${project.version}</version>
</dependency>
</dependencies>
HTH
答案 1 :(得分:13)
使用版本的属性会生成以下警告:
[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[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]
如果您的问题是由于您正在切换版本而必须在多个地方更改版本,那么正确的做法是使用Maven Release Plugin来自动执行此操作。
答案 2 :(得分:6)
使用3.5或更高版本的Maven版本,您应该能够在父节中使用占位符(例如$ {revision}),并且在pom的其余部分内,您可以使用${project.version}
。
实际上,您也可以省略parent
之外的项目属性,这些属性是相同的,因为它们将被继承。结果看起来像这样:
<project>
<parent>
<artifactId>build.parent</artifactId>
<groupId>company</groupId>
<relativePath>../build.parent/pom.xml</relativePath>
<version>${revision}</version> <!-- use placeholder -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>artifact</artifactId>
<!-- no 'version', no 'groupId'; inherited from parent -->
<packaging>eclipse-plugin</packaging>
...
</project>
有关详细信息,尤其是有关如何在发布期间解析占位符的信息,请参阅Maven CI Friendly Versions | Multi Module Setup。
答案 3 :(得分:3)
正确答案是这个(示例版本):
在父pom.xml中,您应该({strong>不在properties
内):
<version>0.0.1-SNAPSHOT</version>
在所有子模块中,您应该:
<parent>
<groupId>com.vvirlan</groupId>
<artifactId>grafiti</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
所以它是硬编码的。
现在,要更新版本,请执行以下操作:
mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
并且所有400个模块都将更新父版本。
答案 4 :(得分:2)
如果您正在使用Maven 3,解决此问题的一个选项是使用版本插件 http://www.mojohaus.org/versions-maven-plugin/
特别是命令,
mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit
这会将父母和子女poms更新为2.0-RELEASE。您可以在此之前将其作为构建步骤运行。
与发布插件不同,它不会尝试与源代码控制进行对话
答案 5 :(得分:0)
请参见 Maven-用户论坛'version' contains an expression but should be a constant. Better way to add a new version?:
这就是为什么这是一个糟糕的计划。
要部署的pom不会解析属性值,因此 任何依赖于该pom的人都将把依赖项作为未用$ {}插值的字符串,并且会在您中引起很多欢呼声 构建过程。
在Maven 2.1.0和/或2.2.0中,尝试使用以下命令部署pom 解析的属性...这超出了预期,这就是为什么这些 不建议使用两个版本,建议的2.x版本是2.2.1。
答案 6 :(得分:0)
pom.xml的版本应该有效
<groupId>com.amazonaws.lambda</groupId>
<artifactId>lambda</artifactId>
<version>2.2.4 SNAPSHOT</version>
<packaging>jar</packaging>
此版本不应类似于2.2.4。等等
答案 7 :(得分:-1)
我有两个建议给你
-Drevision=2.0.1
文件中添加.mvn/maven.config
。因此,基本上,您只能在一个位置定义版本。