我有一个多模块 Maven 项目。我们打算一起对所有这些模块进行版本控制。但截至目前,我将在每个模块 pom.xml 中完成硬编码版本,如下所示
<parent>
<artifactId>xyz-application</artifactId>
<groupId>com.xyz</groupId>
<version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>
并且主父模块具有以下配置
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
使用 versions-maven plugin 中的 versions:set
:
mvn versions:set -DnewVersion=2.50.1-SNAPSHOT
它将调整多模块项目中的所有 pom 版本、父版本和依赖版本。
如果您犯了错误,请执行
mvn versions:revert
之后,或
mvn versions:commit
如果您对结果感到满意。
注意:此解决方案假定所有模块也使用聚合 pom 作为父 pom,在此答案时被认为是标准的场景。如果不是这种情况,请选择 Garret Wilson's answer。
给出的答案假设有问题的项目除了模块聚合之外还使用项目继承。事实上,这些是不同的概念:
有些项目可能是模块的聚合,但聚合器 POM 和聚合模块之间没有父子关系。 (可能根本没有父子关系,或者子模块可能完全使用单独的 POM 作为“父”。)在这些情况下,给定的答案将不起作用。
经过大量阅读和实验,事实证明有一种方法可以使用 Versions Maven Plugin 来更新聚合器 POM 以及所有聚合模块;它是 processAllModules
选项。必须在聚合器项目的目录中执行以下命令:
mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules
Versions Maven 插件不仅会更新所有包含模块的版本,还会更新模块间的依赖关系!!!这是一个巨大的胜利,将节省大量时间并防止各种问题。
当然不要忘记提交所有模块中的更改,您也可以使用相同的开关:
mvn versions:commit -DprocessAllModules
您可能决定完全放弃备份 POMS,并在一个命令中完成所有操作:
mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
versions:set
插件的关键属性是 -DoldVersion='*'
,在 mojohaus.org/versions-maven-plugin/set-mojo.html 上它明确表示在处理聚合器项目时应指定此属性。
-DprocessAllModules
在什么条件下实际起作用?它对我不起作用。
如果您想完全自动化该过程(即您想增加版本号而不必知道当前版本号是什么),您可以这样做:
mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
-DoldVersion='*'
mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT versions:commit
您可能想要查看 Maven 发布插件的 release:update-versions 目标。它将更新父版本及其下的所有模块。
更新:请注意,以上是发布插件。如果您不发布,您可能需要使用 versions:set
mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
mvn release:update-versions -DautoVersionSubmodules
对我来说很好,即使我没有发布 :-)
我鼓励您阅读 Maven Book about multi-module(反应器)构建。
我特别指的是以下内容:
<parent>
<artifactId>xyz-application</artifactId>
<groupId>com.xyz</groupId>
<version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>
应该改成。此处仅在定义的父部分中注意未定义的版本。
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>xyz-application</artifactId>
<groupId>com.xyz</groupId>
<version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
pom.xml
文件提供正确的格式,但我同意(与@ThorbjørnRavnAndersen 一起)阅读整本书以获取此信息是多余的。 :p
最好的方法是,由于您打算将模块捆绑在一起,您可以在 <project>
标记下的最外层 pom.xml
(父模块)中指定 <dependencyManagement>
标记。它控制版本和组名。在您的单个模块中,您只需在 pom.xml
中指定 <artifactId>
标记。它将从父文件中获取版本。
versions:update-child-modules
听起来像您要找的东西。您可以执行versions:set,但这是一种更新父版本号的轻量级方法。对于子模块,我认为您应该删除 <version>
定义,因为它们将继承父模块的版本号。
上面worked for us给出的解决方案也是很久了:
mvn versions:set -DnewVersion=2.50.1-SNAPSHOT
但是它昨天停止工作,我们发现它是由于a recent bug in a the versions-maven-plugin
我们的(临时)workaround was to change the parent/pom.xml 文件如下:
--- jackrabbit/oak/trunk/oak-parent/pom.xml 2020/08/13 13:43:11 1880829
+++ jackrabbit/oak/trunk/oak-parent/pom.xml 2020/08/13 15:17:59 1880830
@@ -329,6 +329,13 @@
<artifactId>spotbugs-maven-plugin</artifactId>
<version>3.1.11</version>
</plugin>
+
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>versions-maven-plugin</artifactId>
+ <version>2.7</version>
+ </plugin>
+
要更新子模块上的主 pom.xml 和父版本:
mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
最简单的方法是将每个 pom.xml 中的版本更改为任意版本。然后检查依赖管理以使用此模块中使用的模块的正确版本!例如,如果您想为拖曳模块项目增加版本控制,您必须像流动一样:
在子模块中:
<parent>
<artifactId>A-application</artifactId>
<groupId>com.A</groupId>
<version>new-version</version>
</parent>
在父模块中:
<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>
我一直在寻找这个:
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
提示:如果您的多模块 maven 项目使用项目版本作为主 POM 文件中的属性,例如
<properties>
<revision>1.0.0</revision> <!-- project version/revision -->
...
</properties>
在这种情况下,您可以使用 set-property
而不是 set
来提升您的项目版本:
例子:
mvn versions:set-property -Dproperty=revision -DnewVersion="2.0.0"
mvn versions:commit
versions:set
之外,还可以指定-DgenerateBackupPoms=false
,因为默认情况下,此插件会备份原始 pom 文件。versions:commit
的重点:“删除 pom 的初始备份,从而接受更改。”