mvn dependency:analyze 可识别编译范围中未被字节码引用的冗余依赖,但需先编译、结合忽略配置(如 ignorenoncompile)并人工验证反射/spi等动态使用场景后才能安全移除。

在 Maven 项目中,dependency:analyze 是一个非常实用的插件目标,用于检测 pom.xml 中声明了但实际未被代码引用的依赖(即“未使用依赖”),帮助精简依赖、减少包体积和潜在冲突。
确保 maven-dependency-plugin 已启用
Maven 自带 maven-dependency-plugin,通常无需额外配置即可直接使用。但若遇到命令不识别,可在 pom.xml 的 <build><plugins></plugins></build> 中显式声明(推荐 3.6.0+ 版本):
<plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-dependency-plugin</artifactid><version>3.6.0</version></plugin>
运行 dependency:analyze 检测未使用依赖
在项目根目录执行以下命令:
mvn dependency:analyze
默认情况下,它会分析 compile 和 runtime 范围的依赖,并输出两类信息:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Used undeclared dependencies:代码中用了,但
pom.xml没声明(需补上) -
Unused declared dependencies:
pom.xml声明了,但字节码中没被引用(可考虑移除)
⚠️ 注意:该分析基于编译后的 class 文件(target/classes)和依赖 jar 中的 class 引用关系,不扫描注解、反射、SPI 或字符串字面量中的类名,因此结果是“静态分析”,有一定局限性。
让分析更严格或适配常见场景
可通过参数调整行为:
-
-DignoreNonCompile=true:忽略test、provided等非 compile 范围依赖(默认只分析 compile/runtime) -
-DfailOnWarning=true:发现未使用依赖时让构建失败(适合 CI 流水线卡点) -
-DignoredUnusedDeclaredDependencies=org.slf4j:slf4j-api,com.google.guava:guava:指定某些依赖即使未用也不报,适用于 SPI 接口、框架约定依赖等 - 结合
mvn compile dependency:analyze确保 class 文件最新,避免误报
谨慎处理“未使用”结果
不是所有标为 “unused” 的依赖都可直接删除:
- 日志门面(如 slf4j-api)、JDBC 驱动、JSON 库(如 jackson-core)常通过反射或服务加载机制使用,静态分析无法捕获
- Spring Boot starter 依赖可能间接触发自动配置,删掉会导致启动失败
- 测试依赖(scope=test)默认不参与分析;如需检查,需手动设置
includeTestCompileScopes=true
建议先人工核对调用链(IDE 查找 usages、反编译确认)、运行完整测试,再决定是否移除。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










