依赖
依赖标签
<project>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 依赖类型,对应项目坐标定义中的packaging -->
<type></type>
<!-- 依赖范围
compile:默认范围。编译依赖范围。编译、测试、运行有效。
test:测试依赖范围。仅在编译、运行测试代码时有效。
provided:已提供依赖范围。编译、测试有效。
runtime:运行时依赖范围。测试、运行有效。
system:系统依赖范围。编译、测试有效。必须通过systemPath显示指定依赖文件的路径。
import:导入依赖范围。
-->
<scope></scope>
<!-- 标记依赖是否可选 -->
<optional></optional>
<!-- 排除传递性依赖 -->
<exclusion></exclusion>
</dependency>
</dependencies>
</project>
依赖作用范围
| scope | 编译 | 测试 | 运行 |
| compile | Y | Y | Y |
| test | —— | Y | —— |
| provided | Y | Y | —— |
| runtime | —— | Y | Y |
| system | Y | Y | —— |
例子:
compile:spring-core
test: JUnit
provide:servlet-api
runtime:JDBC驱动实现
system:本地的,Maven仓库之外的类库文件
依赖传递
A依赖B,B依赖C。
那么A对B为第一直接依赖,B对C为第二直接依赖,A对C为传递性依赖。
第一直接依赖于第二直接依赖决定了传递性依赖范围。
如图:最左边一列为第一直接依赖,最上边一行为第二直接依赖。
|
| compile | test | provided | runtime | |
| compile | compile | —— | —— | runtime | |
| test | test | —— | —— | test | |
| provided | provided | —— | provided | provided | |
| runtime | runtime | —— | —— | runtime | |
——表示 不传递依赖
注:可选依赖不会传递
依赖调解
原则一:路径最近者优先。
例:A->B->C->X(1.0.0)与A->D->X(2.0.0),X(1.0.0)路径长度3,X(2.0.0)路径长度2,解析X(2.0.0)。
原则二:第一声明者优先。
例:A->B->Y(1.0.0)与A->C->Y(2.0.0),如果B依赖声明在C依赖之前,那么解析Y(1.0.0)。
注:显示声明任何项目中任何直接用到的依赖。
原因:升级直接依赖时,相关传递性依赖也可能发生变化,不易察觉,可能导致当前项目出错,留下了潜在的威胁,也不好找,,这就不好了。所以最好显示声明任何项目中任何直接用到的依赖。

1万+

被折叠的 条评论
为什么被折叠?



