Maven--排除依赖
传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理,但是有些时候这种特性也会带来问题。
例如,当前项目有一个第三方依赖,而这个第三方的依赖由于某些原因依赖了另外一个类库的 SNAPSHOT 版本,那么这个 SNAPSHOT 就会成为当前项目的传递性依赖,而 SNAPSHOT 的不稳定性会直接影响到当前的项目。这时就需要排除掉该 SNAPSHOT,并且在当前项目中声明该类库的某个正式发布的版本。
还有一些情况,你可能也想要替换某个传递性依赖,比如 Sun JTA API,Hibernate 依赖于这个 JAR,但是由于版权的因素,该类库不再中央仓库中,而 Apache Geronimo 项目有一个对应的实现。这时你就可以排除 Sun JTA API,再声明 Geronimo 的 JTA API 实现。
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.juvenxu.mvnbook</groupId> 6 <artifactId>project-a</artifactId> 7 <version>1.0.0</version> 8 9 <dependencies> 10 <dependency> 11 <groupId>com.juvenxu.mvnbook</groupId> 12 <artifactId>project-b</artifactId> 13 <version>1.0.0</version> 14 <exclusions> 15 <exclusion> 16 <groupId>com.juvenxu.mvnbook</groupId> 17 <artifactId>project-c</artifactId> 18 </exclusion> 19 </exclusions> 20 </dependency> 21 <dependency> 22 <groupId>com.juvenxu.mvnbook</groupId> 23 <artifactId>project-c</artifactId> 24 <version>1.0.0</version> 25 </dependency> 26 </dependencies> 27 28 </project>
上述代码中,项目 A 依赖于项目 B,但是由于一些原因,不想引入传递性依赖 C,而是自己显示地声明对于项目 C 1.0.0 版本的依赖。代码中使用 <exclusions> 元素声明排除依赖, <exclusions> 可以包含一个或者多个 <exclusion> 子元素,因此可以排除一个或者多个传递性依赖。
需要注意的是,声明 <exclusion> 的时候只需要 groupId 和 artifactId,而不需要 version 元素,这是因为只需要 groupId 和 artifactId 就能唯一定位依赖图中的某个依赖。