Maven存在以下几种依赖范围:
a、compile:编译依赖范围。默认使用该依赖范围。对于编译、测试和运行三种classpath都有效。
b、test:测试依赖范围。只对测试classpath有效。在编译主代码或者运行项目的使用时将无法使用此类依赖。
c、provided:已提供依赖范围。对于编译和测试有效,但是在运行时无效。
d、runtime:运行时依赖范围。对于测试和运行时有效,但是对于编译主代码无效。
e、system:系统依赖范围。与provided依赖完全一致。
f、import:导入依赖范围。
各种依赖关系如下表:
传递性依赖
Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。
假设A依赖B,B依赖C。那A对于B 是第一直接依赖,B对于C是第二直接依赖,A对于C 是传递性依赖。
第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围(蓝色部分)。关系如下表:
依赖调解
假设项目A有两个传递性依赖C,但是路径不同:A->B->C-X(1.0),A->D->X(2.0)。为了避免造成依赖重复,需要选择一个依赖路径。
依赖调解的第一原则是:路径最近者优先。因此X(2.0)会被解析。
如果路径相同,第二原则是:第一声明者优先。在POM中依赖声明的顺序决定了谁会被解析使用,顺序靠前的那个依赖优胜。
归类依赖
所有的依赖有相同的版本或其他属性,可以归类作为一个maven属性,避免修改多个地方。
使用properties元素定义maven元素:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<springframework.version>4.3.3.RELEASE</springframework.version>
</properties>
将所有的相同的version修改如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<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>