Maven中Optional和Scope元素的使用场景,你弄明白了?
Maven依赖中的Scope、传递与隔断

optional标签

  1. 作用:控制依赖传递

为true时表示该依赖是可选的,项目之间依赖不传递

  1. 默认值:

不设置optional(默认)或者optional是false,表示传递依赖

scope标签

  1. 作用:
    1. 作用1:

用来控制依赖的使用范围,指定当前包的依赖范围,也就是哪些依赖在哪些classpath中可用

  1. 作用2:

用于控制依赖的传递性,如provided可以阻断依赖的传递

  1. 默认值:

compile:表示依赖会参与当前项目的编译、测试、运行、打包等过程中,是一个比较强的依赖。打包时通常会包含该依赖,部署时会打包到lib目录下

  1. 其他常见值

常见的可选值有: provided, runtime, test, system

  1. 编译的过程:

将源文件编译成字节码文件

依赖传递

有三个项目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种方式:

  1. 可选依赖(Optional Dependencies)
  2. 依赖排除(Dependency Exclusions)