mvn dependency:analyze 可识别未被引用的编译范围依赖,但需先编译、结合配置(如 ignorenoncompile、ignoreddependencies)并人工验证后才能安全移除冗余项。

使用 mvn dependency:analyze 是识别项目中未被实际引用的依赖(即“冗余依赖”)的有效方式,但它默认行为较保守——只报告**编译范围(compile)下未被任何类引用、且未被其他依赖传递引入**的依赖。要真正找出可安全移除的冗余项,需结合正确配置和人工验证。
确保项目能正常编译并有足够覆盖率
该插件分析的是已编译的 class 文件中的字节码引用,因此:
- 必须先执行
mvn compile(或直接运行mvn dependency:analyze,它会自动触发编译) - 测试代码中的引用默认不计入(除非启用
ignoreNonCompile为 false),所以单元测试里用到的依赖不会被误报为“未使用” - 若项目逻辑分支多、但测试覆盖低,某些依赖可能仅在特定运行时路径中被加载(如反射、SPI、配置驱动),此时插件无法发现,会误判为冗余
运行基础分析命令并理解输出含义
在项目根目录执行:
mvn dependency:analyze
关键输出包括两部分:
-
Used undeclared dependencies:已在代码中使用,但未在
pom.xml中声明 → 需补全依赖(否则构建可能失败) -
Unused declared dependencies:在
pom.xml中声明了,但编译后没发现任何 class 引用它 → 这就是潜在的冗余依赖
注意:插件默认忽略 test、provided、runtime 范围的依赖分析,所以像 slf4j-api(常为 compile)或 spring-boot-starter-test(test)不会出现在 unused 列表中。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
增强分析精度的常用配置
在 pom.xml 的 pluginManagement 或直接配置插件时,可添加以下参数提升实用性:
-
<failonwarning>false</failonwarning>:避免因发现 unused 依赖而中断构建(默认 true) -
<ignorenoncompile>false</ignorenoncompile>:把 test 范围的引用也纳入分析(适合想清理测试依赖时) -
<ignoreddependencies></ignoreddependencies>:显式排除已知必要但静态分析无法捕获的依赖(如通过Class.forName()加载的 JDBC 驱动) -
<ignoreduseddeclareddependencies></ignoreduseddeclareddependencies>:跳过某些已声明且被使用、但你不想让插件检查的依赖(较少用)
示例片段:
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-dependency-plugin</artifactid><version>3.6.1</version><configuration><failonwarning>false</failonwarning><ignorenoncompile>true</ignorenoncompile><ignoreddependencies><ignoreddependency>com.h2database:h2</ignoreddependency><ignoreddependency>org.springframework.boot:spring-boot-starter-web</ignoreddependency></ignoreddependencies></configuration></plugin>
人工确认 + 安全移除流程
插件结果只是线索,不能直接删。建议按以下步骤操作:
- 从
Unused declared dependencies列表中挑出一个依赖(优先选 scope=compile、非 spring-boot-starter 类的) - 在
pom.xml中注释或删除该依赖项 - 运行
mvn compile和mvn test,确认无编译错误、测试全部通过 - 如项目含集成测试或手动验证环节,再检查对应功能是否正常(例如删了
commons-lang3后,是否仍有StringUtils调用未被发现) - 确认无误后再提交;若有问题,还原并标记为“动态加载/配置驱动”,加入
ignoredDependencies
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










