下面显示了我的父母的层次结构。
您可以看到,我们有一个公司的家长-pom的春季启动项目。这个POM具有作为父级的spring启动程序,并导入了我们自己的依赖管理BOM。
[INFO] --- hierarchy-maven-plugin:1.4:tree (default-cli) @ user-service ---
[INFO] PARENT com.MY_COMPANY.platform:user:3.20.14-SNAPSHOT
[INFO] PARENT com.MY_COMPANY.platform:spring-boot-parent:3.20.12-SNAPSHOT
[INFO] PARENT org.springframework.boot:spring-boot-starter-parent:1.5.12.RELEASE
[INFO] PARENT org.springframework.boot:spring-boot-dependencies:1.5.12.RELEASE <<<< This pom defines assertJ 2.x
[INFO] [ other imports ]
[INFO] IMPORT com.MY_COMPANY:dependencyManagementBase:2.23.14-SNAPSHOT <<<<<<<<<<<< This pom defines assertJ 3.x
[INFO] IMPORT com.MY_COMPANY.platform:platform-dependency-management:1.20.7
[INFO] ------------------------------------------------------------------------为了关注特定的问题,我们在依赖项管理中定义了assertJ 3;然而,spring引导依赖项定义了AssertJ 2,AssertJ不是什么大问题,但是还有其他的鱼,比如Mongo驱动程序,它们没有选择我们的版本。
Maven在这里是如何选择优先级的?为什么我们的依赖管理不能赢得一个远祖的依赖管理?
我还注意到,如果我将AssertJ添加为_COMPANY.Platform:spring parent的依赖项,那么它也不会在我们的依赖关系管理中使用该版本(所以我现在只保留它,这样显微镜下的层次结构就更短了)。
编辑-添加缩写POMs
com.MY_COMPANY.platform:spring-boot-parent
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.MYCOMPANY.platform</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>3.20.12-SNAPSHOT</version>
<packaging>pom</packaging>
<prerequisites>
<maven>3.0.4</maven>
</prerequisites>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
</parent>
<properties>
<MYCOMPANYdependencymanagement.version>2.23.13</MYCOMPANYdependencymanagement.version>
</properties>
<dependencies>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.MYCOMPANY</groupId>
<artifactId>dependencyManagementBase</artifactId>
<version>${MYCOMPANYdependencymanagement.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>com.MY_COMPANY:dependencyManagementBase
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.MYCOMPANY</groupId>
<artifactId>dependencyManagementBase</artifactId>
<version>2.23.13</version>
<packaging>pom</packaging>
<modules>
<module>spring-dep-man</module>
</modules>
<properties>
<org.assertj-core.version>3.5.2</org.assertj-core.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${org.assertj-core.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>**编辑2-添加显示不同版本的详细层次结构**
~/p/springbootparentpom> mvn hierarchy:tree -Dlevel=full
[INFO] --- hierarchy-maven-plugin:1.4:tree (default-cli) @ spring-boot-parent ---
[INFO] Displaying hierarchy.
[INFO] PARENT org.springframework.boot:spring-boot-starter-parent:1.5.12.RELEASE
[INFO] PARENT org.springframework.boot:spring-boot-dependencies:1.5.12.RELEASE
[INFO] DEP_MANAGEMENT ........
[INFO] DEP_MANAGEMENT org.assertj:assertj-core:2.6.0
[INFO] [ ... Many DEP_MAN and IMPORT ... ]
[INFO] IMPORT com.MYCOMPANY:dependencyManagementBase:2.23.14-SNAPSHOT
[INFO] DEP_MANAGEMENT ........
[INFO] DEP_MANAGEMENT org.assertj:assertj-core:3.5.2
[INFO] DEP_MANAGEMENT ........发布于 2018-05-04 23:24:47
我猜它是在抢最近的船。
依赖中介--这决定了当遇到多个工件版本时,将使用哪个版本的依赖项。目前,Maven 2.0只支持使用“最近的定义”,这意味着它将使用依赖树中与项目最接近的依赖项的版本。始终可以通过在项目的POM中显式声明版本来保证版本。请注意,如果两个依赖版本在依赖树中处于相同的深度,直到Maven 2.0.8为止,还没有定义哪个版本会获胜,但是由于Maven 2.0.9,声明中的顺序才是重要的:第一个声明获胜。
对于这样的事情,我所做的就是访问给定项目的IDE依赖项部分。它向我展示了所有的依赖关系,什么版本,以及它来自哪里(参见下面附加图像的底部弹出)。

发布于 2018-05-08 20:47:55
问题是,您的项目不是依赖父项目进行依赖关系管理,而是依赖于导入的项目。Maven依赖关系层次结构不是这样工作的。最好的解决方案可能是将‘父spring-启动-启动器-父’声明移到MY_COMPANY:dependencyManagementBase项目中。然后将com.MYCOMPANY.platform中的父声明更改为指向您的dependencyManagementBase项目。这样,您将有一个明确的继承层次结构。
您目前所拥有的并不真正使用依赖关系管理。也就是说,如果要将dependencyManagementBase项目中的“dependencyManagementBase”部分更改为“依赖”,则会得到相同的结果。
发布于 2018-05-08 20:52:12
似乎没人知道答案。所以我就用我的发现来回答。
假设OP不起作用。我的下一个策略是导入spring启动父母和spring启动依赖项POMs,因为我不能使用它们作为父母。
然而,这有它自己的行为。
我发现,如果我的依赖关系管理像这样,我的版本就赢了:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>dependency-management-slim</artifactId>
<version>2.23.14-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>然而,我决定将我的自定义代码与我的春季启动模拟pom分开。所以为了保持优先权,我想我必须这样做:
service-root -> only import my-dependency-management
^-- spring-boot-parent -> mimick and import spring-boot-starter-parent
^-- service-parent -> has our common dependencies and profiles
^-- service-impl - code但是,这不起作用;spring引导版本压倒了我们的自定义版本。所以我不得不这么做:
root-parent -> nothing
^-- spring-boot-parent -> mimick and import spring-boot-starter-parent
^-- service-parent -> import my-dependency-management
^-- service-impl - code结论
¯\_(ツ)_/
https://stackoverflow.com/questions/50183956
复制相似问题