依赖配置
根元素 project 下的 dependencies 可以包含一个或者多个 dependency 元素,以声明一个或者多个项目依赖。
-
groupId、artifactId 和 version:依赖的基本坐标。
大部分依赖声明支持包含基本坐标,一些特殊情况下,会使用以下元素。 -
type:依赖的类型,对应于项目坐标定义的 packaging。默认值为 jar。
scope:依赖范围。默认值为 compile。 - optional:标记依赖是否可行。
- exclusion:用来排除传递性依赖。
依赖范围
依赖范围与 classpath 的关系
依赖范围(scope) | 对于编译 classpath 有效 | 对于测试 classpath 有效 | 对于运行时 classpath 有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | -- | Y | -- | JUnit |
provided | Y | Y | -- | servlet-api |
runtime | -- | Y | Y | JDBC 驱动实现 |
system | Y | Y | -- | 本地的,Mave 仓库之外的类库文件。慎用! |
import | 导入依赖范围。不会对三种 classpath 产生实际的影响。 |
传递性依赖
何为传递性依赖
A 有一个 compile 范围的 B 依赖,B 有一个 compile 范围的 C 依赖,那么 C 就会成为 A 的 compile 范围依赖,C 是 A 的一个传递性依赖。
![](https://img.haomeiwen.com/i2311039/e7443611604345ad.png)
依赖性传递和依赖范围
最左一列表示第一直接依赖范围,最上面一行表示第二直接依赖,中间的交叉单元格表示传递性依赖范围。
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | -- | -- | runtime |
test | test | -- | -- | test |
provided | provided | -- | provided | provided |
runtime | runtime | -- | -- | runtime |
依赖调节
依赖调节原则
- 第一原则:路径最近者优先
如:A -> B -> C -> X(1.0)、A -> D -> X(2.0),则X(2.0)会被解析使用。 - 第二原则:第一声明原则(Maven 2.0.9 开始)
如:A -> B -> X(1.0)、A -> C -> X(2.0),依赖路径长度相同时,使用在 POM 中依赖声明最靠前的依赖。
可选依赖
根据传递性依赖中的例子:
A 有一个 compile 范围的 B 依赖,B 有一个 compile 范围的 C 依赖,那么 C 就会成为 A 的 compile 范围依赖,C 是 A 的一个传递性依赖。
如果 C 是可选依赖(optional=true),则依赖 C 将不会传递给 A。下图中的 X、Y 可设为 C。
![](https://img.haomeiwen.com/i2311039/9af4f2cb12cb2e6d.png)
<?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.juvenxu.mvnbook.account</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.4-701.jdbc3</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
排除依赖
![](https://img.haomeiwen.com/i2311039/0232e6ab5d6df316.png)
网友评论