Maven拥有数量巨大的构件,对于每一个构件,需要唯一确定,所以Maven引入坐标的概念,坐标为构件引入秩序。
Maven坐标由以下元素确定,它们是groupId、artifactId、version、package及classifier。
<1>groupId:定义当前Maven项目所属实际项目;
<2>artifactId:定义实际项目中的一个模块(Module),默认使用实际项目名作为前缀。例如:spring-core、spring-context、spring-tx等;
<3>version:定义Maven项目当前所处的版本;
<4>package:定义Maven项目的打包方式;
<5>classifier:该元素定义构件输出的附属构件,例如:source、doc等;
其中,groupId、artifactId和version是必须定义的,package默认为jar,classifier是不能直接定义的,只能通过插件构建。
第一、依赖范围
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
如上所示,scope定义依赖的范围。具体的依赖范围有以下几种:
<1>compile:编译依赖范围,默认的依赖范围;
<2>test:测试依赖范围,只对测试有效;
<3>provide:提供依赖范围,对编译和测试有效;
<4>runtime:运行依赖范围,对测试和运行有效;
<5>system:系统依赖范围,同compile。该依赖范围必须通过systemPath显式指出依赖文件路径;
我们对以上几种依赖范围,可以整理如下表格:
依赖范围 | 编译 | 测试 | 运行 | 例如 |
compile | Y | Y | Y | spring |
test | - | Y | - | jUnit |
provide | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
第二、传递性依赖
所谓传递性依赖,就是A依赖B,B依赖C,那么A传递依赖C。如下图:
依赖范围也会影响传递性依赖,其中,竖列为第一依赖,横列为第二依赖,如下图:
| compile | test | provided | runtime |
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provide | - | provided | provided |
runtime | runtime | - | - | runtime |
第三、依赖调解
Maven引入传递依赖后,可以简化和方便依赖声明,同时,为避免依赖造成问题,我们需要知道传递依赖是从哪条依赖路径引入的。我们有2条原则:
1、路径最近优先;
2、第一申明优先;
第四、排除依赖
有时候,我们引入传递依赖后,也可能带来一系列问题。例如:某项目引入第三方依赖,而第三方依赖又依赖于一个SNAPSHOT版本的类库。这时,就应该将此依赖SNAPSHOT版本的依赖去掉。使用exclusions可以去掉传递性依赖。如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
</exclusion>
</exclusions>
</dependency>
第五、依赖归类
有很多关于Spring Framework的依赖,他们来自于同一项目的不同模块,版本号却相同。这时,我们可以将版本号提取出来,放置于properties标签下,以后如果版本号变了,只需要修改一个地方就可以了。如下代码:
<properties>
<springframework-version>3.2.4.RELEASE</springframework-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework-version}</version>
</dependency>
</dependencies>