ChatGPT解决这个技术问题 Extra ChatGPT

在多模块 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>

并且主父模块具有以下配置

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
您的问题是错误的,并使拥有真正多模块(“聚合”)POM 的人感到困惑。从您的示例和答案看来,您实际上是在谈论父 POM,而不是多模块聚合 POM。请参阅maven.apache.org/pom.html#Aggregation

S
Sean Patrick Floyd

使用 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 使用快照版本。
除了 versions:set 之外,还可以指定 -DgenerateBackupPoms=false,因为默认情况下,此插件会备份原始 pom 文件。
这就是 versions:commit 的重点:“删除 pom 的初始备份,从而接受更改。”
一个新插件以不同的方式解决了这个问题中描述的问题:mojo.codehaus.org/flatten-maven-plugin/examples/…
@MichaelLaffargue mvn 版本:commit 似乎删除了之前 pom.xml 生成的备份文件
G
Garret Wilson

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

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

有些项目可能是模块的聚合,但聚合器 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

我们如何像 build-helper 插件一样自动化下一个版本?
使用 Maven 3.5.0 我无法让它工作。我有项目聚合,只有父 pom 得到了更新。我还尝试了项目继承(连同聚合 - 来自提供的链接的“所有三个规则”),再次只有父 pom 得到更新。
找到了让它工作的秘密开关:父 pom 和模块的起始版本必须相同!我的父 pom 以“1-SNAPSHOT”开头,模块有“1.0.0-SNAPSHOT”。 :)
对于聚合器项目,聚合器的版本和子模块的版本不必相同。 (例如,您的聚合器 pom 可能很少更改并且可以保持在特定版本,而各个子模块可以有自己的发布周期)。指定给 versions:set 插件的关键属性是 -DoldVersion='*',在 mojohaus.org/versions-maven-plugin/set-mojo.html 上它明确表示在处理聚合器项目时应指定此属性。
-DprocessAllModules 在什么条件下实际起作用?它对我不起作用。
M
Malcolm Crum

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

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

谢谢,@Crummy,你拯救了我的一天
或者您可以使用 -DoldVersion='*'
酷,谢谢!!快照示例:mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion}-SNAPSHOT versions:commit
N
Nishant

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

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

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

mvn version:set 不影响模块。
好的,当反应堆构建在同一时间父级时。当结构看起来不一样时,它会令人困惑......
mvn release:update-versions -DautoVersionSubmodules 对我来说很好,即使我没有发布 :-)
k
khmarbaise

我鼓励您阅读 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>

这个is a better link


并具体寻找什么?
+1 用于为 pom.xml 文件提供正确的格式,但我同意(与@ThorbjørnRavnAndersen 一起)阅读整本书以获取此信息是多余的。 :p
不幸的是,从父级继承版本信息并不能消除必须修改项目中所有 pom 文件的负担——因为它们都通过版本号引用父级。
您可以使用处理所有这些东西的versions-maven-plugin,或者您可以使用maven-release-plugin,因此您不需要手动处理...
我仍然感到困惑的是,人们仍然只是将链接放在这里,而不考虑链接是否会过期。这使得这个答案基本上没有用。
Y
Yu Jiaao

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


我在 pom.xml 上找不到标签 dependencyManagement。你在考虑something else吗?
B
Buhake Sindi

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


让子模块继承父版本是一个好方法吗?如果只有子模块发生变化怎么办?
这假定根模块是父模块,但不一定如此。
T
Thomas Mueller

上面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>
+        

P
Paul Roub

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

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

M
Mojtaba Mirakbari

最简单的方法是将每个 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>

这只是太多的工作
p
parsecer

我一直在寻找这个:

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

a
ahmednabil88

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