【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(分析依赖)