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

zfciruhq  于 2022-09-20  发布在  Maven
关注(0)|答案(12)|浏览(346)

我有一个多模块的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>
rks48beu

rks48beu1#

使用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

62lalag4

62lalag42#

给定的答案假设所讨论的项目除了模块聚合之外还使用项目继承。事实上,这些都是截然不同的概念:

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

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

经过大量阅读和实验,发现有一种方法可以使用Versions Maven Plugin不仅更新聚合器POM,还可以更新所有聚合模块;这就是processAllModules选项。以下命令必须在Aggregator项目的目录中执行:

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
c0vxltue

c0vxltue3#

如果您想要完全自动化该过程(即,您想要递增版本号,而不必知道当前的版本号是什么),您可以这样做:

mvn build-helper:parse-version versions:set -DnewVersion=${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion} versions:commit
0kjbasz6

0kjbasz64#

你可能想看看Maven发布插件的release:update-versions目标。它将更新父模块的版本以及其下的所有模块。

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

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
wnvonmuf

wnvonmuf5#

我建议您阅读Maven Book about multi-module(React堆)的构建。

我指的是以下几点:

<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>

is a better link

0sgqnhkj

0sgqnhkj6#

最好的方法是,因为您打算将模块捆绑在一起,所以可以在<project>标记下面的最外层的pom.xml(父模块)中指定<dependencyManagement>标记。它控制版本和组名。在您的单个模块中,您只需要在pom.xml中指定<artifactId>标记。它将从父文件中获取版本。

j9per5c4

j9per5c47#

versions:update-child-modules听起来就是你要找的。您可以按照前面提到的那样设置版本,但这是更新父版本号的一种轻量级方式。对于子模块,我认为应该删除<version>定义,因为它们将继承父模块的版本号。

amrnrhlw

amrnrhlw8#

上面给出的解决方案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>
+
q35jwt9p

q35jwt9p9#

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

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
gdx19jrr

gdx19jrr10#

最简单的方法是将每个pom.xml中的版本更改为任意版本。然后检查依赖项管理以使用此模块中使用的正确模块版本!例如,如果您想要增加两个模块项目的版本化,您必须像Flow一样:

在Childe模块中:

<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>
wqlqzqxt

wqlqzqxt11#

我在找这个:

<properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>
lymnna71

lymnna7112#

提示:
例如,如果您的多模块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

相关问题