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包的大小,提升编译和发布速度。