Maven依赖检查:可抑制与不可抑制依赖的判定及示例
Maven依赖检查:依赖抑制规则与判断方法
一、哪些依赖可以被抑制,哪些不可以?
可抑制的依赖类型
- 未被使用的传递依赖:仅通过其他依赖间接引入,项目代码、测试完全没用到的依赖,比如A依赖B,但项目从未调用B的任何类/方法
- 声明后未使用的直接依赖:手动在pom.xml里声明,但项目全程没用到的依赖
- 测试/提供范围的冗余依赖:如果依赖检查针对生产环境,
test范围的测试工具(如JUnit、Mockito)、provided范围的容器提供依赖(如Servlet API),若确认生产包不需要,可抑制 - 可选依赖(optional):项目未启用该依赖对应的功能模块时,可抑制
不可抑制的依赖类型
- 项目实际使用的直接依赖:代码中明确引用了该依赖的类、方法,比如用了
@RestController就不能抑制spring-boot-starter-web - 被间接使用的传递依赖:未直接声明,但项目代码实际用到了该传递依赖的内容,比如A依赖B,项目代码调用了B的工具类,就不能抑制B
- 核心运行依赖:支撑项目基础功能的依赖,比如Spring Boot的核心starter、数据库驱动,一旦抑制会导致项目启动或运行失败
二、如何确定需要抑制的依赖?无关依赖与相关依赖的区别
判断需抑制依赖的方法
- 用Maven依赖分析工具:执行
mvn dependency:analyze,报告会列出unusedDeclaredDependencies(未使用的声明依赖)和unusedUndeclaredDependencies(未使用的传递依赖),这些是优先考虑抑制的对象 - 代码全局搜索:针对可疑依赖,搜索项目中是否存在该依赖包下的类、方法引用
- 移除测试:临时从pom.xml中移除该依赖,运行编译、单元测试、集成测试,若全程无报错,说明该依赖可抑制
无关依赖与相关依赖的核心区别
- 相关依赖:项目编译、运行、测试过程中实际被调用或依赖的依赖,不管是直接声明还是传递引入,是项目功能正常运转的必要条件
- 无关依赖:仅被引入但未被任何代码、流程使用的依赖,属于冗余内容,不会影响项目功能,反而会增加包体积、引入潜在冲突
示例说明
假设项目pom.xml中有如下依赖:
<dependencies> <!-- 核心Web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 手动声明的工具类依赖 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> </dependency> </dependencies>
- 相关依赖:spring-boot-starter-web是核心,项目用了
@RestController、GetMapping等注解,属于必须依赖;如果代码中使用了Guava的Lists.newArrayList(),那Guava也是相关依赖 - 无关依赖:如果项目代码从未调用Guava的任何类/方法,那Guava就是无关依赖;另外spring-boot-starter-web会传递引入
tomcat-embed-el,若项目切换为Jetty容器,tomcat-embed-el就变成无关依赖,可被抑制
内容的提问来源于stack exchange,提问作者ClvrBug
相关产品推荐
相关产品推荐

