直接用 mvn dependency:analyze 就能识别出已声明但实际未使用的依赖,这是最常用也最有效的起点;它基于字节码分析输出 unused declared dependencies(需验证后清理)和 used undeclared dependencies(需评估是否补声明),但无法识别反射、spi、配置文件等间接引用,须配合编译启动验证。

直接用 mvn dependency:analyze 就能识别出已声明但实际未使用的依赖,这是最常用也最有效的起点。
核心命令与输出解读
在项目根目录执行:
mvn dependency:analyze
命令运行后,控制台会明确分两类提示:
- Unused declared dependencies found:列出 pom.xml 中声明了、但当前模块字节码里没调用到的依赖——这就是你要清理的“虚浮依赖”主体
- Used undeclared dependencies found:说明代码里用了某个类,但它没被你显式声明(而是靠传递依赖带进来的),这类需评估是否要补声明,避免版本漂移风险
关键使用提醒
这个分析基于编译后的 class 文件,不是源码,所以有天然局限:
- 反射调用(如
Class.forName("xxx.Service"))、SPI 配置(META-INF/services/)、XML 或 YAML 中硬编码的类名,工具无法感知,可能误判为“未使用” - Lombok 注解处理器、Spring Boot 的自动配置类(
@ConditionalOnClass)、测试专用依赖(scope=test)也容易被漏检或错标 - 建议配合
mvn clean compile+ 启动验证:注释掉一个疑似虚浮依赖 → 编译通过 → 启动应用 → 走一遍核心流程 → 无 ClassNotFoundError 或 NoClassDefFoundError 才可删除
增强分析的实用技巧
单靠默认输出不够细?可以组合参数提升定位效率:
- 加
-DfailOnError=false避免构建中断,适合批量检查:mvn dependency:analyze -DfailOnError=false - 用
mvn dependency:tree -Dverbose查看完整依赖树,重点关注标有omitted for conflict或重复出现的包,它们常是虚浮依赖的源头 - 导出为文件便于比对:
mvn dependency:tree -DoutputFile=tree.txt -Dverbose,再用文本工具搜索可疑 groupId
替代方案补充(按需选用)
如果 analyze 结果不准或项目特别复杂,可交叉验证:
- DepClean 插件:专为清理设计,分析更细致,支持 Maven 多模块项目,报告更结构化
- IDE 内置分析:IntelliJ IDEA 的 Analyze → Analyze Dependencies 可高亮灰色依赖项,实时性好,适合日常开发中随手排查
-
jdeps:JDK 自带工具,适合分析打包后的 jar,命令如
jdeps --multi-release 17 target/your-app.jar,侧重运行时真实引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











