maven optional
前言
最近参与了一个项目,使用maven管理依赖.项目拆分了很多模块.然后交个多个团队各自开发.最后在一个项目骨架中,把各自的模块引入进来,一起启动.
后来随着项目的深入.引入的jar包变多.发现
- jar包太多,编译太慢
- 打包之后的war包非常大
这种情况就可以使用
optional
来优化
什么是optional
optional是maven依赖jar时的一个选项,表示该依赖是可选的.不会被依赖传递
<optional>true</optional>
使用场景
以项目中使用到的日志框架为例.
例如
- B依赖了日志框架
logback、log4j、apache commons log
- 这时候的依赖关系如下 A->B
因为maven有依赖传递机制.那么A项目就会有3个jar包,logback、log4j
、apache commons log
.实际上我们一般只会在项目中使用一种日志框架.那么我们项目中就会有多余的依赖.当这种情况时越来越多时,最后整个项目的jar包就有很多的多余依赖,导致项目很臃肿.
如何优化
只要B项目中把logback、log4j、apache commons log
设置成<optional>true</optional>
例如
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<optional>true</optional>
</dependency>
这时候A项目依赖B的时候,项目中不会有logback、log4j
、apache commons log
jar包,可以根据情况自行选择一个即可.
总结
当你开发的组件时,有一个功能,有多种实现方式的jar可以提供,但是实际只会使用一种的情况下.可以把实现的jar包设置成
<optional>true</optional>
.表示: 瞧,你依赖我时,用到这个功能时,可以自行选择.而不是默认全部都给你.管你用不用.
为什么要使用optional
- 减少不必要的依赖传递
- 减少jar包冲突
原理
- 引入了optional实际上默认会做排除操作
It may be helpful to think of optional dependencies as "excluded by default