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。如下图:

owasp maven坐标_owasp maven坐标

依赖范围也会影响传递性依赖,其中,竖列为第一依赖,横列为第二依赖,如下图:

 

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>