optional
元素。
这里以 Spring Boot
项目中的使用为例,比如我们在项目中经常使用的热部署组件 spring-boot-devtools
,就可以使用 optional
元素来进行定义,对应 pom
文件中配置如下:
1 | <!--devtools 热部署--> |
那么,这里的 optional
元素设置为 true
表示何意?optional
是 Maven
依赖 jar
时的一个选项,表示该依赖是可选的,项目之间依赖不传递。不设置 optional
(默认)或者 optional
是 false
,表示传递依赖。
文字描述可能比较抽象,下面用具体实例场景来进行更直观的描述,这里假设有两个项目 A
和 B
,其中A
为父项目,B
为子项目。在父项目中引入了单元测试的依赖:
1 | <dependency> |
下面针对 optional
元素的不同值进行讲解。
optional元素默认值(false)
当父项目添加 junit
依赖时,并未添加 optional
选项,也就是默认的 optional
元素的值为 false
。
此时,当子项目依赖父项目时,父项目A
和子项目B
的关系如下:
父项目并未设置 optional
元素为 true
,那么便具有依赖传递性。此时,子项目 B
中会直接引入父项目 A
中引入的 Junit
的 jar
包。也就是说B项目打包时,jar/war
包中会包含 junit
的 jar
包。
optional元素为true
当父项目引入 junit
依赖时,设置 optional
元素为 true
。那么,子项目B
便有了更多的选择。
如果项目B
不需要Junit
的jar
包,那么在其pom
文件中不需进行任何处理便可以。如果B
项目也需要对应的jar
包依赖,可以有两种选择:第一、A
项目中对应依赖的optional
设置为false
或去掉;第二、B
项目中直接引入需要的该依赖。
parent继承的情况
我们经常会在parent
项目中配置统一的依赖版本控制,如下:
1 | <dependencyManagement> |
此时,如果B项目需要 Junit
的 jar
包,可以直接在项目中引入,这里父项目中的 optional
配置对子项目并无影响。
综上所述,在 Maven
项目中,恰当的使用 optional
配置,可以在很大程度上减少jar
包的大小,提升编译和发布速度。