Maven中的主要坐标元素
groupId:
定义当前Maven项目隶属的实际项目(Maven项目和实际项目不一定一一对应,一个实际项目往往被划分为多个模块),groupId不应该对应项目隶属的组织或公司
artifactId:
该元素定义实际项目中的一个Maven项目(模块)【一般是使用实际项目名称作为artifactId的前缀】
version:
该元素定义Maven项目当前所处的版本
packaging:
该元素定义Maven项目的打包方式(打包方式与所生成的构建的拓展名对应 )
classifier:
该元素帮助定义构建输出的一些附属构建(例如Java文档和源代码,javadoc和sources就是这两个附属构建的classifier)
依赖的配置
一般的依赖包括如下的一些元素:
<project>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>...</type>
<scope>...</scope>
<optional>...</optional>
<exclusions>
<exclusion>
...
</exclusion>
...
</exclusions>
</dependency>
</dependencies>
...
</project>
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖
每个依赖包含的元素:
groupId、artifactId、version:
依赖的基本坐标(Maven根据基本坐标才能找到需要的依赖)
type:
依赖的类型,对应于项目坐标定义的packaging,大部分情况下不用声明,默认为jar
scope:
依赖的范围(用来控制依赖和三种classpath【编译classpath、测试classpath、运行classpath】的关系)
Maven有以下几种依赖:
compile:编译依赖范围,如果没指定,默认使用该范围【使用此依赖范围的Maven依赖,在编译、测试、运行三种classpath都有效】
test:测试依赖范围,只有测试classpath有效
provided:已提供依赖范围,编译和测试classpath有效
runtime:运行时依赖范围,测试和运行classpath有效
system:系统依赖范围,编译和测试classpath有效,使用该依赖必须通过systemPath元素显示地指定依赖文件的路径【与仓库无关,通常由本机提供,谨慎使用】
import:导入依赖范围,该依赖范围不会对三种classpath产生实际的影响
依赖范围与classpath的关系:
依赖范围(scope) | 编译classpath | 测试classpath | 运行时classpath |
---|---|---|---|
compile | Y | Y | Y |
test | - | Y | - |
provided | Y | Y | - |
runtime | - | Y | Y |
system | Y | Y | - |
optional:
以来标记是否可选
例如:A->B; B->X(可选), B->Y(可选),那么X,Y这2个可选依赖不会被传递
Tips:在理想情况下,不应该使用可选依赖,因为在面向对象设计中,有一个单一职责性原则,一个类只有一个职责
exclusions:
用来排除传递性依赖,可以包含一个或者多个exclusion子元素
传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理,但是有些时候这种特性也会带来问题。
依赖范围影响传递性依赖
—— | compile | test | provided | runtime |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
【左边一列表示第一直接依赖,最上面一行表示第二直接依赖】
传递依赖的2个原则:
- 路径最近者优先
- 第一声明者优先