当前位置: 首页 > news >正文

maven optional 功能详解

前言

最近参与了一个项目,使用maven管理依赖.项目拆分了很多模块.然后交个多个团队各自开发.最后在一个项目骨架中,把各自的模块引入进来,一起启动.

后来随着项目的深入.引入的jar包变多.发现

jar包太多,编译太慢,
打包之后的war包非常大.

这种情况就可以使用optional来优化

什么是optional

optional是maven依赖jar时的一个选项,表示该依赖是可选的.不会被依赖传递

<optional>true</optional>

使用场景

以项目中使用到的日志框架为例.

例如

B 依赖了日志框架 logbacklog4japache commons log
这时候的依赖关系如下 A-> B (A依赖B)
因为maven有依赖传递机制.那么A项目就会有3个jar包,logbacklog4japache commons log.实际上我们一般只会在项目中使用一种日志框架.那么我们项目中就会有多余的依赖.当这种情况时越来越多时,最后整个项目的jar包就有很多的多余依赖,导致项目很臃肿.

如何优化
只要B项目中把logback、log4japache 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的时候,项目中不会有logbacklog4japache commons log jar包,可以根据情况自行选择一个即可.

总结

当你开发的组件时,有一个功能,有多种实现方式的jar可以提供,但是实际只会使用一种的情况下.可以把实现的jar包设置成<optional>true</optional>.表示: 瞧,你依赖我时,用到这个功能时,可以自行选择.而不是默认全部都给你.管你用不用.

为什么要使用optional

减少不必要的依赖传递
减少jar包冲突

原理

引入了optional实际上默认会做排除操作

It may be helpful to think of optional dependencies as "excluded by default
参考资料

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

http://www.lryc.cn/news/601415.html

相关文章:

  • 盛最多水的容器-leetcode
  • 时间长了忘记jupyter的环境是哪个了
  • k8s的csi对接GPFS
  • 系统架构设计师-【2025年上半年综合知识题】-真题回忆版分享
  • 动手学深度学习笔记04(上)
  • 物联网发展:从概念到应用的演变历程
  • Sql server开挂的OPENJSON
  • haproxy七层代理(知识点+相关实验部署)
  • C++算法竞赛篇(六)一维数组题型讲解
  • Rust实战:高效开发技巧
  • 【Java实例】服务器IP一站式管理
  • Rust Web 全栈开发(十二):构建 WebAssembly 应用
  • day69—动态规划—爬楼梯(LeetCode-70)
  • LeetCode 923.多重三数之和
  • PMO如何赋能AI产品项目治理和价值交付︱商汤绝影PMO总监陈福龙
  • 0-1BFS(双端队列,洛谷P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)题解)
  • 【C++】论如何封装红黑树模拟实现set和map
  • Java全栈面试实战:从JVM到AI的技术演进之路
  • JavaScript手录07-数组
  • LangChain实现RAG
  • JavaSE-String类
  • Rust赋能智能土木工程革新
  • 【奔跑吧!Linux 内核(第二版)】第5章:内核模块
  • 栈----4.每日温度
  • 2.qt调试日志输出
  • 多智能体系统设计:协作、竞争与涌现行为
  • Day4.AndroidAudio初始化
  • bash的特性-常用的通配符
  • bash的特性-命令和文件自动补全
  • C++ 多线程(一)