0%

maven | optional

optional 元素。

这里以 Spring Boot 项目中的使用为例,比如我们在项目中经常使用的热部署组件 spring-boot-devtools ,就可以使用 optional 元素来进行定义,对应 pom 文件中配置如下:

1
2
3
4
5
6
<!--devtools 热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

那么,这里的 optional 元素设置为 true 表示何意?optionalMaven 依赖 jar 时的一个选项,表示该依赖是可选的,项目之间依赖不传递。不设置 optional(默认)或者 optionalfalse,表示传递依赖。

文字描述可能比较抽象,下面用具体实例场景来进行更直观的描述,这里假设有两个项目 AB,其中A为父项目,B为子项目。在父项目中引入了单元测试的依赖:

1
2
3
4
5
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

下面针对 optional 元素的不同值进行讲解。

optional元素默认值(false)

当父项目添加 junit 依赖时,并未添加 optional 选项,也就是默认的 optional 元素的值为 false

此时,当子项目依赖父项目时,父项目A和子项目B的关系如下:

父项目并未设置 optional 元素为 true ,那么便具有依赖传递性。此时,子项目 B 中会直接引入父项目 A 中引入的 Junitjar 包。也就是说B项目打包时,jar/war 包中会包含 junitjar 包。

optional元素为true

当父项目引入 junit 依赖时,设置 optional 元素为 true 。那么,子项目B便有了更多的选择。

如果项目B不需要Junitjar包,那么在其pom文件中不需进行任何处理便可以。如果B项目也需要对应的jar包依赖,可以有两种选择:第一、A项目中对应依赖的optional设置为false或去掉;第二、B项目中直接引入需要的该依赖。

parent继承的情况

我们经常会在parent项目中配置统一的依赖版本控制,如下:

1
2
3
4
5
6
7
8
9
10
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>

此时,如果B项目需要 Junitjar 包,可以直接在项目中引入,这里父项目中的 optional 配置对子项目并无影响。

综上所述,在 Maven 项目中,恰当的使用 optional 配置,可以在很大程度上减少jar包的大小,提升编译和发布速度。

请我喝杯咖啡吧~