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 6
        return null;
    }
}

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

写在后面

参考文章列表

maven之如何查看依赖树 。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA使用Verilog实现CAN通信

FPGA实现CAN通信&#xff08;Verilog&#xff09; 1.作者使用的方法是通过FPGA芯片&#xff08;如Xilinx公司的型号为XC7K325TFFG676-2&#xff09;控制SJA1000T芯片&#xff08;CAN控制器芯片&#xff09;实现CAN通信&#xff0c;如下图所示&#xff1a; 2.熟悉连接方式之后&…

1Panel 推送 SSL 证书到阿里云、腾讯云

本文首发于 Anyeの小站&#xff0c;点击链接 访问原文体验更佳 前言 都用 CDN 了还在乎那点 1 年证书钱么&#xff1f; 开句玩笑话&#xff0c;按照 Apple 的说法&#xff0c;证书有效期不该超过 45 天。那么证书有效期的缩短意味着要更频繁地更新证书。对于我这样的“裸奔”…

推荐一款高效的网站数据抓取工具:SysNucleus WebHarvy

SysNucleus WebHarvy是一款高效的网站数据抓取工具&#xff0c;支持从网页中提取文本、图像、URL 和电子邮件等内容&#xff0c;无需编写任何代码或脚本即可轻松实现数据抓取。用户可以通过 WebHarvy 内置的浏览器直观地浏览网页&#xff0c;指引软件提取所需的数据。它通过自动…

Codeforces Round 987 (Div. 2)(前四道)

A. Penchick and Modern Monument 翻译&#xff1a; 在繁华大都市马尼拉的摩天大楼中&#xff0c;菲律宾最新的 Noiph 购物中心刚刚竣工&#xff01;建筑管理方 Penchick 订购了一座由 n 根支柱组成的先进纪念碑。 纪念碑支柱的高度可以用一个由 n 个正整数组成的数组 h 来表示…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 &#x1f31f;项目分析&#x1f31f;实现方式&#x1f31f;开发流程 &#x1f31f;项目分析 需求&#xff1a;为Linux环境下提供可便捷使用的虚拟键盘OS环境&#xff1a;Windows 7/11、CentOS 7开发语言&#xff1a;Qt/C IDE&#xff1a;QtCreator 、Qt5.14.2功…

数字孪生驱动的智能决策:提升管理效率的关键技术

在现代的数字化转型过程中&#xff0c;数字孪生技术成为许多行业实现智能化升级的重要推动力。而作为领先的可视化平台&#xff0c;山海鲸可视化通过其强大的鲸孪生组件&#xff0c;将数字孪生技术与可视化紧密结合&#xff0c;为企业和行业用户提供了一种全新的方式来管理、监…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner &#xff08;25&#xff09; 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner &#xff08;25&#xff09;[toc]1、概述&#x1f41c;2、下载MTuner&#x1fab2;3、使用MTuner分析qt程序内存泄漏&#x1f9a7;4、相关地址&#x1f41…

AI视频处理软件行业分析与未来预测

AI视频处理软件是利用人工智能&#xff08;AI&#xff09;技术来增强、编辑和处理视频内容的应用程序或工具。这类软件通常提供多种功能&#xff0c;能够自动化一定的处理流程&#xff0c;提升视频制作效率和质量。以下是一些常见的AI视频处理软件功能&#xff1a; 1.自动剪辑…

数据结构—栈和队列

目录 1.栈底层结构的选择 2.栈的实现 3.栈 3.1入栈 3.2出栈 3.3栈顶删除 4.队列 4.1队列介绍 4.2队列初始化 4.3入队列 4.4队头删除 1.栈底层结构的选择 栈是一种数据结构 具有“后进先出的”的特点 现在面临的两种选择&#xff0c;一种是顺序表&#xff0c;另一种…

解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多。请稍后片刻再重试,或与系统管理员或技术支持联系“问题

当我们远程连接服务器连接不上并提示“为安全考虑&#xff0c;已锁定该用户账户&#xff0c;原因是登录尝试或密码更改尝试过多。请稍候片刻再重试&#xff0c;或与系统管理员或技术支持联系”时&#xff0c;根本原因是当前计算机远程连接时输入了过多的错误密码&#xff0c;触…

Marp for VScode插件 PPT无法预览的问题

优质好文&#xff1a;https://blog.csdn.net/lyuhaochina/article/details/141527208 这是因为很多人在VScode中安装markdown插件时都会安装插件Markdown Preview Enhanced,这个插件会和Marp插件的预览功能产生冲突,导致用Marp插件做的PPT无法预览 找到设置选项Markdown-previe…

实验一:自建Docker注册中心

基于容器安装运行Registry Docker Registry主要负责镜像仓库的管理 创建并启动一个运行Docker Registry: docker run -d -p 5000:5000 --restartalways --name myregistry -v /opt/data/registry:/var/lib/registry registry -v&#xff1a;将主机的本地/opt/data/registry目…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角&#xff1b;如果是第一次注册账号的话&#xff0c;这个主页里面肯定是不存在仓库的&#xff0c;需要我们自己手动的进行创建&#xff1…

演员王子辰—专注革命题材 《前行者》后再出发

2021年10月22日在北京卫视播出的由张鲁一、聂远等人主演的电视剧《前行者》&#xff0c;讲述了在二十世纪三十年代初&#xff0c;因叛徒出卖&#xff0c;我上海地下党组织遭到严重破坏&#xff0c;革命事业陷入一片白色恐怖之中。我党情报员马天目刚从法国归来&#xff0c;临危…

uniapp中h5端如何引用本地json数据(json文件)

前言 uniapp读取本地json数据文件&#xff0c;有下面两种方式可以实现&#xff1a; 文件后缀为.json类型文件后缀为.js类型 这里展示后缀为.js类型的处理方式 1、在static中创建后缀为.js的文件存储json数据。 注意使用export导出 2、在要使用的页面导入 <template>…

PLC如何支持GEM300标准?SECS/GEM通讯协议

1. 提供技术服务&#xff0c;保证户使用没问题 2. 支持市场所有的常规PLC 3. 支持常规组态软件&#xff0c;如wincc、组态王、组态屏等 4. 支持各类传感器&#xff0c;私有协议、modbus、web等 5. 无需二次开发&#xff0c;只需配置映射到已有的PLC地址 GEM300协议是为了满…

快递100 物流查询API全面解析

一.基础准备 1.物流查询痛点 如何通过物流单号实时查询物流信息?如何实时查看物流地图轨迹? 使用快递 100&#xff0c;用户可以通过简单地输入快递单号来获取快递的详细物流状态&#xff0c;不仅能看到包裹目前的位置信息&#xff0c;还可以了解它的运输进展。 快递 100API…

《动手学深度学习》中d2l库的安装以及问题解决

当我们在按照《动手学深度学习》这本书或者网课学习时会有需要导入d2l库的使用。​d2I是一个与《动手学深度学习》(Dive into Deep Learning&#xff09;一书配套的开源教学库&#xff0c;它包含了作者李沐设计的深度学习相关代码和示例。这个库旨在帮助读者通过实践经验来理解…