0

我现在正在构建一个 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项目结构呢?如何在子模块中使用不同的父版本?或者我必须把它分成两个完全不同的项目?

谢谢。

4

1 回答 1

0

您应该能够覆盖子模块 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 更短。您可以在 A 中显式添加对 D 2.0 的依赖项以强制使用 D 2.0

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

于 2015-07-21T08:13:13.580 回答