【问题标题】:In a Maven project, how can I automatically update the version all child modules, plus the parent?在 Maven 项目中,如何自动更新所有子模块以及父模块的版本?
【发布时间】:2011-01-21 11:08:48
【问题描述】:

我有一个多模块项目。

父 POM (1.0-SNAPSHOT) |-- 模块1 (1.0-SNAPSHOT) |-- 模块2 (1.0-SNAPSHOT) `--模块3(1.0-SNAPSHOT)

当我执行 mvn release:prepare 时,它​​会验证父 POM 是否具有 SNAPSHOT 版本,并且所有依赖模块都没有 SNAPSHOT 版本。如何自动将所有子模块从 SNAPSHOT 更新到下一个发布版本?

我想自动增加所有模块的版本。

【问题讨论】:

标签: maven-2 maven-release-plugin multi-module


【解决方案1】:

设置 poms 版本(包括多模块项目)的灵活方法是Versions Maven Plugin

mvn versions:set -DnewVersion=your_new_version

它将调整多模块项目中的所有pom版本、父版本和子版本。

然后

mvn versions:commit

mvn versions:revert

【讨论】:

  • commitrevert 作用于在set 期间创建的备份 pom 文件,这是 IMO 不必要的,因为我正在使用版本控制并且可以简单地恢复到 git 中的内容。通过将-DgenerateBackupPoms=false 添加到set 命令,之后就不需要commitset。我的 2 美分。
  • 这是一种试运行,让用户在有效执行之前检查结果。但是,是的,您也可以直接前进。但如果出现错误,恢复 git 提交可能比 set-commit 恕我直言更有趣。
  • 哦,它在某些情况下确实很方便,但是命名误导了我一段时间,我不得不在文档中查找它的确切作用,以确保确定。我想我会调用命令versions:deleteBackupPomsversions:revertToBackupPoms
【解决方案2】:

发布插件可以处理这个问题。你检查Updating POM Versions了吗?但... 我不明白。 将 POM 中的版本从 x-SNAPSHOT 更改为新版本将 POM 中的版本更改为新值 y-SNAPSHOT 应由 release:prepare 完成在Prepare a Release 中解释。使用这个目标时出了什么问题?

更新:autoVersionSubmodules 参数可能是您正在寻找的。来自Prepare a Release 示例:

多模块项目

系统将提示您输入版本 项目的每个模块的编号。 如果您希望每个模块都获得 与父 POM 相同的版本, 你可以设置选项 autoVersionSubmodulestrue。轮到你了 只会被询问一次 发布版本和下一个 开发版。

父 pom.xml 片段

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>x.y.z</version>
            <configuration>
                <goals>deploy</goals>
                <autoversionsubmodules>true</autoversionsubmodules>
            </configuration>
        </plugin>
    </plugins>
</build>

【讨论】:

  • 例如命令 mvn versions:set -DnewVersion=1.0 更新父 POM 和模块版本。但是我不想更新父版本...发布多模块项目的最佳实践是什么?
  • release:prepare 要求所有模块都有一个非 SNAPSHOT 版本因此我应该手动更改所有模块的版本。例如,该项目由第 15 个模块组成。因此,我找到了一种自动更新所有模块的方法。
  • @eugenn 不,您不必手动更改,release:prepare 目标会为您完成(再次检查链接)。
  • 谢谢帕斯卡,你是对的! release:prepare 效果很好。可能我的父 POM 存在一些配置问题。
  • 一个新的maven插件来解决这个问题:mojo.codehaus.org/flatten-maven-plugin/examples/…
【解决方案3】:
  1. 在其父 pom.xml 中定义所有子项目的版本。
  2. 确保所有子项目的版本与其父项目的版本相同。

    <groupId>com.xyz</groupId>
    <artifactId>module-1</artifactId>
    <packaging>jar</packaging>
    
    <parent>
      <groupId>com.xyz</groupId>
      <artifactId>xyz-parent</artifactId>
      <version>1.0.123-SNAPSHOT</version>
    </parent>
    

     

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
      <artifactId>xyz-parent</artifactId>
      <groupId>com.xyz</groupId>
      <version>1.0.123-SNAPSHOT</version>
      <packaging>pom</packaging>
      <name>xyz-parent</name>
    
      <dependencyManagement>
        <dependencies>
    
        <!-- Message -->
        <dependency>
          <groupId>com.xyz</groupId>
          <artifactId>module-1</artifactId>
          <version>${project.version}</version>
        </dependency>
    
        <dependency>
          <groupId>com.xyz</groupId>
          <artifactId>module-2</artifactId>
          <version>${project.version}</version>
        </dependency>
    
      </dependencyManagement>
    </project>
    
  3. 创建另一个 pom.xml 以将这些项目组合在一起。

    <modules>   
      <module>../xyz-parent</module>
      <module>../module-1</module>
      <module>../module-2</module>      
    </modules>
    
  4. 然后更新父项目的版本,然后通过下面的命令构建它。

    mvn versions:set -DnewVersion=1.0.1004-SNAPSHOT
    mvn clean install
    
  5. 然后将这些子项目中定义的父版本更新为最新版本

    mvn -N versions:update-child-modules
    
  6. 然后将它们一起构建。

    @echo on
    cd   .\xyz-parent
    call mvn versions:set -DnewVersion=1.0.1004-SNAPSHOT -o
    call mvn versions:commit -o
    call mvn clean install -o
    :::http://www.mojohaus.org/versions-maven-plugin/examples/update-child-modules.html
    cd ..\xyz-buildaggregate-ide
    call mvn -N versions:update-child-modules -o
    call mvn clean install -o
    

【讨论】:

  • @DoctorWho 是的,我已经在 3.6.0 上对其进行了测试,并且可以正常工作。它仍然是versions-maven-plugin,包括版本信息在内的更多信息可以在这里找到mojohaus.org/versions-maven-plugin/usage.html
【解决方案4】:

https://issues.apache.org/jira/browse/MNG-624?focusedCommentId=14415968&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14415968 可能有更好的选择

这是一个解决方法,因为您不能在没有列出明确版本的情况下引用子模块 pom 中的顶级 pom。 (这就是 MNG-624 的错误) 它解释了如何为版本提供一个位置(在顶级profiles.xml 文件中),并在所有pom.xml 文件中简单地拥有一个属性引用(即${currentVersion})

但是,在此方案版本中:prepare 可能不会为您更新profiles.xml。

【讨论】:

    猜你喜欢
    • 2017-01-19
    • 2011-08-09
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2017-06-21
    • 2018-02-13
    • 2014-03-28
    相关资源
    最近更新 更多