【maven坐标】
```
1.groupId: 通常与域名反向一一对应
2.artifactId: 通常使用实际项目名称
3.version: 项目当前版本号
4.packaging:maven项目的打包方式,默认是jar
5.classifier: 定义构建输出的一些附属构件,例如:nexus-indexer-2.0.0.jar是主构件,nexus-indexer-2.0.0-javadoc.jar是附属构建
```
【依赖配置】
```
<dependencies>
<dependency>
<groupId>></groupId>
<artifactId></artifactId>
<version></version>
<type></type>
<scope></scope>
<optional></optional>
<exclusions>
<exclusion></exclusion>
</exclusions>
</dependency>
</dependencies>
```
```
1.groupId、artifactId、version:是依赖的基本坐标
2.type: 依赖类型,对应项目坐标定义的packaging,默认为jar
3.scope: 依赖范围,默认为compile。可选值为(compile,test,provided,runtime,system,import)
| Col1 | Col2 |
| --- | --- |
| compile | 编译依赖范围,对于编译、测试、运行三种classpath都有效 |
| test | 测试依赖范围,只对测试classpath有效,例如Junit |
| provided | 已提供依赖范围,对于编译和测试classpath都有效,但在运行时无效,比如servlet-api,编译和测试项目的时候需要改依赖,但在运行项目的时候,由于容器已经提供,就不需要maven重复的引入一遍 |
| runtime | 运行时依赖范围,对于测试和运行classpath有效,但在编译代码时无效。典型例子是JDBC驱动的实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在项目运行时,才需要实现上述接口的具体JDBC驱动。 |
| system | 系统依赖范围,对于编译和测试classpath都有效,但在运行时无效。使用system范围依赖时,必须通过systemPath元素显示的指定依赖文件的路径。|
| import | 导入依赖范围,该范围的依赖只在dependencyManagement元素下才有效果,使用该范围的依赖通常指向一个pom,作用是将目标pom中的dependencyManagement配置导入并合并到当前pom的dependencyManagement元素中|
```
【传递性依赖】
1. 如果A依赖B,B依赖C,那么C就是A的传递性依赖
【依赖调解】
1. 假如项目A有这样的依赖关系:A->B->C->X(1.0),A->D->X(2.0),X是A的传递性依赖,此时X出现两个,maven会选择路径最近的依赖,也就是路径最近者优先,如果路径长度都一样,那么在pom依赖中,谁最先被声明,谁会被解析使用。也就是说,如果存在依赖冲突:先考虑路径长度,然后再考虑声明顺序
【可选依赖】
1. 假如A->B,B->X(可选)|B->Y(可选),由于X、Y是B的可选依赖,依赖将不会得到传递,换句话说X、Y将不会对A有任何影响。
【排除依赖】
1. exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或多个传递性依赖
【优化依赖】
1. mvn dependency:list(查看项目中已解析依赖)
2. mvn dependency:tree(查看依赖树)
3. mvn dependency:analyze(分析依赖)