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