更新多模块Maven项目中的模块版本号

san*_*uru 302 maven

我有一个多模块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>
Run Code Online (Sandbox Code Playgroud)

主要父模块具有以下配置

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 578

使用versions:set版本-maven插件:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

它将调整多模块项目中的所有pom版本,父版本和依赖版本.

如果你弄错了,那就去做吧

mvn versions:revert
Run Code Online (Sandbox Code Playgroud)

之后,或

mvn versions:commit
Run Code Online (Sandbox Code Playgroud)

如果你对结果感到满意.


注意:此解决方案假定所有模块也使用聚合pom作为父pom,这个场景在此答案时被视为标准.如果情况并非如此,那就去找Garret Wilson的答案吧.

  • 除了`versions:set`之外,还可以指定`-DgenerateBackupPoms = false`,因为默认情况下这个插件会备份原始的pom文件. (49认同)
  • 这就是`versions:commit`的意思:"删除pom的初始备份,从而接受更改." (17认同)
  • 如果有一个解决方案不需要你实际更改每个模块,那就太棒了.我能想到的唯一选择是始终为父pom使用快照版本. (5认同)
  • 新插件以不同方式解决了此问题中描述的问题:http://mojo.codehaus.org/flatten-maven-plugin/examples/example-multiple-versions.html (2认同)

Gar*_*son 44

给定的答案假设有问题的项目除了模块聚合之外还使用项目继承.事实上,这些是不同的概念:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

某些项目可能是模块的聚合,但聚合器POM和聚合模块之间没有父子关系.(可能根本没有父子关系,或者子模块可能使用单独的POM作为"父".)在这些情况下,给定的答案将不起作用.

经过大量的阅读和实验,结果证明有一种方法可以使用Versions Maven插件不仅更新聚合器POM,还可以更新所有聚合模块; 这是processAllModules选择.必须在聚合器项目的目录中执行以下命令:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules
Run Code Online (Sandbox Code Playgroud)

版本Maven插件不仅会更新所有包含模块的版本,还会更新模块间的依赖关系!!!! 这是一个巨大的胜利,将节省大量时间,并防止各种问题.

当然不要忘记在所有模块中提交更改,您也可以使用相同的开关:

mvn versions:commit -DprocessAllModules
Run Code Online (Sandbox Code Playgroud)

您可以决定完全免除备份POMS并在一个命令中执行所有操作:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
Run Code Online (Sandbox Code Playgroud)

  • 对于聚合器项目,聚合器的版本和子模块的版本*不必*相同。(例如,您的聚合器 pom 可能很少更改并且可以保持在特定版本,而各个子模块可以有自己的发布周期)。指定给 `versions:set` 插件的关键属性是 `-DoldVersion='*'`,在 https://www.mojohaus.org/versions-maven-plugin/set-mojo.html 上它明确说明了这个属性处理聚合器项目时应指定。 (3认同)
  • 找到秘密的 make-it-work 开关:父 pom 和模块的起始版本必须相同!我的父 pom 以“1-SNAPSHOT”开头,模块有“1.0.0-SNAPSHOT”。:) (2认同)
  • `-DprocessAllModules` 在什么条件下实际工作?它对我不起作用。 (2认同)
  • @Garret,即使您假设聚合器 pom 和子模块 pom 版本也必须相同! (2认同)

Nis*_*ant 22

您可能需要查看Maven发布插件的发布:更新版本目标.它将更新父版本以及其下的所有模块.


更新:请注意以上是发布插件.如果您没有发布,您可能想要使用versions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)


Cru*_*mmy 15

如果要完全自动化该过程(即您希望增加版本号而不必知道当前版本号是什么),则可以执行以下操作:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,@Crummy,您保存了我的一天 (2认同)
  • https://www.mojohaus.org/build-helper-maven-plugin/parse-version-mojo.html (2认同)
  • 酷,谢谢!SNAPSHOT 示例: `mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT versions:commit` (2认同)

khm*_*ise 11

我鼓励您阅读有关多模块(reactor)构建的Maven Book.

我特别指的是以下内容:

<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>
Run Code Online (Sandbox Code Playgroud)

应改成.这里只关注它定义的父部分中未定义的版本.

<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>
Run Code Online (Sandbox Code Playgroud)

是一个更好的链接.

  • 并具体寻找什么? (10认同)
  • 遗憾的是,从父级继承版本信息并不能消除在项目中修改**所有pom文件**的负担 - 因为它们都通过*version*编号引用父级. (7认同)
  • +1用于为`pom.xml`文件提供正确的格式,但我同意(与@ThorbjørnRavnAndersen一起)阅读整本书以获取此信息是过度的.:p (2认同)

Tho*_*ler 7

上面给出的解决方案对我们也有效了很长时间:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

然而它昨天停止工作了,我们发现它是由于versions-maven-plugin 中最近的错误

我们的(临时)解决方法是更改​​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>
+        
Run Code Online (Sandbox Code Playgroud)


Jon*_*ott 5

versions:update-child-modules听起来像您要找的东西。您可以按照上面提到的方法进行versions:set,但这是更新父版本号的轻量级方法。对于子模块,我认为您应该删除<version>定义,因为它们将继承父模块的版本号。


小智 5

要更新子模块上的主 pom.xml 和父版本:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
Run Code Online (Sandbox Code Playgroud)