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

embedded/2024/11/19 14:17:39/

写在前面

本文看下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/embedded/138782.html

相关文章

python并发与并行概念,以及multiprocessing模块应用举例

在Python中,并发和并行是两个相关但含义不同的概念: ● 并发(Concurrent)指的是在一段时间内,多个任务交替执行的能力,这些任务可能不是同时执行,但给人的感觉是同时在处理多项任务。它可以发生在单核或多核处理器上,通过任务调度来实现“同时”处理的效果。 ● 并行(…

【网络安全面经】技术性问题2

1. 防范常见的 Web 攻击 常见的 Web 攻击类型 SQL 注入&#xff1a;攻击者通过在用户输入框中输入恶意的 SQL 语句&#xff0c;试图获取数据库中的敏感信息。例如&#xff0c;在登录表单中输入 or 11--&#xff0c;如果网站没有进行适当的防范&#xff0c;可能会导致数据库信…

SAP B1 登陆报错解决方案 - 系统架构目录服务器选择

背景 登录时出现如下报错&#xff0c;报错显示为【系统架构目录服务器选择】 强行登录会发现过往账套都不见了 出现原因 出于各种原因在开机时没有把 SAP 所有的服务成功启动&#xff08;上一次启动科学上网后全局代理没关干净之类的&#xff09;。 解决方案 关机几分钟重启…

[Docker#9] 存储卷 | Volume、Bind、Tmpfs | -v/mount | MySQL 灾难恢复 | 问题

目录 1. 什么是存储卷? 2. 生活案例 3. 为什么需要存储卷? 4. 存储卷分类 一. 管理卷 Volume 创建卷 通过 -v 或 --mount 指定 1. -v 语法 命令格式 参数说明 2. --mount 语法 命令格式 参数说明 验证 二. 绑定卷 (Bind Mount) 1. 绑定卷概述 2. 创建绑定卷…

《Beginning C++20 From Novice to Professional》第十三章 Operator Overloading

操作符重载主要是让自定义类型有和内置类型类似的自然的操作,比如字符串的连接、矩阵的运算等等用操作符比使用成员函数(虽然也是成员函数)要直观一些 本章我们可以学到: Implementing Operators for a Class 上一章我们实现的Truckload类有一个寻找最大体积的函数,其中…

Mybatis框架之单例模式 (Singleton Pattern)

MyBatis 框架中也使用到了单例模式 (Singleton Pattern)&#xff0c;主要体现在 SqlSessionFactory 的创建和管理上。通过单例模式&#xff0c;MyBatis 可以确保整个应用程序中只创建一个 SqlSessionFactory 实例&#xff0c;从而有效地管理数据库连接资源并提高性能。下面将详…

wsl配置ubuntu22.04,并配置docker

wsl配置ubuntu22.04&#xff0c;并配置docker 文章目录 wsl配置ubuntu22.04&#xff0c;并配置docker一、在Windows上安装Linux子系统前提条件安装步骤 二、wsl安装系统到其他盘①查看wsl运行状态&#xff0c;将其保持在关闭状态②导出当前Linux的镜像③注销之前的系统并检查④…

系统思考—跳出症状看全局

在和企业创办人交流中&#xff0c;经常听到这样的疑问&#xff1a;“为什么我们试了这么多办法&#xff0c;问题却还是没有解决&#xff1f;”其实很多时候&#xff0c;根本原因并不在于对策不到位&#xff0c;而是连问题的本质都没找对。 曾经和一家企业合作&#xff0c;为了解…