【问题标题】:Updating versions in multi-module Maven project在多模块 Maven 项目中更新版本
【发布时间】:2013-04-04 02:39:25
【问题描述】:

我正在尝试发布我们的多模块 Maven 项目,但我不知道如何正确更新 POM 中的版本号。

maven 发布插件不会更新父 POM 依赖管理部分中的版本 - 这似乎是一个已知错误。

我尝试使用版本插件,但有两个问题:

  • 该插件仅更新我的* POM;可能是因为多模块项目 POM 不是模块的 POM 的 paremt POM
  • 更重要的是,我如何模仿发布插件的行为来自动计算从 POM 中的当前版本(例如 1.0.0-SNAPSHOT)设置的版本(例如 1.0.0)... perl 脚本?

非常感谢任何不涉及脚本,并且不需要我在dependencyManagement 之外声明依赖版本的建议!

这是 4 个 POM(模块子目录中的模块 POM):

============ pom-parent.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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.acme</groupId>
    <artifactId>dummy-parent</artifactId>
    <version>2.5</version>

    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.acme</groupId>
                <artifactId>module1</artifactId>
                <version>1.0.0-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

=============多模块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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.acme</groupId>
        <artifactId>dummy-parent</artifactId>
        <relativePath>pom-parent.xml</relativePath>
        <version>2.5</version>
    </parent>

    <groupId>com.acme</groupId>
    <artifactId>multi-module</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>
    <scm>
           <developerConnection>scm:svn:https://svnserver.fairisaac.com:8443/nowhere</developerConnection>
       </scm>
</project>

============== module1 POM: 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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.acme</groupId>
        <artifactId>dummy-parent</artifactId>
        <relativePath>../pom-parent.xml</relativePath>
        <version>2.5</version>
    </parent>

    <groupId>com.acme</groupId>
    <artifactId>module1</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <packaging>jar</packaging>
</project>

============= 模块 2 POM:module2/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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.acme</groupId>
        <artifactId>dummy-parent</artifactId>
        <relativePath>../pom-parent.xml</relativePath>
        <version>2.5</version>
    </parent>

    <groupId>com.acme</groupId>
    <artifactId>module2</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.acme</groupId>
            <artifactId>module1</artifactId>
        </dependency>
    </dependencies>
</project>

=========编辑===============

...如果我将dependencyManagement部分中的显式版本替换为

,它会变得更好
<version>${project.version}</version>

... maven 3.0.4 因 NPE 失败:

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.478s
[INFO] Finished at: Fri Apr 12 12:09:08 CEST 2013
[INFO] Final Memory: 9M/120M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.0:prepare (default-cli) on project multi-
module: Execution default-cli of goal org.apache.maven.plugins:maven-release-plugin:2.0:prepare failed. NullPointerExcep
tion -> [Help 1]

【问题讨论】:

  • 我遇到了同样的问题。几率是多少,尤其是在 3 小时内?
  • 一个相当明显的需求,由于某种原因,Maven 似乎没有解决......dependencyManagement 的问题似乎已经存在了 5 年多,已被标记为已修复,然后回归,我什至不确定目前的官方状态是什么。

标签: maven-3


【解决方案1】:

这不是错误,您显示的第一个 pom.xml 在您的多模块项目之外。 maven-release-plugin 会将其视为外部依赖,因此不会更改版本。

但是你的设计有一个缺陷,你必须移动

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.acme</groupId>
            <artifactId>module1</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</dependencyManagement>

到你的多模块 pom.

我假设您的想法是在一个地方声明模块版本并在所有模块之间共享。因此,模块版本进入多模块 pom 依赖管理。

通常像这样的外部 pom 用于放置公司信息、存储库路径之类的东西,并且它们被许多不同的项目共享。

【讨论】: