首页 文章

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

提问于
浏览
253

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

7 回答

  • 2

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

  • 4

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

    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
    

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

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

    mvn versions:commit -DprocessAllModules
    

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

    mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
    
  • 6

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


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

    mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
    
  • 11

    我鼓励你阅读Maven Book about multi-module(reactor)版本 .

    我特别指的是以下内容:

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

  • 21

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

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

    versions:update-child-modules 听起来像你认为你应该删除 <version> 定义,因为它们将继承父模块的版本号 .

  • 27

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

相关问题