依赖排除与排除策略
exclusions 控制传递依赖,排除不需要或冲突的间接依赖。
exclusions 语法
基本结构
XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
exclusion 元素
| 元素 | 说明 |
|---|---|
| groupId | 排除依赖的组织标识 |
| artifactId | 排除依赖的项目名称 |
exclusion 不需要 version,排除所有版本。
排除场景
场景1:替换日志实现
XML
<!-- Spring 默认使用 commons-logging -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
<exclusions>
<!-- 排除 commons-logging -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用 slf4j 替代 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.36</version>
</dependency>
场景2:排除冲突依赖
XML
<dependency>
<groupId>com.example</groupId>
<artifactId>module-a</artifactId>
<version>1.0.0</version>
<exclusions>
<!-- 排除冲突的 log4j -->
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
场景3:排除多余依赖
XML
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.0</version>
<exclusions>
<!-- 排除不需要的 JPA API -->
<exclusion>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
</exclusion>
</exclusions>
</dependency>
多个排除
XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
</exclusions>
</dependency>
全局排除策略
在 dependencyManagement 中排除
XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
排除 vs 可选依赖
| 方式 | 说明 |
|---|---|
| exclusions | 接收方主动排除传递依赖 |
| optional=true | 提供方声明不传递 |
optional 示例
XML
<!-- 提供方声明可选,不传递 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>optional-lib</artifactId>
<version>1.0.0</version>
<optional>true</optional>
</dependency>
验证排除效果
Bash
mvn dependency:tree
检查目标依赖是否已从树中消失。
排除注意事项
注意点
| 注意 | 说明 |
|---|---|
| 不指定版本 | 排除所有版本 |
| 可能导致缺失 | 排除后需手动引入替代 |
| 作用范围 | 仅对当前依赖声明有效 |
排除后补充替代
XML
<!-- 排除原依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 手动添加替代依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.36</version>
</dependency>
要点总结
- exclusions 排除传递依赖,不指定版本
- 排除后可能需要手动引入替代依赖
- 常用于替换日志实现、排除冲突库
- optional=true 在提供方声明不传递
- 使用 dependency:tree 验证排除效果
📝 发现内容有误?点击此处直接编辑