一.坐标详解
先来一下段maven依赖:
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
<type>jar</type>
<scope>compile</scope>
groupId:定义当前Maven 项目隶属的实际项目。
artifactId:该元素定义实际项目中的一个Maven 项目(模块),推荐的做法是使用实际项目名称作为artifactId 的前缀。
version:该元素定义Maven 项目当前所处的版本。
type:包的后缀名。
scop:在哪里用到这个包,也就是作用域。compile表示在整个工程都会用到,默认就是这个。test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
二.排除依赖
大家都知道,在我们添加一个jar包之后,然后以maven install运行时,会将所有与之依赖的包都导入项目中,如果有些包我们不需要甚至对我们的项目有影响就需要解除依赖。如下:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-a</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
<exclusions>
<exclusion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-c</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-c</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
上述代码中,项目A 依赖于项目B,但是由于一些原因,不想引入传递性依赖C,而是自己显式地声明对于项目C 1.1.0 版本的依赖。代码中使用exclusions 元素声明排除依赖,exclusions 可以包含一个或者多个exclusion 子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusion 的时候只需要groupId 和artifactId,而不需version元素,这是因为只需要groupId 和artifactId 就能唯一定位依赖图中的某个依赖,换句话说,Maven 解析后的依赖中,不可能出现groupId 和artifactId 相同,但是version不同的两个依赖。
三.依赖调解
第一原则是:路径最近者优先。如:A->B->C->X(1.0)、A->D->X(2.0),会依赖2.0
第二原则是:第一声明者优先。A->B->Y(1.0)、A->C->Y(2.0),若B在C之前声明,会依赖1.0
第三原则是:可选依赖不被传递。例如一个工程A实现了支持多种数据库,此时该工程的jar依赖要添加依赖范围<optional>true</optional>
,当另一个工程B依赖这个工程时就需要显示的依赖是哪种数据库驱动。那么就可以让A工程专注于对接各种数据库的开发,而工程B根据实际情况来选择使用哪种数据库。例如:
工程A:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-a</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.4-701.jdbc3</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
工程B:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>project-a</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
</project>
四.归类依赖
方便版本号统一替换,例如:
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependencies>