【问题标题】:How can I overwrite parent version number in parent module from sub module如何从子模块覆盖父模块中的父版本号
【发布时间】:2015-10-07 21:17:47
【问题描述】:

我现在正在构建一个 Spring 应用程序,其中包含多个作为微服务的 Spring 项目。我想将所有这些spring项目放入一个父模块中,然后将其转换为一个多模块的maven项目。但是我遇到了一个问题,因为每个子模块都需要有一个对 spring-cloud-starter-parent 的父引用,所以很自然地,我将它移到了父模块中。但是现在问题发生了,每个子模块都使用不同版本的 spring-cloud-starter-parent。下面一起来看看吧。

父模块的部分POM:

<groupId>com.demo</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <version>2.0</version>
    <packaging>pom</packaging>

    <name>Spring Cloud Demo</name>

    <parent>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-parent</artifactId>
        <version>Angel.SR3</version>
    </parent>

而在子模块中,POM的一部分是:

<parent>
        <groupId>com.demo</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>2.0</version>
        <relativePath>../pom.xml</relativePath>
      </parent>

虽然这是可行的,因为 spring-cloud-starter-parent 已经在父模块中引入,所以它可以在子模块中使用。但是我突然遇到一个问题,有些子子模块需要有不同的spring-cloud-starter-parent版本,比如1.0.0-SNAPBUILD。

在这种情况下,我如何仍然使用多模块maven项目结构?如何在子模块中使用不同的父版本?或者我必须把它分成两个完全不同的项目?

谢谢。

【问题讨论】:

    标签: maven-3 pom.xml spring-cloud multi-module parent-pom


    【解决方案1】:

    您应该能够覆盖子模块 pom 中的父依赖项以指向您需要的特定依赖项。

    依赖中介——这决定了当遇到工件的多个版本时将使用哪个版本的依赖。目前,Maven 2.0 仅支持使用“最近定义”,这意味着它将使用依赖树中与您的项目最接近的依赖版本。您始终可以通过在项目的 POM 中明确声明来保证版本。请注意,如果两个依赖版本在依赖树中的深度相同,则在 Maven 2.0.8 之前没有定义哪个会获胜,但从 Maven 2.0.9 开始,声明中的顺序很重要:第一个声明获胜。

    “最接近的定义”表示使用的版本将是最接近的 一个到您的项目在依赖关系树中,例如。如果依赖 对于 A、B 和 C,定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,那么在构建 A 时将使用 D 1.0,因为从 A 到 D 通过 E 的路径更短。您可以显式地将依赖项添加到 D A 2.0 强制使用 D 2.0

    http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 2013-05-06
      • 1970-01-01
      • 2016-10-31
      • 2015-07-04
      • 1970-01-01
      • 2020-06-16
      • 2020-12-06
      • 2020-06-02
      相关资源
      最近更新 更多