依赖配置
前面几篇文章中都有提到依赖构建的配置,但是没有详细说明,并且只给出了最基本的配置,还有一些常用的配置项没有体现,这里面将详细说明依赖配置各选项的意义及配置方法,如下:
<dependencies>
<span style="white-space:pre"> </span><dependency>
<span style="white-space:pre"> </span><groupId>junit</groupId>
<span style="white-space:pre"> </span><artifactId>junit</artifactId>
<span style="white-space:pre"> </span><version>4.12</version>
<span style="white-space:pre"> </span><type></type>
<span style="white-space:pre"> </span><scope>test</scope>
<span style="white-space:pre"> </span><classifier></classifier>
<span style="white-space:pre"> </span><optional></optional>
<span style="white-space:pre"> </span><exclusions>
<span style="white-space:pre"> </span><exclusion>
<span style="white-space:pre"> </span></exclusion>
<span style="white-space:pre"> </span></exclusions>
<span style="white-space:pre"> </span></dependency>
</dependencies>
说明:
- groupip/artifactid/version/type/classifier是构件的坐标五元素,其中type对应packageing
- scope配置依赖的范围
- optional配置此依赖是否为可选
- exclusions用来排除传递性依赖
依赖范围
maven在编译项目主代码的时候使用一套classpath,编译及执行测试代码时使用另外一套classpath,而项目在运行的时候又会使用第三套classpath,而依赖范围就是用来控制依赖与这三种classpath的关系的。如下
说明
- compile/test/runtime三个比较好理解,对应编译、测试、运行
- provided表示运行过程中依赖已经默认提供,而编译和测试的时候才需要,例如servlet-api,项目运行时容器已经提供,所以不需要在运行阶段引入此依赖。
- system表示系统依赖,例如系统中安装的jdk的相关jar包,此依赖与本机系统绑定,会造成不可移植性,所以需要慎用。
- maven2.0.9及后续版本中还有一个叫做导入(import)的依赖范围,因为在继承中使用,所以在学习继承特性的时候再详细说明。
传递性依赖
1,概念
假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖。这样A项目中可以不用配置对C的依赖,maven会自动处理这种传递性依赖。极大的简化了项目依赖的管理。
2,传递性依赖对依赖范围的影响
假设最左边一列表示第一依赖范围,第上面一行表示第二依赖依赖范围,交叉位置表示传递性依赖范围,其关系如下图
规律:
- 第二直接依赖为runtime,第一依赖为compile的时候,传递性依赖范围为runtime,这个特殊一些
- 第二直接依赖为compile和runtime的时候,传递性依赖范围与第一直接依赖范围一致(除了第一条中特殊的情况)
- 第二直接依赖为test的不会传递
- 第二直接依赖为provided的只传递第一直接依赖也是provided的依赖,传递性依赖范围也是provided
3,可选依赖对传递性依赖的影响
可选依赖就是对应<optional/>标签
可选依赖不会传递,所以当A依赖于B,B依赖于C(C是可选依赖时),当A也需要依赖C的话就需要在A项目中显示的配置对C的依赖。
可选依赖主要用于这种场景:B实现了两个特性,其中一个特性依赖于C,第二个特性依赖于D,而这两个特性是互斥的,用户不可能同时使用两个特性。
(个人觉得这个特性使用的很少,因为项目启动阶段基本上选型已经OK,而在一个项目中实现两个互斥的特性总觉得很奇怪。)
4,排除依赖
排除依赖可以通过<exclusions/>来实现,当A依赖于B,而B依赖于C(版本为v1),由于其他原因项目A中不想使用v1版本的C,而想使用v2版本的C时,就可以使用排除依赖这个特性了。例如:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3.RC2</version>
</dependency>
</dependencies>
junit-4.12依赖于hamcrest-core-1.3版本,这里改成了依赖hamcrest-core-1.3.RC2版本了(只是为了说明这种特性的配置方法,实际项目中不一定会使用)。
5,依赖相关的几个命令
在命令行中可以执行以下几个命令来查看依赖相关信息
mvn dependency:list
mvn dependency:tree
mvn dependency:analyze
附:
《maven实战》