⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 juejin.cn/post/7384636970033905714 「bug猎人」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

一、为什么要做这件事?

自从我踏入职场,便历经了技术革新的数次浪潮。从最初的.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 found 和 Unused 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中轻松管理项目的依赖关系,确保项目的稳定性和可维护性。

文章目录
  1. 1. 一、为什么要做这件事?
  2. 2. 二、怎么做?
    1. 2.1. Used undeclared dependencies found
    2. 2.2. Unused declared dependencies found
  3. 3. 三、什么时候做?
  4. 4. 四、有什么风险要注意的?
  5. 5. 五、补充一个快捷方法
    1. 5.1. 使用方法