【问题标题】:Maven multi-module project version management [duplicate]Maven多模块项目版本管理[重复]
【发布时间】:2013-06-26 06:08:07
【问题描述】:

指定多模块 Maven 项目版本的最佳做法是什么?

我希望在所有模块中都有一个版本字符串。即使我在根父 pom 中只能有一个版本定义,我也需要在每个 pom 中指定父 pom 版本。这意味着,如果我需要更改版本,我需要更改所有 pom。实际上违背了目的。有什么想法吗??

【问题讨论】:

  • 据我了解,这应该在 11 月出现在 Maven 3.1 中,但显然没有成功。我同意这会很好,但现在看来我们必须在每个 Pom 中都有它。
  • 一个新插件解决了这个问题:mojo.codehaus.org/flatten-maven-plugin/examples/…
  • 不确定为什么这被标记为重复 - 因为在指出的问题中,所有答案都表明必须在子 POM 的 <parent> 部分中指定父版本...而 OP明确指出“我希望所有模块都有一个版本字符串”!

标签: java maven


【解决方案1】:

你试过versions-maven plugin吗?

使用 mvn versions:set -DnewVersion="1.1-SNAPSHOT",您可以在所有底层 maven 项目中设置给定版本。

之后您必须执行 mvn versions:commit 来删除临时文件并提交到您的 VCS

【讨论】:

  • 谢谢。是的,这对我有用。唯一的缺点是,即使是次要版本更改,我也需要将所有 pom 提交到源代码管理。
  • 提交是将更改保存到 pom 文件的正确方法,该文件是项目的一部分,当然还有历史记录,目的是使用版本控制工具。
【解决方案2】:

更好的方法是在父 pom.xml 中定义您的版本,如下所示。

<groupId>com.my.code</groupId>
<artifactId>my_pro</artifactId>
<version>${YOUR_VERSION}</version>

<properties>
    <JDK_VERSION>1.7</JDK_VERSION>        
    <YOUR_VERSION>1.0-SNAPSHOT</YOUR_VERSION>// here you define your version
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <org.springframework.version>3.1.2.RELEASE</org.springframework.version>
</properties>

那你不想在所有子pom.xml中一一更改你的版本号。

子 pom.xml 可以添加如下依赖

<version>${YOUR_VERSION}</version>

【讨论】:

  • 从 maven 3 开始不推荐使用这种方式
  • @Ilya 那么替代方案是什么?当您更改版本号时,不得不更改所有子 pom 真是太可惜了!
  • 你可以使用 ${project.version} 代替
  • @Ilya 你能提供这个来源吗?我同意,但除了控制台中的警告外在任何地方都找不到。
  • 这在构建整个项目时有效,但在构建或恢复 (-rf :) 一个模块(比如b)时失败,如果它依赖于另一个模块(比如a) - 出现“无法解析 a 的父 POM 版本”的错误;有任何想法吗?使用 Maven 3.6.1
【解决方案3】:

另一种“最佳”方式是在多模块 pom 旁边创建一个父 pom,这将提供一个依赖管理,其中包含多模块项目引用及其自身的父 pom 版本。 如果多模块项目需要另一个多模块项目作为依赖项,这将是最适合您的。 父 pom 必须是多模块 pom 的一部分:

<modules>
    <module>my.parent.Pom</module>
    <module>my.first.project</module>
    <module>my.second.project</module>
    <module>my.third.project</module>
</modules>

并且父 pom 应该包含你的多模块项目的依赖管理

<version>VersionNumber</version>
<packaging>pom</packaging>
...
...
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>my.first.project</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>my.second.project</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>my.third.project</artifactId>
            <version>${project.version}</version>
        </dependency>

您的所有多模块项目都不会定义 groupId 和版本号,因为它们将从父 pom 获取这些信息,此外,如果项目“第三”需要依赖项 my.first.project,那么项目中的依赖项“第三" pom 文件将是:

<dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>my.first.project</artifactId>
        </dependency>

这是我们处理多模块项目和版本管理的方式。

【讨论】:

  • 有趣!不过,我想知道如何在不指定其版本的情况下指定父 pom(在其中一个子 pom 中需要?)。
  • @anoopelias 是的,这也让我很恼火,根本无法解决您的问题——我的问题也是如此。因为你最终会遇到同样的问题。你是怎么解决的?