依赖范围
Maven项目在编译、测试、运行时可能会采用不同的classpath,因此需要对这三种情况设置不同的依赖范围,如下为Maven提供的依赖范围类型:
- compile (编译依赖范围。默认情况)
适用范围:编译、测试、运行
- test (测试依赖范围)
适用范围:测试
- provided (已提供依赖范围)
适用范围:编译、测试(运行时已经由环境提供了该依赖)
- runtime (运行时依赖范围)
适用范围:测试、运行
- system (系统依赖范围)
适用范围:编译、测试(与provided依赖范围一致,但是必须通过systemPath元素显示指定依赖文件的路径,此类依赖不是通过Maven仓库解析,而是往往与本机系统绑定)
- import (导入依赖范围)
该依赖不会对三种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 | - | 本地的,Maven仓库之外的类库文件 |
传递性依赖
依赖范围不仅可以控制依赖与三种classpath的关系,还对传递性依赖产生影响。假如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 |