Maven中Optional和Scope元素的使用场景,你弄明白了?
Maven依赖中的Scope、传递与隔断
optional标签
- 作用:控制依赖传递
为true时表示该依赖是可选的,项目之间依赖不传递
- 默认值:
不设置optional(默认)或者optional是false,表示传递依赖
scope标签
- 作用:
- 作用1:
用来控制依赖的使用范围,指定当前包的依赖范围,也就是哪些依赖在哪些classpath中可用
- 作用2:
用于控制依赖的传递性,如provided可以阻断依赖的传递
- 默认值:
compile:表示依赖会参与当前项目的编译、测试、运行、打包等过程中,是一个比较强的依赖。打包时通常会包含该依赖,部署时会打包到lib目录下
- 其他常见值
常见的可选值有: provided, runtime, test, system
- 编译的过程:
将源文件编译成字节码文件
依赖传递
有三个项目A、B、C,当前项目为A,A依赖于B,B依赖于C。则项目C在A中是什么样的依赖关系呢?
我们可以根据B依赖于C的scope来判断:
- scope为test、provided、system时,则项目C被抛弃,A并不依赖于C
- 否则A依赖于C
注意这里的依赖就是:使用dependency包裹的依赖关系
依赖阻断
maven的依赖关系是有传递性的。如:A–>B,B–>C,则A–>C。但有时候,项目A可能不是必需依赖C,因此需要在项目A中隔断对C的依赖。隔断依赖有2种方式:
- 可选依赖(Optional Dependencies)
- 依赖排除(Dependency Exclusions)