改善 Maven 的依赖性

大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!

建议使用mvn dependency:analyze命令来摆脱已声明但未使用的依赖项:

还有另一个用例, mvn dependency:analyze 它可以显示您在代码中使用但未在 pom.xml 中声明的依赖项。这有效是因为您对类路径具有传递依赖性。要么不使用该依赖项,要么声明它。

虽然几年前这是一个好主意,但今天却是一个危险的建议。在这篇文章中,我想解释一下这个插件的作用以及为什么不应该在最简单的项目中使用它。

命令mvn dependency:analyze

Maven 使用插件架构;在上面的命令中,插件是maven-dependency-plugin。一个插件承载着几个相关的_目标_。在这里,它是analyze

分析此项目的依赖项并确定哪些是:已使用且已声明;已使用且未声明;未使用且已声明。此目标旨在独立使用,因此它始终执行该test-compile阶段 -dependency:analyze-only在参与构建生命周期时改用该目标。

默认情况下,maven-dependency-analyzer用于执行分析,由于它在字节码级别工作而存在限制,但可以通过analyzer参数插入任何分析器。

–依赖项:分析

maven-dependency-analyzer是一个共享的 Maven 组件。它的描述相当详细:

分析项目中未声明或未使用的工件的依赖关系。

警告:由于分析是在字节码而不是源代码上进行的,因此有些情况无法检测到,包括常量、仅保留源代码的注释以及 Javadoc 中的链接。当这些是依赖项的唯一用途时,这可能会导致不正确的结果。

主要成分为ProjectDependencyAnalyzer,采用ClassAnalyzerDependencyAnalyzer

–maven依赖分析器

警告清楚地表明它在_字节码_级别起作用。特别是,它明确提到它不考虑源级注释。

Spring Boot 启动器

很久以前,我描述了如何设计自己的 Spring Boot starter ,从那时起它就没有发生过太大的变化。如果你刚接触 Spring Boot starter,这里有一个总结。

SpringBoot 依赖于 AutoConfiguration 类。AutoConfiguration 类是常规配置类,_即_它们对应用程序类有所贡献。您可以设置特定的激活条件,例如 Spring 属性的存在,但这些条件并非特定于自动配置。

这是一个非常简化的流程:

Spring Boot 自动附带的 JAR 是org.springframework.boot:spring-boot-autoconfigure。你可以检查其内容META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

...
org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

Enter fullscreen mode Exit fullscreen mode

举个例子,下面是RestClientAutoConfiguration

@AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1
@ConditionalOnClass(RestTemplate.class)                //2
@Conditional(NotReactiveWebApplicationCondition.class) //3
public class RestTemplateAutoConfiguration {// Class body
}

Enter fullscreen mode Exit fullscreen mode

  1. 设置自动配置类的顺序
  2. RestTemplate如果类位于类路径上则激活
  3. 如果我们不在响应式 Web 应用环境中则激活

请注意,无论类是否__在类路径上,类加载器RestTemplateAutoConfiguration都可以正常加载类!如上所示,Spring 充分利用了此机制。实际上,注释中配置的类的解析被推迟到_显式_访问它们为止。RestTemplate

带入maven-dependency-analyzer现代

提交者在 2007 年设计了该分析器:当时它的样子如下。Spring Boot 的推出时间较晚,为 2010 年。因此,该分析器未在注释中采用延迟类加载。请注意,现在情况仍然如此;该项目并没有得到太多的关注。

在 Spring Boot 项目中使用该插件时,您会得到很多误报。我在一个简单的 Spring Boot 项目中尝试了它,在 PostgreSQL 上使用 WebFlux 和 R2DBC。

以下是我运行时输出的一小部分摘录mvn analyze:dependencies

[WARNING] Unused declared dependencies found:
[WARNING]   org.springframework.boot:spring-boot-starter-data-r2dbc:jar:3.4.0:compile
[WARNING]   org.testcontainers:postgresql:jar:1.20.4:test
[WARNING]   org.testcontainers:r2dbc:jar:1.20.4:test

Enter fullscreen mode Exit fullscreen mode

如果我删除任何这些依赖项,测试就不会运行。

要使分析器与 Spring Boot 项目一起工作,需要什么?让我们分析一下分析器。

该插件允许配置另一个分析器:

指定要使用的项目依赖项分析器(plexus 组件角色提示)。默认情况下,使用 maven-dependency-analyzer。要使用此功能,您必须为此插件声明一个包含分析器代码的依赖项。分析器必须具有声明的 Plexus 角色名称,您可以在此处指定角色名称。

  • 类型java.lang.String
  • 自从2.2
  • 必需的No
  • 用户属性analyzer
  • 默认default

–依赖项:分析

我们可以创建一个整体的分析器,重复使用上面的内容,但添加一个特定于 Spring Boot 的分析器。

结论

Maven 分析器的当前状态对现代 Spring Boot 项目没有任何好处。现有代码可供配置甚至扩展。但是,我们需要嵌入大量 Spring Boot 逻辑。对于 Quarkus 和 Micronaut 项目,我们还需要专用代码。

我不知道这是否值得花费时间和精力。如果你认为值得,我希望这篇博文可以作为早期的分析。

进一步来说:

  • 依赖关系:分析
  • Maven 依赖分析器
  • 设计你自己的 Spring Boot 启动器 – 第 1 部分
  • 设计你自己的 Spring Boot 启动器 – 第 2 部分

原文地址:https://mp.weixin.qq.com/s/ro3EWXyoQKI0EcUqOZTLsQ

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

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

相关文章

【SQL】子查询详解(附例题)

子查询 子查询的表示形式为:(SELECT 语句),它是IN、EXISTS等运算符的运算数,它也出现于FROM子句和VALUES子句。包含子查询的查询叫做嵌套查询。嵌套查询分为相关嵌套查询和不想关嵌套查询 WHERE子句中的子查询 比较运算符 子查询的结果是…

Stable Diffusion 扩展知识实操整合

本文的例子都是基于秋叶整合包打开的webui实现的 一、ADetailer——改善人脸扭曲、恶心 After detailer插件可以自动检测生成图片的人脸,针对人脸自动上蒙版,自动进行重绘,整个流程一气呵成,因此可以避免许多重复的操作。除此之…

freertos内存管理简要概述

概述 内存管理的重要性 在嵌入式系统中,内存资源通常是有限的。合理的内存管理可以确保系统高效、稳定地运行,避免因内存泄漏、碎片化等问题导致系统崩溃或性能下降。FreeRTOS 的内存管理机制有助于开发者灵活地分配和释放内存,提高内存利用…

按规则批量修改文件扩展名、删除扩展名或添加扩展名

文件的扩展名是多种多样的,有些不同文件的扩展名之间相互是可以直接转换的。我们工作当中最常见的就是 doc 与 docx、xls 与 xlsx、jpg 与 jpeg、html 与 htm 等等,这些格式在大部分场景下都是可以相互转换 能直接兼容的。我们今天要介绍的就是如何按照一…

热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索

654.最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大…

MySQL学习笔记7【InnoDB】

Innodb 1. 架构 1.1 内存部分 buffer pool 缓冲池是主存中的第一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删查改操作时,先操作缓冲池中的数据,然后以一定频率刷新到磁盘,这样操作明显提升了速度。 …

RNN、LSTM、GRU汇总

RNN、LSTM、GRU汇总 0、论文汇总1.RNN论文2、LSTM论文3、GRU4、其他汇总 1、发展史2、配置和架构1.配置2.架构 3、基本结构1.神经元2.RNN1. **RNN和前馈网络区别:**2. 计算公式:3. **梯度消失:**4. **RNN类型**:(查看发展史)5. **…

django数据迁移操作受阻

错误信息: django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根据错误信息分析,该问题是由于MySQL用户 缺乏SYSTEM_VARI…

WinForm真入门(13)——ListBox控件详解

WinForm ListBox 详解与案例 一、核心概念 ‌ListBox‌ 是 Windows 窗体中用于展示可滚动列表项的控件,支持单选或多选操作,适用于需要用户从固定数据集中选择一项或多项的场景‌。 二、核心属性 属性说明‌Items‌管理列表项的集合,支持动…

局域网内文件共享的实用软件推荐

软件介绍 在日常办公、学习或家庭网络环境里,局域网内文件共享是个常见需求。有一款免费的局域网共享软件非常适合这种场景。 这款局域网共享软件使用起来非常简单,不需要安装,直接点击就能使用。 它的操作流程简单易懂,用户只要…

ViewModel vs AndroidViewModel:核心区别与使用场景详解

在 Android 的 MVVM 架构中,ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件,但二者有一些关键区别: 1. ViewModel 基本用途:用于存储和管理与 UI 相关的数据,生命周期与 Activity/Fragment 解耦&…

C语言--求n以内的素数(质数)

求n以内的素数,可以用试除法或者埃拉托斯特尼筛法(埃氏筛法) 文章目录 试除法埃拉托斯特尼筛法(埃氏筛法)两种方法测试运行效率 输入:数字n 输出:n以内所有的素数 不管是哪个方法,都…

Skynet.socket 函数族使用详解

目录 Skynet.socket 函数族使用详解核心功能分类一、TCP 连接管理1. 监听端口2. 建立连接3. 关闭连接 二、数据读写操作1. 阻塞式读取2. 写入数据2.1 socket.write(fd, data) 的返回值2.2 示例代码2.3 关键注意事项2.4 与其他函数的区别2.5 底层原理2.6 总结 三、UDP 处理1. 创…

Unity Addressables资源生命周期自动化监控技术详解

一、Addressables资源生命周期管理痛点 1. 常见资源泄漏场景 泄漏类型典型表现检测难度隐式引用泄漏脚本持有AssetReference未释放高异步操作未处理AsyncOperationHandle未释放中循环依赖泄漏资源相互引用无法释放极高事件订阅泄漏未取消事件监听导致对象保留高 2. 传统管理…

aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual

文章目录 aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual学习内容:1. 整体架构1.1 代码链接1.2 全体处理架构2. 代码分析2.1 创建`ImageRepo`,并设定给`FargateTaskDef`2.2 创建`CodeBuild project`2.3 对`CodeBuild project`赋予权限(`ECR`的`image rep…

在windows服务器使用Nginx反向代理云端的python实现的web应用

近日得闲,计划将之前写过的一些小桌面程序搬到云服务器上方便随时随地使用,同时也学习一些基本的网站开发和搭建知识,于是在AI的帮助下,基于niceguifastapi非常快捷地搞出来了一个前后端一体的网站程序,放在云服务器上…

全球贸易战火重燃:50%关税如何绞杀跨境电商低价模式?

一、政策高压:美国对华贸易战升级路线图 2024年5月,美国国会《数字贸易壁垒法案》草案曝光,标志着中美贸易博弈进入新阶段: • 关税武器精准打击:成衣、消费电子、小家电税率拟从10-25%跃升至50% • 监管范围扩大&…

0411 | 软考高项笔记:项目立项

在软考的项目管理知识体系中,技术可行性和经济可行性是项目立项阶段非常重要的两个分析维度。以下是对这两个考点的详细解释和记忆方法: 技术可行性分析 定义: 技术可行性分析是评估项目在现有技术条件和资源下是否能够成功实施。它主要回答…

二分查找3:69. x 的平方根

链接:69. x 的平方根 - 力扣(LeetCode) 题解: 本题本质是二分查找右端点 x的算数平方根一定在1 ~ x 区间内,在1 ~ x区间内查找一个数num,num^2x,但实际上num不一定是整数,所以是n…

oracle大师认证证书有用吗

专业能力的高度认可:OCM 是 Oracle认证的最高级别,是对数据库从业人员技术、知识和操作技能的最高级认可,也是 IT 界顶级认证之一。它表明持证者具备处理关键业务数据库系统和应用的能力,能够解决最困难的技术难题和最复杂的系统故…