【Java开发】简化Maven项目依赖:优雅去除未使用Jar包

news/2025/1/21 22:00:19/文章来源:https://www.cnblogs.com/o-O-oO/p/18684535

一、为什么要做这件事?

自从我踏入职场,便历经了技术革新的数次浪潮。从最初的.Net Framework、Winform、WPF,到Asp.Net MVC、Asp.Net MVC WebApi,再到Asp.Net Core 2.x的广泛应用,我始终深耕于.net领域。

然而,随着技术的不断演进,我逐渐发现.net相关的工作机会变得稀少。在出租屋内,我自学了一个月的前端技术,竟意外地获得了进入某知名企业的机会,从而开启了全新的前端探索之旅。如今,我又迈入了运维的新领域。回顾过往,每一步都充满了挑战与不易。

目前,我的主要工作是为客户提供私有化项目的售后技术支持。在日常工作中,项目经常会因为客户方的漏洞扫描而暴露出一些jar包的漏洞问题,需要进行紧急修复或升级。

二、怎么做?

对于Maven项目,处理起来相对简单。Maven自身提供了一款强大的依赖分析工具,只需简单的命令输入即可轻松实现。在IntelliJ IDEA中,你可以切换到Terminal窗口,或者在命令行中导航至项目根目录,执行以下命令:

mvn dependency:analyze

随后,仔细查看控制台输出的日志信息,特别关注以下几个部分:

[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ xxxproject ---
[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-beans:jar:4.0.0.RELEASE:compile
[WARNING]    org.springframework:spring-context:jar:4.0.0.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING]    com.alibaba:dubbo:jar:2.5.3:compile
[WARNING]    com.baidu.disconf:disconf-client:jar:2.6.32:compile
[WARNING]    org.mybatis:mybatis:jar:3.2.7:compile
[WARNING]    org.mybatis:mybatis-spring:jar:1.2.2:compile
[WARNING]    mysql:mysql-connector-java:jar:5.1.41:compile
[WARNING]    com.alibaba:druid:jar:1.0.9:compile
[WARNING]    com.github.sgroschupf:zkclient:jar:0.1:compile
[WARNING]    org.apache.zookeeper:zookeeper:jar:3.4.6:compile
[WARNING]    org.springframework:spring-jdbc:jar:4.0.0.RELEASE:compile
[WARNING]    org.slf4j:log4j-over-slf4j:jar:1.7.5:compile
[WARNING]    org.slf4j:jcl-over-slf4j:jar:1.7.5:runtime
[WARNING]    ch.qos.logback:logback-classic:jar:1.0.13:compile   

接下来,我们将详细解读日志中
Used undeclared dependencies foundUnused declared dependencies found

Used undeclared dependencies found

这一部分指的是项目中实际使用了某个依赖包,但并未在pom.xml文件中显式声明。这些依赖包可能是通过其他依赖间接引入的。

例如,假设你的项目在pom.xml中声明了对A.jar的依赖,但未声明对B.jar的依赖。而A.jar的依赖树中又包含了对B.jar的依赖。
通过运行mvn dependency:analyze命令,如果输出如下警告:

mvn dependency:analyze

出现


[WARNING] Used undeclared dependencies found: B.jar

这意味着你的项目代码中实际上使用了B.jar中的类或接口。在这种情况下,你应该将B.jar添加到项目的pom.xml文件中,以确保依赖关系的正确声明。

Unused declared dependencies found

这一部分则是指你在项目的pom.xml文件中声明了某个依赖包,但在实际的项目代码中并未使用到它。这些依赖包可能是不必要的,可以考虑从pom.xml中移除。

然而,在删除这些依赖之前,请务必注意以下几点:

  • “未使用”的定义仅限于main/java和test源代码目录,不包括配置文件或其他可能的扩展点。

  • 在删除依赖之前,务必备份pom.xml文件,以防万一误删重要依赖导致的问题。

  • Maven的依赖分析工具并非万能,有时可能会产生误报。因此,在删除任何依赖后,都应进行充分的测试以验证项目的稳定性。

三、什么时候做?

新项目初始化时: 在创建新项目并添加依赖时,务必谨慎选择所需的jar包,避免盲目复制旧项目的依赖配置,从而减少后续不必要的清理工作。

功能代码重构时: 在进行功能代码的重构过程中,可以顺便进行一次依赖项的审查与清理。由于后续还有自测和提测等环节,即使有误删的情况也能及时发现并修复。

四、有什么风险要注意的?

结果仅供参考: 依赖分析工具的结果并非绝对准确,可能存在误判的情况。例如,某些工具可能无法识别某些特殊的使用场景(如注解处理器等)。因此,在删除依赖后,请务必进行全面的测试以验证项目的正确性。

老项目接手时的注意事项: 当接手一个遗留的老项目时,可能会发现大量的依赖问题。然而,在初次接手时并不建议立即进行此类操作。由于对项目的不熟悉,贸然删除依赖可能会引发一系列难以定位的问题,从而浪费大量的时间和精力。建议在充分了解项目结构和业务逻辑后再进行此类优化工作。

五、补充一个快捷方法

使用 IntelliJ IDEA 自带的 maven 工具

使用方法

打开IntelliJ IDEA,导航至项目的pom.xml文件所在目录。

右键点击pom.xml文件,选择“Maven”菜单中的“Analyze Dependencies”选项。

IntelliJ IDEA将自动分析项目的依赖关系,并在弹出的窗口中展示分析结果。你可以根据分析结果进行相应的操作,如添加缺失的依赖或删除未使用的依赖等。

通过以上步骤,你可以在IntelliJ IDEA中轻松管理项目的依赖关系,确保项目的稳定性和可维护性。

作者:bug猎人

来源:juejin.cn/post/7384636970033905714

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

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

相关文章

《操作系统真相还原》实验记录2.7——生产者与消费者问题

本节实现内容如下: ① 环形缓存区的结构体创建; ② 环形键盘缓冲区的创建; ③ 生产者消费者问题剖析;一、生产者与消费者问题简述我们知道,在计算机中可以并行多个线程,当它们之间相互合作时,必然会存在共享资源的问题,这是通过“线程同步”来解决的,而诠释“线程同步…

CTF-web第一步!

本次的题比较简单,适合我这种入门学者。CTF菜狗杯的web2 c0me_t0_s1gn。进入靶场打开F12会得到前一半。在控制台复制函数give_flag()会得到另一半。 这样就完成了。

P1183 多边形的面积-向量的用法

原题链接 https://www.luogu.com.cn/problem/P1183 题目描述 给出一个没有缺口的简单多边形,它的边是垂直或者水平的,要求计算多边形的面积。 xOy 的笛卡尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数,因此多边形…

蓄水池漂浮物识别摄像机

蓄水池漂浮物识别摄像机具有高效的图像识别功能。通过高清晰度的摄像头捕捉到蓄水池表面的图像,并通过人工智能技术进行快速准确的漂浮物识别。这种摄像机可以自动检测出池面上的漂浮物,并生成相应报警信息。该摄像机支持多种智能算法分析,并通过智能算法对数据进行综合分析…

行为智能识别摄像机

行为智能识别摄像机通过结合人工智能技术和监控技术,实现了对各种行为动作的自动识别和分析,在提高安全性、减少事故发生率方面具有重要意义。随着科技的不断进步和应用范围的扩大,相信这种先进设备将会在更多领域得到广泛应用。行为智能识别摄像机是一种结合了人工智能技术…

AI人数智能统计监测摄像头

AI人数智能统计监测摄像头具有高效的图像识别功能。通过先进的图像处理算法,可以快速准确地识别出场景中的人群,并进行实时统计。无论是密集的人流场所还是较为稀疏的区域,这种摄像头都能够精准地进行人数统计,为管理者提供重要参考信息。AI人数智能统计监测摄像头具有实时…

Android 中的卡顿丢帧原因概述 - 方法论

Android 手机使用中的卡顿问题 , 一般来说手机厂商和 App 开发商都会非常重视 , 所以不管是手机厂商还是 App 开发者 , 都会对卡顿问题非常重视 , 内部一般也会有专门的基础组或者优化组来进行优化 . 目前市面上有一些非常棒的第三方性能监控工具 , 比如腾讯的 Matrix ; 手机厂…

JavaScript的常用库 —— jQuery

利用JS去操控HTML和CSS,常用库之jQuery ฅʕ•̫͡•ʔฅjQuery用来更加方便地去控制前端的HTML标签和CSS属性。使用方式:1. 直接在<head>元素中添加: <script src="https://cdn.acwing.com/static/jquery/js/jquery-3.3.1.min.js"></script> 2…

2 FreeRTOS移植

2 FreeRTOS移植 2.1 源码基本认识获取源码。官网地址:FreeRTOS™ - FreeRTOS™ 源码内文件结构:1) FreeRTOS文件夹结构2) Source文件夹结构3) portable文件夹结构 portable文件夹里面有编译器、内核环境可以选择。其中keil是我们使用的编译器类型,但Keil文件夹里只有一个…

22蓝帽初赛

参考wp:http://mp.weixin.qq.com/s?__biz=Mzk0MTQzNjIyNg==&mid=2247487196&idx=1&sn=48094c5a78749b45c3598ed51a5df0e3&chksm=c3901b8acd56bc2d1d06b323e9d1e86b90048a35dc3b3301b60bb1f488a764f0b52ebc490113&mpshare=1&scene=23&srcid=01218…

【Azure APIM】APIM服务配置网络之后出现3443端口不通,Management Endpoint不健康状态

如果没有关联的网络安全组,则阻止所有网络流量通过子网和网络接口。问题描述 APIM服务在配置网络之后,查看网络状态发现Management Endpoint是不健康状态, 提示无法连接到3443端口。错误消息: Failed to connect to management endpoint at xxxxxxxx.management.azure-api.…

【模拟电子技术】11-放大电路的性能指标

【模拟电子技术】11-放大电路的性能指标通过输入,输出侧的各一个电容来到输入纯交流,输出纯交流Ui变化引起UBE变化,UBE变化引起IB变化,IB变化引起IC变化,IC变化引起UCE变化,UCE变化引起Uo变化关于输入,输出等效电路的问题: 输入电阻Ri越大越好还是越小越好?当然是越大…