4

maven | optional | 犀牛的博客

 1 year ago
source link: https://benpaodewoniu.github.io/2023/01/30/maven9/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

maven | optional

2023-01-30javamaven

1

optional 元素。

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

<!--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为子项目。在父项目中引入了单元测试的依赖:

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

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

optional元素默认值(false)

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

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

9_0.jpeg

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

optional元素为true

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

9_1.jpeg

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

parent继承的情况

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK