0.引言
mavan的依赖机制包含依赖传递、依赖范围、依赖管理(导入)和系统依赖
1.依赖传递
所谓传递就是 你的项目A依赖一个构件B,B依赖构件C和D,你的项目A也会依赖项目C和D。
如你的项目生命的POM文件如下,wy-app依赖了spring-context,
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wy.app</groupId>
<artifactId>wy-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>wy-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>springframework</groupId>
<artifactId>spring-context</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
</project>
用mvn dependency:tree分析可得
由于依赖传递没有层次限制,引发了一系列问题,如循环依赖、多版本冲突等等,为了解决这些问题,maven有以下措施。
1.1 依赖仲裁
当在dependencies元素下添加一个依赖spring-core,且与传递的依赖版本不同时,maven有着自己的仲裁机制。
<dependency>
<groupId>springframework</groupId>
<artifactId>spring-core</artifactId>
<version>1.2.3</version>
</dependency>
依赖仲裁就是在同个构件有多个版本时,选择构件的其中一个版本。
规则:
- 依赖树 层次上离根最近的,层次相同,选择先声明的。
如下图,由于声明了一个不同版本的spring-core:1.2.3,由于这个离根更更近,所以忽略了从spring-context传递而来的spring-core:1.2.6。
2.依赖管理
依赖管理dependencyManagement块 集中化管理依赖版本,当项目包含多个模块,有很多相同的依赖,可以抽象出一个parent POM,父pom文件中可以声明依赖如下,而子模块就可以使用根据groupId-artifactId引用该声明,可以统一管理多个模块的依赖版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>springframework</groupId>
<artifactId>spring-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
....
</dependencyManagement>
<!-- 子模块-->
<dependencies>
<dependency>
<groupId>springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
...
</dependencies>