在一个Maven项目中,如何自动更新所有子模块和父模块的版本?

40
我有一个多模块项目。
父POM (1.0-SNAPSHOT) |-- 模块1 (1.0-SNAPSHOT) |-- 模块2 (1.0-SNAPSHOT) `-- 模块3 (1.0-SNAPSHOT)
当我执行 mvn release:prepare 时,它会验证父POM是否具有SNAPSHOT版本以及所有依赖模块是否没有SNAPSHOT版本。如何自动更新所有子模块从SNAPSHOT版本到下一个发布版本?
我希望能够自动递增所有模块的版本号。

使用一个“固定”的父版本,如此处所定义,可能也会对您有所帮助。 - James Selvakumar
4个回答

37

一个灵活的方式来设置POM文件版本,包括多模块项目,就是使用Versions Maven Plugin插件。

mvn versions:set -DnewVersion=your_new_version

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

然后

mvn versions:commit
或者
mvn versions:revert

10
commitrevert 操作针对 set 命令期间创建的备份 POM 文件,但在我使用版本控制并可以简单地还原到 git 中的内容时,我认为这是不必要的。通过在 set 命令中添加 -DgenerateBackupPoms=false,之后就不需要 commitset 了。这是我的想法。 - Adam
2
这是一种干运行,让用户在有效执行之前检查结果。但是,你也可以直接进行。但如果出现错误,撤销 git 提交可能比 set-commit 不那么有趣。 - aymens
哦,在某些情况下它肯定很方便,但是命名误导了我一段时间,我不得不查看文档以确切了解它的作用,只是为了确认。我认为我会将命令称为versions:deleteBackupPomsversions:revertToBackupPoms - Adam

31
释放插件可以处理这个问题。您是否查看了更新POM版本?但是......我不明白的是,将POM中的版本从x-SNAPSHOT更改为新版本将POM中的版本号提升到新值y-SNAPSHOT应该由release:prepare完成,如准备发布中所述。当使用此目标时出现了什么问题? 更新:autoVersionSubmodules参数可能是您要寻找的内容。从准备发布示例中可知:

多模块项目代码片段

您将被提示输入项目每个模块的版本号。如果您希望每个模块都获得与父POM相同的版本号,则可以将选项autoVersionSubmodules设置为true。现在,您只需要被问及一次关于发布版本和下一个开发版本。

父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和模块的版本。但是我不想更新父版本...发布多模块项目的最佳实践是什么? - eugenn
发布:准备要求所有模块都有非SNAPSHOT版本,因此我应该手动更改所有模块的版本。例如,该项目由15个模块组成。因此,我正在寻找一种自动更新所有模块的方法。 - eugenn
1
@eugenn 不,你不必手动更改,release:prepare目标会为您完成此操作(请再次检查链接)。 - Pascal Thivent
谢谢Pascal,你是对的!release:prepare很好用。可能我的父POM存在一些配置问题。 - eugenn
一个新的Maven插件出现来解决这个问题:http://mojo.codehaus.org/flatten-maven-plugin/examples/example-multiple-versions.html - Stephan
@eugenn 如果您不更改父级的版本,这将会导致问题。我自己也遇到过这种情况。当您发布新版本时,您需要更新依赖项,其中包括父级,否则您将破坏除最后一个版本之外的所有项目。请小心! - Gonzalo Aguilar Delgado

7
  1. Make the version of all sub-project be defined in its parent pom.xml.
  2. Make sure all sub-projects versions are the same to their parent's version.

    <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. Create another pom.xml to group those project together.

    <modules>   
      <module>../xyz-parent</module>
      <module>../module-1</module>
      <module>../module-2</module>      
    </modules>
    
  4. Then update the parent project's version and then build it by below command.

    mvn versions:set -DnewVersion=1.0.1004-SNAPSHOT
    mvn clean install
    
  5. Then update the parent's version which is defined in those sub-project to the latset one

    mvn -N versions:update-child-modules
    
  6. Then build them together.

    @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,更多信息,包括版本信息,可以在这里找到http://www.mojohaus.org/versions-maven-plugin/usage.html。 - mpoznyak

3

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

这是解决无法在子模块pom中引用顶级pom而不需要列出显式版本的一种方法(这就是bug MNG-624的问题所在)。它解释了如何在顶层profiles.xml文件中拥有单个版本位置,并在所有pom.xml文件中简单地引用属性(即${currentVersion})。

但是,在这个方案中,release:prepare可能不会为您更新profiles.xml。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接