依赖范围
- compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
- provided:已提供依赖范围,provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用, provided依赖在编译和测试时需要,在运行时不需要,比如:servlet-api被tomcat容器提供。
- runtime:运行时依赖范围,runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。
- test:测试依赖范围,在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。
- system:系统依赖范围,system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
依赖范围由强到弱的顺序是:compile>provided>runtime>test
依赖范围 | 编译有效 | 测试有效 | 运行有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-boot |
test | - | Y | - | Junit |
provided | Y | Y | servlet-api | |
runtime | - | Y | Y | jdbc |
system | Y | Y | - | 本地的,maven仓库之外的 |
依赖范围对依赖传递的影响
列直接传递/行依赖传递 | compile | provided | runtime | test |
---|---|---|---|---|
compile | compile | - | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
最左边一列为直接依赖,理解为A依赖B的范围,最上面一行为传递依赖,理解为B依赖C的范围,行与列的交叉即为A传递依赖C的范围。
比如 A对 B 有 compile 依赖,B 对C有 runtime 依赖,那么根据表格所示A对C 有 runtime 依赖。