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.pswp.cn/pingmian/91195.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础--Day04--流程控制语句

流程控制语句是计算机编程中用于控制程序执行流程的语句。它们允许根据条件来控制代码的执行顺序和逻辑&#xff0c;从而使程序能够根据不同的情况做出不同的决策。流程控制实现了更复杂和灵活的编程逻辑。 顺序语句 顺序语句是按照编写的顺序依次执行程序中的代码。代码会按照…

【同济大学】双速率自动驾驶架构LeAD:端到端+LLM,CARLA实测93%路线完成率,性能SOTA!

近年来&#xff0c;随着端到端的技术快速发展将自动驾驶带到了一个新高度&#xff0c;并且取得了非常亮眼的成绩。由于感知限制和极端长尾场景下训练数据覆盖不足&#xff0c;模型在高密度复杂交通场景下和不规则交通情况下的处理能力不足&#xff0c;导致在开放道路上大规模部…

github与git新手教程(快速访问github)

0 序言 作为一个开发者&#xff0c;你必须知道github和git是什么&#xff0c;怎么使用。 github是一个存储代码等资源的远程仓库&#xff0c;一个大型项目往往需要很多人共同协作开发&#xff0c;而大家如何协同开发的进度与分工等要求需要有一个统一开放保存代码的平台。git…

Windows环境下安装Python和PyCharm

可以只安装PyCharm吗&#xff1f;不可以&#xff01;&#xff01;&#xff01; 开发Python应用程序需要同时安装Python和PyCharm。Python是一种编程语言&#xff0c;PyCharm是一个专门为Python开发设计的集成开发环境&#xff0c;提供丰富的功能以简化编码过程。 一、前期准备…

Qt 嵌入式系统资源管理

在嵌入式系统中&#xff0c;资源&#xff08;CPU、内存、存储、网络等&#xff09;通常非常有限&#xff0c;因此高效的资源管理对 Qt 应用的稳定性和性能至关重要。本文从内存优化、CPU 调度、存储管理到电源控制&#xff0c;全面解析 Qt 嵌入式系统资源管理的关键技术。 一、…

小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。

1.数据结构计算机存储、组织数据的方式&#xff1b;有特定关系的数据元素集合&#xff1b;研究数据的逻辑结构、物理结构&#xff08;真实存在&#xff09;和对应的算法&#xff1b;新结构仍保持原结构类型&#xff1b;选择更高的运行或存储效率的数据结构。逻辑结构——面向问…

力扣面试150(44/150)

7.30 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

Linux实战:从零搭建基于LNMP+NFS+DNS的WordPress博客系统

前言 在数字化时代&#xff0c;拥有一个个人博客是技术爱好者展示成果、分享经验的重要方式。本文将带您从零开始&#xff0c;在Linux环境下通过两台服务器协作&#xff0c;搭建一个功能完整的WordPress博客系统。我们将整合LNMP架构、NFS文件共享和DNS域名解析服务&#xff0c…

Apache Ignite 的对等类加载(Peer Class Loading, P2P Class Loading)机制

这段内容是关于 Apache Ignite 的“对等类加载”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;机制的详细说明。这是 Ignite 为了简化开发而设计的一个非常强大的功能&#xff0c;但同时也存在一些安全和性能上的考量。 下面我将用通俗易懂的语言 结构化解…

预过滤环境光贴图制作教程:第四阶段 - Lambert 无权重预过滤(Stage 3)

在完成高光反射的 GGX 预过滤后,我们还需要处理环境光的漫反射部分。本阶段(Stage 3)将基于 Lambert 分布对环境贴图进行无权重预过滤,生成用于漫反射计算的环境数据。与高光反射的方向性不同,漫反射是光线在粗糙表面的均匀散射,因此需要用更适合均匀分布的 Lambert 模型…

Spring与SpringBoot:从手动挡到自动挡的Java开发进化论

大家好&#xff01;我是程序员良辰&#xff0c;今天我们来聊聊Java开发界的两位"重量级选手"&#xff1a;Spring 和 SpringBoot。它们之间的关系就像手动挡汽车和自动挡汽车——一个给你完全的控制权但操作复杂&#xff0c;一个让你轻松上路但保留了切换手动模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常见和推荐的做法。将复杂的逻辑封装在 methods 中。<!-- ✅ 正确&#xff1a;调用 methods 中的方法 --> <button click"handleClick">点击我</button>new Vue({methods: {handleClick(event) {// 这里可以写任意语句if (this…

SQLite 子查询详解

SQLite 子查询详解 引言 SQLite 是一种轻量级的数据库&#xff0c;以其简单、易用和跨平台而著称。在数据库查询中&#xff0c;子查询是一个非常重要的概念&#xff0c;它允许我们在查询中使用查询结果。本文将详细讲解 SQLite 中的子查询&#xff0c;包括其定义、用法以及在实…

可以组成网络的服务器 - 华为OD统一考试(JavaScript 题解)

题目描述 在一个机房中,服务器的位置标识在n*m的整数矩阵网格中,1表示单元格上有服务器,0表示没有。如果两台服务器位于同一行或者同一列中紧邻的位置,则认为它们之间可以组成一个局域网,请你统计机房中最大的局域网包含的服务器个数。 输入描述 第一行输入两个正整数,…

redis,MongoDB等未授权访问靶场复现

redis未授权访问在docker中启动vulhub对应的靶场目录&#xff1a;cd /vulhub-master/redis/4-unacc在kali上安装redis程序进行服务连接安装redis apt-get install redis redis链接 redis-cli -h IP -p 端口输入info可以查看信息接下来我们使用redis-rogue-server来获取命令执行…

设计模式:代理模式 Proxy

目录问题解决方案结构代码代理是一种结构型设计模式&#xff0c;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff1a; 有这样一…

Linux零基础Shell教学全集(可用于日常查询语句,目录清晰,内容详细)(自学尚硅谷B站shell课程后的万字学习笔记,附课程链接)

此文章为学习了 尚硅谷B站课程 后的学习笔记 【尚硅谷】Shell脚本从入门到实战_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1hW41167NW/?spm_id_from333.337.search-card.all.click&vd_source68e0bbe20c8b1102b59ced40f67db628注意&#xff1a;需要先学Linux基础…

GitLab 中的分支和标签的定义及操作

&#xff08;一&#xff09;GitLab 中的分支和标签的定义及操作 1. 分支&#xff08;Branch&#xff09; 定义&#xff1a; 分支是代码仓库中的独立开发路径&#xff0c;允许你在不影响主线&#xff08;通常是 main 或 master 分支&#xff09;的情况下&#xff0c;进行实验、开…

第2章 cmd命令基础:常用基础命令(3)

Hi~ 我是李小咖&#xff0c;主要从事网络安全技术开发和研究。 本文取自《李小咖网安技术库》&#xff0c;欢迎一起交流学习&#x1fae1;&#xff1a;https://imbyter.com 本节介绍的命令有显示系统信息&#xff08;systeminfo&#xff09;、启动指定程序&#xff08;start&am…

RabbitMQ 发送方确认的两大工具 (With Spring Boot)

核心概念解析 发布者确认机制的核心思想是&#xff1a;将消息投递的可靠性从“尽力而为”提升为“契约保证”。生产者不再是“发后不理”&#xff0c;而是与 Broker 建立一个双向的沟通渠道。 在 Spring AMQP 的封装下&#xff0c;这个机制主要由两个回调接口实现&#xff1a; …