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 就能唯一定位依赖图中的某个依赖。

posted @ 2017-07-24 15:48  MicroCat  阅读(362)  评论(0编辑  收藏  举报