Maven中optional标签详解

news2024/11/18 15:32:31

这一篇文章应该是全网讲解optional最细致的,因为我都是拿我自己的试验来证明,从试验当中也发现了很多出乎意外的知识!感兴趣的跟着小编一块来学习呀!

目录

    • 一、前言
    • 二、依赖传递代码演示
    • 三、是否会影响父子工程之间的依赖继承呢?
    • 四、总结

一、前言

<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.8.18</version>
  <optional>true</optional>
</dependency>

optional表示是否会传递依赖,有两个可填值(假如不声明optional标签,默认就是false):

  • false: 传递依赖
  • true:不传递依赖

举例:A引用了B的依赖,而B又引用了C依赖。

  • 假如B引用C依赖的时候没有设置optional,那么A是可以使用C依赖的。
  • 假如B引用C依赖的时候将optional标签设置为了true,那么在A当中就无法使用C依赖相关的方法,并且A调用B依赖的方法,而B依赖方法使用到了C,这时候会报找不到C依赖下的类,因为C不参与A的打包。

二、依赖传递代码演示

如下是一个父子聚合工程,不设置optional的情况:

打成jar包后,我们可以将jar解压,解压后在BOOT-INF的lib下存放着所能使用的依赖jar包,在这里可以看到hutool。

设置optional为true的情况:

没有那也就意味着不能访问hutool的类了,想要访问只能在当前项目再次引用了。

我有点好奇,既然这里看不到那么他究竟会参与打包吗?假如不参与打包,我们download工程调用common中的方法,然后common中的方法又使用了hutool工具类,那能否访问成功?接下来我们来一点一点的印证!

1.设置为true的时候是否会参与download工程的打包?

答:他是不会参与download的打包的,打成jar包后,我们可以将jar解压,解压后在BOOT-INF的lib下存放着所能使用的依赖jar包。

2.假如不参与打包,我们download工程调用common中的方法,然后common中的方法又使用了hutool工具类,那能否访问成功?

答:不能访问成功,直接会报找不到hutool的类

我解压common包发现连BOOT-INF都没有,并不是只有common的jar包解压没有,而是所有的都没有。

我一直以为common包引用了hutool,那么解压common包就应该在BOOT-INF下的jar中看到hutool.jar,其实不是的,maven打包会将所有依赖关系全部放到当前项目的BOOT-INF/jar目录下

为此我专门在common当中写了一个方法,然后使用到了hutool当中的类。

然后我又在download工程下写了一个接口,让这个接口访问common包下test方法。

紧接着启动项目,启动download项目并没有异常,只要访问common包当中方法带有hutool相关的都报异常,说找不到hutool的包。因为我们刚刚也看过了,确实是没有这个jar包。

从而也证明了,不管是当前项目引用的,还是间接引用的,jar包都存放在BOOT-INF下/jar目录下,只要这下面没有jar,那当前项目就不能用。

三、是否会影响父子工程之间的依赖继承呢?

假如我在聚合工程的父pom依赖当中使用optional为true,那子工程会继承吗?接下来进行演示。

注:在父工程设置optional为true,并不会影响子工程继承该依赖。

四、总结

  1. 将依赖设置为true不仅代表着依赖不会传递,就连打包的时候都不会将该jar打包进去,一旦使用到调用该jar包的方法就会异常。
  2. 在父工程设置optional为true,并不会影响子工程继承该依赖。
  3. 不管是当前项目引用的,还是间接引用的,所有依赖jar包都存放在jar解压后的BOOT-INF下/jar目录下,只要这下面没有jar,那当前项目就不能用。

什么时候将optional设置为true?

就拿hutool工具类来说,如下图:你想用他的某些工具类,他还让你引用一些第三方的依赖,为什么他不直接引用到自己的项目?

实际上hutool他肯定是引用了的,如果不引用他的项目可能连编译都编译不过,更别提打包给我们用了,他是将这个依赖设置为了true,假如谁用到了这块的功能,谁自己引入这个依赖。这样可以规避掉一些没有用到这块功能但是却引入了没有用的jar包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492543.html

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

相关文章

精致女孩必备的6款APP,内外兼修,提升气质

自立自强、敢于追求、内外兼修&#xff0c;这样的女孩不管在哪个时代都是非常有魅力的&#xff01; 在我看来&#xff0c;自律、上进、情商高、会打扮、会赚钱、独立、落落大方&#xff0c;这才是精致女孩该有的样子。 不墨迹&#xff0c;速速揭开6款宝藏APP的面纱&#xff0…

石头科技2022年营收实现双位数增长,以技术实力打响创新价值战

近日&#xff0c;石头科技披露了2022年度财务报告&#xff0c;报告显示&#xff0c;在在较大内外部压力下&#xff0c;石头科技2022年营收依然实现双位数增长&#xff0c;且境内外销售收入平稳增长。 该公司在近年来不断完善其产品矩阵&#xff0c;目前已推出手持无线吸尘、商…

数据结构 (入门必看)

一、 预备知识 &#xff08;一&#xff09;数据结构前言 1、学习C语言是如何写程序,学习数据结构如何简洁高效的写程序 2、遇到一个实际问题&#xff0c;需要写程序&#xff0c;需要解决两个方面的问题 1)如何表达数据之间的逻辑规律以及如何将数据存储到计算机中 数据结构…

多数据源 使用 flyWay 进行数据库管理

文章目录 前言多数据源 使用 flyWay 进行数据库管理1. 环境2. flyway版本 与 MySQL 版本 对应关系3. flyway 脚本文件命名方式4. flyway工作流程5. 知识点补充6. 集成的时候常见错误6.1. user_variables_by_thread没有访问权限6.2. MySQL不支持Flyway社区版&#xff0c;只支持F…

68元工业级双核A7,全新T113核心板震撼上市!

万象奥科全新T113核心板震撼上市&#xff0c;仅68元、工业级品质、双核A7处理器、外设丰富&#xff0c;诠释极致性价比&#xff01; 参数速递 1.全志T113工业级处理器&#xff0c;主频1.2GHz 2.双核Cortex-A7玄铁C906 RISC-V HiFi4 DSP异构多核 3.内存128MB/256MB/512MB&a…

【Kafka】概述与集群部署

文章目录 Kafka概述定义应用场景缓冲/削峰解耦异步通信 应用模式点对点模式发布/订阅模式 基础架构 Kafka集群部署集群规划下载解压修改配置文件分发安装包hadoop103、hadoop104修改配置文件配置环境变量启动集群先启动Zookeeper集群然后启动Kafka 关闭集群 集群启停脚本脚本编…

QT自学笔记2:使用介绍(函数)

一、 setAttribute&#xff08;按F1&#xff09;—>void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on true) —>Qt::WidgetAttribute attribute&#xff08;有一个属性&#xff09; ----> p->setAttribute(Qt::WA_DeleteOnClose); MainWind…

眼见为实,来瞧瞧MySQL中的隐藏列!

在介绍mysql的多版本并发控制MVCC的过程中&#xff0c;我们提到过mysql中存在一些隐藏列&#xff0c;例如行标识、事务ID、回滚指针等&#xff0c;不知道大家是否和我一样好奇过&#xff0c;要怎样才能实际地看到这些隐藏列的值呢&#xff1f; 本文我们就来重点讨论一下诸多隐…

ThingsBoard集群部署之k8s

1、概述 今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来…

Linux基本指令【Linux操作系统】

本文将开启Linux操作系统学习新篇章&#xff0c;欢迎与博主一起交流学习。 目录 一、ls指令 二、pwd指令 三、mkdir与rm指令 四、cd指令 五、touch指令 六、man指令&#xff08;重要&#xff09; 七、cp指令&#xff08;重要&#xff09; 八、mv指令&#xff08;重要&…

keepalived如何手动切换主备

概述 主备部署中使用keepalived可以很方便的实现&#xff0c;安装维护简单&#xff0c;功能稳定。 最近在使用过程中有小的发现&#xff0c;记录一下。 环境 CentOS Linux release 7.9.2009 (Core) keepalived.x86_64 1.3.5-19.el7 安装配置 centos7自带的keepalived版本…

提升自我数据分析能力的根本,是方法论!

很多人问&#xff0c;我是财务&#xff0c;能转行业做BI吗&#xff1f;我该学些什么&#xff1f;该掌握哪些技能&#xff1f;该如何学习&#xff1f;我是学生&#xff0c;在校期间专业不扎实&#xff0c;该怎么办&#xff1f;我是小白&#xff0c;还能学会数据分析吗&#xff1…

第二届“强国青年科学家”获奖者均有海外经历

今天是五四青年节&#xff0c;为了弘扬五四精神&#xff0c;知识人网小编本期专门介绍10名第二届“强国青年科学家”获奖者。特别提示&#xff1a;这些科学家均具有海外留学或研究经历。 五四精神的核心内容为“爱国、进步、民主、科学”。 进一步弘扬科学精神&#xff0c;营造…

找不到vcruntime140.dll,无法继续执行代码,解决方法分享

找不到vcruntime140.dll,无法继续执行代码&#xff1f;vcruntime140.dll 是 Visual Studio 2015 运行库的 Dynamic Link Library 文件&#xff0c;许多 Windows 应用程序需要它才能正常运行。当你尝试安装或运行某些应用程序时&#xff0c;有时可能会遇到找不到 vcruntime140.d…

电压放大器的实际应用有哪些方面

电压放大器是一种电子设备&#xff0c;用于增加信号的电压&#xff0c;使得信号具备更大的电压和功率去驱动负载&#xff0c;或者是更容易被检测、传输和处理。电压放大器的基本原理是将输入信号增加一个固定的电压值&#xff0c;以使得输出信号的幅值与输入信号的幅值相同或更…

怎样才能学好数据分析?

俗话说&#xff0c;先入行再求发展&#xff0c;好比你想彩票中奖&#xff0c;得先有买这个过程才行。想成为优秀数据分析也是如此&#xff0c;先掌握好这门技能入行后&#xff0c;再谈发展和深研。很多人都想拥有高薪双休又不加班的工作&#xff0c;比如数据分析&#xff0c;但…

在制造业的工业2.0中应用MOM系统

介绍 什么是制造运营管理 (MOM) 系统和 IT 架构的最佳实践&#xff1f; 行业专家对制造类型和供应网络有何建议&#xff1f; 管理思维和企业文化是否因不断变化的全球市场而过时&#xff1f; MOM 技术是否过于昂贵&#xff0c;IT 架构是否无法快速适应市场变化&#xff1f;…

波奇学c++:类和对象:类,构造函数,析构函数和拷贝构造函数

面向对象和面向过程 面向对象&#xff1a;划分事务参与的对象&#xff0c;关注对象的交互&#xff0c;现实关系更真实的模拟现实 面向对象三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 封装&#xff1a;私有&#xff0c;公有&#xff0c;为了更好的管理 c语言…

第 7 章 与 Hive 的集成--以及最后的HBase回顾

7.1 使用场景 如果大量的数据已经存放在 HBase 上面&#xff0c;需要对已经存在的数据进行数据分析处理&#xff0c;那 么 Phoenix 并不适合做特别复杂的 SQL 处理&#xff0c;此时可以使用 hive 映射 HBase 的表格&#xff0c;之后 写 HQL 进行分析处理。 插入一条&#xff…

鸿蒙Hi3861学习五-Huawei LiteOS(任务管理)

一、任务简介 关于任务的相关介绍&#xff0c;之前文章有比较详细的介绍&#xff0c;这里不做过多解释&#xff0c;可以参考如下文章&#xff1a;FreeRTOS学习二&#xff08;任务&#xff09;_t_guest的博客-CSDN博客 而LiteOS的主要特性可以总结为如下几点&#xff1a; LiteO…