如何从子模块覆盖父模块中的父版本号

时间:2015-07-18 04:45:20

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

我现在正在构建一个弹簧应用程序,它包含多个弹簧项目作为微服务。我想将所有这些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项目结构?如何在子模块中使用不同的父版本?或者我必须把它分成两个不同的项目?

感谢。

1 个答案:

答案 0 :(得分:0)

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

  

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

     

“最接近的定义”表示使用的版本最接近   一个在依赖树中的项目,例如。如果依赖   A,B和C的定义为A - > B - &gt; C - &gt; D 2.0和A - &gt; E - &gt; d   1.0,然后在构建A时将使用D 1.0,因为从A到D到E的路径更短。您可以向D明确添加依赖项   2.0 in A强制使用D 2.0

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