Maven <optional> 可选依赖的作用与使用场景

AUTHOR | nicechi
类别 | Maven
发表 | 2021-10-12 20:19:32
更新 | 2021-10-12 20:23:09

当一个 <dependency> 依赖带有 <optional>true<optional>  的话,那么这个 <dependency> 依赖就是一个可选依赖:

......
<dependencies>
	<dependency>
		<groupId>com.example.demo</groupId>
		<artifactId>demo-X</artifactId>
		<version>1.0.0</version>
		<!-- demo-X 是一个可选依赖 -->
		<optional>true</optional>
	</dependency>
</dependencies>
......

一般情况下,假设项目 A 依赖于项目 B,项目 B 又依赖于项目 C,根据 Maven 的传递性依赖规则,项目 A 也将依赖于项目 C,如下图所示:

但是如果项目 B 将它依赖的项目 C 设置成可选依赖的话,那么项目 A 在依赖于项目 B 的时候,将不会再依赖于项目 C,也就是说此时项目 C 将不会再作为传递性依赖而传递给项目 A ,如下图所示:

| 可选依赖的使用场景 

假设项目 B 实现了两种功能,其中的功能一需要依赖于模块 X,另一个功能二需要依赖于模块 Y,但是这两种功能在使用上是相互排斥的,也就是说在实际的使用过程当中,用户只能选择使用其中的一种功能,但是项目 B 在编译的过程当中是需要同时依赖于模块 X 以及模块 Y 的

此时有一个项目 A 需要依赖项目 B 来使用项目 B 所实现的功能二,所以此时项目 A 只要再依赖模块 Y 就可以正常使用功能二了,又因为功能一与功能二是相互排除的,所以此时再依赖功能一所需的模块 X 就显得比较多余了(当然如果项目 A 非要也依赖模块 X 也是没问题的)

综上所述,此时只要项目 B 将模块 X 与模块 Y 设置成可选依赖就可以了,这样子既可以满足项目 B 编译功能一与功能二的需求,又可以将主动权交给项目 A,如果项目 A 需要使用功能一的话,就主动依赖模块 X,如果项目 B 需要使用功能二的话,就主动依赖模块 Y

 


CATEGORY

TOP