maven的optional选项说明以及具体应用

写在前面

本文看下maven的optional选项的作用和用法。

1:什么作用

考虑这样的场景,A依赖B,B依赖C,正常的按照依赖的传递性,A也会间接的依赖C,但是在一些特定的场景中项目A只希望依赖B,而不依赖C,此时就需要使用到optional选项。具体使用也比较简单,只需要在C的对应依赖GAV中增加<optional>true</optional>就行了。

2:实战例子

我们使用maven的父子项目首先创建项目A,其POM如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.example</groupId><artifactId>untitled5656</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>A</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
<!--            <optional>true</optional>--></dependency></dependencies>
</project>

可以看到我们依赖了fastjson,并且注释掉了optional(默认false),接着处理项目B,在其pom中依赖项目A:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.example</groupId><artifactId>untitled5656</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>B</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version></dependency><dependency><groupId>org.example</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

接着执行命令mvn clean install dependency:tree:

PS D:\netty-sourcecode\untitled5656> mvn clean install dependency:tree 
...
[INFO] org.example:B:jar:1.0-SNAPSHOT
[INFO] +- cn.hutool:hutool-all:jar:5.8.26:compile
[INFO] \- org.example:A:jar:1.0-SNAPSHOT:compile
[INFO]    \- com.alibaba:fastjson:jar:1.2.83:compile
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.410 s
[INFO] Finished at: 2024-11-15T11:38:20+08:00
[INFO] ------------------------------------------------------------------------

可以看到此时项目B不仅仅依赖了项目A,还传递依赖了项目A直接依赖的fastjson,如果是不需要依赖fastjson,则可以修改jackson pom为如下:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version><optional>true</optional>
</dependency>

即增加<optional>true</optional>,重新导入依赖后,再执行命令mvn clean install dependency:tree:

PS D:\netty-sourcecode\untitled5656> mvn clean install dependency:tree
[INFO] Scanning for projects...
...
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ B ---
[INFO] org.example:B:jar:1.0-SNAPSHOT
[INFO] +- cn.hutool:hutool-all:jar:5.8.26:compile
[INFO] \- org.example:A:jar:1.0-SNAPSHOT:compile
[INFO] ------------------------------------------------------------------------
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.324 s
[INFO] Finished at: 2024-11-15T11:44:23+08:00
[INFO] ------------------------------------------------------------------------

此时项目A的jackson就没有被传递依赖了。

3:在netty中的应用

netty中的日志工具类,会根据我们项目中具体引入了哪种jdk的相关jar而进行动态的选择日志实现,如下:

// io.netty.util.internal.logging.InternalLoggerFactory#newDefaultFactory
private static InternalLoggerFactory newDefaultFactory(String name) {InternalLoggerFactory f = useSlf4JLoggerFactory(name);if (f != null) {return f;}f = useLog4J2LoggerFactory(name);if (f != null) {return f;}f = useLog4JLoggerFactory(name);if (f != null) {return f;}return useJdkLoggerFactory(name);
}

其中以useSlf4JLoggerFactory为例看下:

private static InternalLoggerFactory useSlf4JLoggerFactory(String name) {try {InternalLoggerFactory f = new Slf4JLoggerFactory(true);f.newInstance(name).debug("Using SLF4J as the default logging framework");return f;} catch (LinkageError ignore) {return null;} catch (Exception ignore) {// We catch Exception and not ReflectiveOperationException as we still support java 6return null;}
}

这里当运行环境中有对应的类时就会返回正常的实例,否则发生异常返回null。这里的日志相关的依赖就都是optional的,因为使用common包的项目并不一定需要这些依赖,就算需要的话,自己单独引入就可以了,如下:
在这里插入图片描述
而因为common中引入了,所以common本身的编译肯定是没有问题的,只不过依赖common的项目不会传递依赖这些log相关的依赖了。

写在后面

参考文章列表

maven之如何查看依赖树 。

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

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

相关文章

QSS 设置bug

问题描述&#xff1a; 在QWidget上add 一个QLabel&#xff0c;但是死活不生效 原因&#xff1a; c 主程序如下&#xff1a; QWidget* LOGO new QWidget(logo_wnd);LOGO->setFixedSize(logo_width, 41);LOGO->setObjectName("TittltLogo");QVBoxLayout* tit…

论文阅读 - Causally Regularized Learning with Agnostic Data Selection

代码链接&#xff1a; GitHub - HMTTT/CRLR: CRLR尝试实现 https://arxiv.org/pdf/1708.06656v2 目录 摘要 INTRODUCTION 2 RELATED WORK 3 CAUSALLY REGULARIZED LOGISTIC REGRESSION 3.1 Problem Formulation 3.2 Confounder Balancing 3.3 Causally Regularized Lo…

JVM双亲委派与自定义类加载器

一. 类加载过程 Java Application运行前需要将编译生成的字节码文件加载到JVM中&#xff0c;JVM类加载过程如下&#xff1a; 1. 加载 加载阶段是类加载的第一步&#xff0c;在加载阶段JVM会查找并加载类的字节码文件&#xff0c;这个过程通常从类路径&#xff08;Classpath…

Android Osmdroid + 天地图 (二)

Osmdroid 天地图 &#xff08;二&#xff09; 前言正文一、定位监听二、改变地图中心三、添加Marker四、地图点击五、其他配置① 缩放控件② Marker更换图标③ 添加比例尺④ 添加指南针⑤ 添加经纬度网格线⑥ 启用旋转手势⑦ 添加小地图 六、源码 前言 上一篇中我们显示了地图…

R语言贝叶斯分析:INLA 、MCMC混合模型、生存分析肿瘤临床试验、间歇泉喷发时间数据应用|附数据代码...

全文链接&#xff1a;https://tecdat.cn/?p38273 多模态数据在统计学中并不罕见&#xff0c;常出现在观测数据来自两个或多个潜在群体或总体的情况。混合模型常用于分析这类数据&#xff0c;它利用不同的组件来对数据中的不同群体或总体进行建模。本质上&#xff0c;混合模型是…

AI开发-计算机视觉库-OpenCV

1 需求 官网&#xff1a;OpenCV - Open Computer Vision Library 2 接口 3 示例 import cv2image cv2.imread("./data/train/1_1.jpg") print(type(image)) 4 参考资料

RK3588 C++ 多线程运行

RK3588 C 多线程 实际运行解决OpenCV问题&#xff1a; 1. OpenCV 安装 sudo apt-get update sudo apt-get install libopencv-dev2. 检查 OpenCV 安装路径 find / -name OpenCVConfig.cmake3. 设置 OpenCV_DIR 环境变量 export OpenCV_DIR/usr/lib/aarch64-linux-gnu/cmake/op…

从0开始学习机器学习--Day26--聚类算法

无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图&#xff0c;可以看到两者的区别在于无监督学习的样本是没有标签的&#xff0c;换言之就是无监督学习不会赋予主观上的判断&#xff0c;需要算法自己去探寻区别&#xff0c;第二张…

git使用及上线流程(仅为我工作中常用)

推荐软件或者直接终端 ⚠️注意&#xff1a;在确保远程和本地分支都可使用的情况下 git常见使用命令 ls---查看所有目录 pwd---本机密码 cd 目录名---进入目录 Touch ---创建文本文件 git status---查看状态 git branch---查看分支 git pull---拉取远程最新代码 git checkou…

shell编程之变量与引用

目录 深入认识变量什么是变量变量的名称变量数据类型变量的定义自定义变量环境变量位置变量 变量赋值和作用域赋值&#xff1a;变量名变量值read从键盘读入变量值变量和引号变量的作用域变量的运算 深入认识变量 什么是变量 变量是在程序中保存用户数据的一段内存存储空间&am…

精华帖分享|浅谈金融时间序列分析与股价随机游走

本文来源于量化小论坛公共讨论区板块精华帖&#xff0c;作者为正扬&#xff0c;发布于2024年6月3日。 以下为精华帖正文&#xff1a; 01 引 时间序列分析是个很唬人的术语&#xff0c;实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点&#xff0c;又看到互联…

计算机网络 (4)计算机网络体系结构

前言 计算机网络体系结构是指计算机网络层次结构模型&#xff0c;它是各层的协议以及层次之间的端口的集合。这一体系结构为计算机网络及其部件应完成的功能提供了精确定义&#xff0c;并规定了这些功能应由何种硬件或软件来实现。 一、主流模型 计算机网络体系结构存在多种模型…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

Elastic Agent:可灵活地在任何地方发送和处理任何数据

作者&#xff1a;来自 Elastic Nima Rezainia Elastic Agent 是一款功能强大且用途广泛的工具&#xff0c;可用于从各种数据源&#xff08;包括自定义用户应用程序&#xff09;收集日志和指标。现在&#xff0c;Elastic Agent 提供了无与伦比的灵活性&#xff0c;可以将数据准确…

Android CCodec Codec2 (二一)InputBuffers

CCodec使用CCodecBuffers来对输入/输出端口上的buffer进行管理&#xff0c;这一篇文章我们将一起了解InputBuffers&#xff0c;也就是输入端口的buffer管理方法。 1、CCodecBuffers CCodecBuffers是端口管理的基类&#xff0c;它抽象了输入端口管理和输出端口管理的通用方法&a…

JDBC-Mysql 时区问题详解

目录 一、前置准备 1.1 版本号列表 1.2 Sql脚本 1.3 application.yaml配置 1.4 数据库时区设置 二、java Date类型与&#xff08;jdbcType&#xff09;TIMESTAMP类型的转换 2.1 jdbc对serverTimeZone的处理 2.2 java Date转&#xff08;jdbcType&#xff09;TIMESTAMP …

LC12:双指针

文章目录 125. 验证回文串 本专栏记录以后刷题碰到的有关双指针的题目。 125. 验证回文串 题目链接&#xff1a;125. 验证回文串 这是一个简单题目&#xff0c;但条件判断自己写的时候写的过于繁杂。后面参考别人写的代码&#xff0c;首先先将字符串s利用s.toLowerCase()将其…

H5页面多个视频如何只同时播放一个?

目录 背景1. 首先介绍下 muted 属性2. 监听播放和暂停操作3. 视频播放完毕后返回桌面&#xff0c;再进入H5页面发现视频封面丢失置灰解决思路&#xff1a; 背景 页面模块同时有个四个视频模块&#xff0c;发现可以同时播放四个视频&#xff0c;但是理想的是每次只播放一个。 …

【环境配置】macOS配置jdk与maven

配置jdk与maven 配置jdk与切换java版本命令 maven安装与配置国内镜像源 用到的命令 # 进入 JDK 安装目录 cd /Library/Java/JavaVirtualMachines# 查看文件 ls ➜ jdk-1.8.jdk jdk-11.jdk# 查看路径 pwd ➜ /Library/Java/JavaVirtualMachines# 打开环境变量配置文件 vi &…

基于汇编语言的贪吃蛇程序

摘要 在我们空闲的时候&#xff0c;我们可以用一些我们学过的知识编一些东西&#xff0c;通过这些东西我们可以学习到汇编语言综合应用程序设计方法&#xff0c;还可以提高汇编语言实际应用能力&#xff0c;充分了解计算机硬件和软件&#xff0c;完成理论到实践的推进过程。这…