首页 > 解决方案 > 如何使用模块化 Maven 项目管理版本号?

问题描述

我有一个相当典型的插件架构,看起来像这样(只是更大):

project
    core
    data
    main
    ui

父项目定义了版本号,打包为 apom并在其中定义了模块pom.xml

<groupId>group</groupId>
<artifactId>project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

...

<modules>
    <module>core</module>
    <module>data</module>
    <module>main</module>
    <module>ui</module>
</modules>

所有的子模块到处都有很多对父版本号的引用。以下是主模块外观的示例,可让您了解一下:

<parent>
    <groupId>group</groupId>
    <artifactId>project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<groupId>group</groupId>
<artifactId>project.main</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<properties>
    <java.version>11</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>group</groupId>
        <artifactId>group.core</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>group</groupId>
        <artifactId>group.data</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>group</groupId>
        <artifactId>group.ui</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

我们已经厌倦了不得不在每个父块、每个工件块以及每个模块的每个依赖块中的每个版本中一遍又一遍地更改版本号。在某些情况下,有人使用搜索/替换来命中其他文件并搞砸了构建。我们尝试使用属性,但由于某些荒谬的原因,这在父定义中不起作用。

父级中定义的版本号是我们唯一关心的地方。我们甚至不需要子模块来拥有版本(或工件,就此而言)。我们可以在其他 Ant 项目中做到这一点。我们可以在其他 Gradle 项目中做到这一点。我无法想象这在 Maven 中是不可能的,所以我猜我们错过了一些东西。

我们如何在一个地方定义项目的版本号,并将其用于我们模块中的所有父级、工件和依赖项部分?

标签: javamavenmaven-3build-systemmaven-module

解决方案


版本 maven 插件提供了一次性更改子项目版本的可能性。包含插件后:

mvn versions:set -DnewVersion=<your version>

如果一切正确:

mvn versions:commit

推荐阅读