记录maven依赖规则-dependencyManagement,dependencies
依赖方式
直接依赖
间接依赖
依赖关系
直接依赖:
父级管理定义的版本,并且在中进行引用了的版本。
优先使用dependencyManagement定义的版本。
间接依赖:
如果间接依赖没有指定版本,Maven 会先查看 dependencyManagement 里是否有定义。若有,就使用定义的版本;若没有,Maven 会按照自身的依赖解析规则(如路径最短原则)来确定版本。
当你自己项目的 dependencyManagement
和 Spring 的 dependencyManagement
都定义了同一个依赖的版本,且项目的 dependencies
中没有显式引入该依赖(仅通过间接依赖引入)时,Maven 确定最终使用版本的规则如下:
1. 自身项目优先原则
Maven 会优先遵循自身项目 dependencyManagement
里定义的版本。这是因为 Maven 认为项目自身的配置优先级高于外部框架(如 Spring)的配置。所以,若你在自己项目的 dependencyManagement
中定义了某个依赖的版本,那么当该依赖以间接方式被引入时,Maven 会优先使用你所定义的版本。
示例
假设你的项目结构如下:
父 POM(自己项目的父 POM)
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>com.some-library</groupId><artifactId>some-library</artifactId><version>2.0.0</version></dependency></dependencies></dependencyManagement>
</project>
子项目 POM
<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>child-project</artifactId><version>1.0.0</version><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0.0</version></parent><!-- 假设引入了一个依赖,该依赖间接依赖 com.some-library --><dependencies><dependency><groupId>com.dependency</groupId><artifactId>dependency-project</artifactId><version>1.0.0</version></dependency></dependencies>
</project>
Spring 的 dependencyManagement
定义(简化示意)
<dependencyManagement><dependencies><dependency><groupId>com.some-library</groupId><artifactId>some-library</artifactId><version>1.5.0</version></dependency></dependencies>
</dependencyManagement>
在这种情况下,由于你自己项目的 dependencyManagement
定义了 com.some-library
的版本为 2.0.0
,所以当 dependency-project
间接引入 com.some-library
时,Maven 会使用 2.0.0
版本。
2. 若自身项目未定义
要是你自己项目的 dependencyManagement
中没有定义该依赖的版本,Maven 才会去参考 Spring 的 dependencyManagement
里定义的版本。若 Spring 也未定义,Maven 就会按照依赖树的路径最短原则等自身的依赖解析规则来确定版本。
总结而言,Maven 会优先采用你自己项目 dependencyManagement
中定义的依赖版本,以保证项目对依赖版本有最大的控制权。