【问题标题】:Updating version numbers of modules in a multi-module Maven project where the aggregate root isn't a parent pom在聚合根不是父 pom 的多模块 Maven 项目中更新模块的版本号
【发布时间】:2017-06-21 17:06:01
【问题描述】:

我想为我的项目设置一个发布版本。我对所有模块使用聚合 pom。每个模块父级不是前面提到的聚合pom。

我的问题与Updating version numbers of modules in a multi-module Maven project 的问题不同,聚合的 pom 也是父 pom。

聚合的 pom.xml 是:

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>aggregate</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
    </modules>

</project>

module1 pom.xml 在哪里:

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>module-1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent1</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../../parent1/pom.xml</relativePath>
    </parent>

</project>

当我执行时:

mvn versions:set -DnewVersion=0.0.1

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] module-1
[INFO] aggregate
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building aggregate 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.3:set (default-cli) @ aggregate ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: C:\Users\maxim.kirilov\workspace\maven-games\aggregate
[INFO] Processing change of com.example:aggregate:0.0.1 -> 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] module-1 ........................................... SKIPPED
[INFO] aggregate .......................................... SUCCESS [  0.962 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

为什么会跳过 module-1?我阅读了一些建议分别为每个模块调用 maven set version 命令的文章,maven 是否支持更清洁的解决方案?

【问题讨论】:

    标签: java maven multi-module


    【解决方案1】:

    最近(23/09/2017)向版本 Maven 插件添加了一个文档。为了更新聚合项目下的所有项目,您需要添加补充命令行参数:

    mvn versions:set -DnewVersion=0.0.1 -DoldVersion=* -DgroupId=* -DartifactId=*
    

    这是必需的,否则版本过滤器(通过 -DoldVersion=)会过滤掉该模块,因为它的版本与其余模块不同。此外,您需要添加 -DgroupId= 和 -DartifactId=* 否则 module-1 也会根据 groupId 和 artifactId 的差异过滤掉。

    【讨论】:

      【解决方案2】:

      您可能需要在聚合 pom xml 中包含版本 Maven 插件。 http://www.mojohaus.org/versions-maven-plugin/ http://www.mojohaus.org/versions-maven-plugin/usage.html

      我会这样做:

       <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>versions-maven-plugin</artifactId>
            <version>2.3</version>
            <configuration>
           <autoVersionSubmodules>true</autoVersionSubmodules>
           </configuration>
          </plugin>
       </plugins>
      

      【讨论】:

      • 我在文档中没有找到像autoVersionSubmodules 这样的配置?这仅适用于maven-release-plugin,但不适用于versions-maven-plugin
      • 建议您在第二个链接上进一步阅读,类似 mvn -N versions:update-child-modules 的内容可能会对您有所帮助。到目前为止,您可以忽略 autoVersionSubmodule,但我已经使用了这两个插件:releasr 和带有上述代码的版本,它很酷
      • autoVersionSubmodule 不是可用版本-maven-plugin 中的配置项。它仅在 maven-release-plugin 中可用。从versions-maven-plugin 它将被忽略。
      • 是的..它是发布插件的一部分,如果你不想使用它,我已经写信到现在忽略它..但我给了你其他提示,即 mvn -N 版本更新-child-moduldes..你试过这个吗?
      • 不,它不是没用的,而是取决于用例。您需要了解整个 Maven 发布过程。