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

devtools/2024/11/16 16:55:33/

写在前面

本文看下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.ppmy.cn/devtools/134478.html

相关文章

【洛谷】T539820 202411A Giants

题目背景 Were wide awake now our eyes are wide openWere running this world we keeping it turningWere living like Giants.Yeah Giants.Were bigger than Giants.We Giants. 节选自《Giants》。 题目描述 在《迪迪卫》中&#xff0c;一次魔法的能量和五个参数有关&…

pycharm分支提交操作

一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url&#xff0c;选择自己的项目路径 3、点击Clone&#xff0c;就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支&#xff08;非必要可以不使用&#xf…

faiss 提供了多种索引类型

faiss 多种索引类型 在 faiss 中&#xff0c;IndexFlatL2 是一个简单的基于 L2 距离&#xff08;欧几里得距离&#xff09;进行索引的索引类型&#xff0c;但实际上&#xff0c;faiss 提供了多种索引类型&#xff0c;支持不同的度量方式和性能优化&#xff0c;您可以根据需求选…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…

最后一个单词的长度---每日小题

目录 题目 题目分析 题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hello Wo…

39.安卓逆向-壳-smali语法3(方法)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

Rust 模板匹配——根据指定图片查找处于大图中的位置(支持GPU加速)

Rust 模板匹配——根据指定图片查找处于大图中的位置(支持GPU加速) 01 前言 在手搓RPA工具的时候,总会碰到不好定位的情况,那么,就需要根据小图来找到对应屏幕上的位置(以图识图),这个需求也比较简单。想到市面上也有不少RPA工具都有这个功能,那么人家有的,俺也可以…

通过css的哪些方式可以实现隐藏页面上的元素?

1&#xff1a;opacity:0 通过将元素的透明度设置为o&#xff0c;实现隐藏效果&#xff0c;但是依然会占用空间并可以进行交互。 2&#xff1a;visibility:hidden 与透明度度为0的方案类似&#xff0c;会占据空间&#xff0c;但不可以进行交互。 3&#xff1a;Overflow:hi…