1、坐标
Maven坐标为各个构件建立了秩序,任何一个构件都必须明确自己的坐标,一个maven坐标是由一些元素确定的
<groupId>com.alivn.account</groupId>
<artifactId>account-email</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
groupId:定义为maven项目隶属的实际项目,可以相当于为一个项目的*。 比如 支付系统
artifactId:maven项目的一个子项目 比如 支付系统下的dao模块
version:当前项目的版本号
packaging:定义该maven项目的打包方式 默认jar
classifier:帮助构建输出一些附属属性,比如account-email.1.0.jar, 借助插件生成account-email.1.0-doc.jar(apiw文档)
2、依赖
每个project根元素下,可以包含节点<dependencies>节点。里面包含了若干依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
<type>jar</type>
<optional>true</optional>
<exclusions>
<exclusion>
<groupId>${dependencygroupId}</groupId>
<artifactId>${dependencyartifactId}</artifactId>
</exclusion>
</exclusions>
</dependency>
groupId、artifactId、version是一个引入一个依赖必不可少的元素。
scope:依赖的作用范围 test表示 只在test的代码里面的生效
type:依赖的类型 对应packaging
optional:依赖是否可选。
exclusions:排除依赖,当第二依赖里面依赖了一个不稳定的快照版本的jar时候,存在潜在危险,所以我们应该排除第二依赖里面的那个不稳定版本的依赖,在pom中引用为直接依赖。
3、依赖范围
maven在编译 测试 和运行时会使用三个不同的classpath,会根据以依赖范围处理不同的内容,比如主编译时,不会加入scope为test范围的代码,因为它的依赖范围是test
有以下几种依赖范围
compile:编译依赖范围 默认值 对编译 测试 运行 三种 classpath都有效
test:测试依赖范围 只对测试classpath有效
provided:以提供以来范围,仅对编译和测试有效,运行无效,比如servlet-*jar,运行时 框架有tomcat提供jar
runtime:对测试和运行有效 但编译无效 如JDBC驱动,只在运行的时候决定使用哪个数据库的驱动
system:系统依赖范围,和provided范围一致,但必须通过systemPath显示指定依赖文件
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
<scope>system</scope>
<systemPath>${home}/lib/mysql.rt</systemPath>
</dependency>
4、传递性依赖
A->B ,B->C=》A->C
如果A依赖于B B依赖于C 那么A依赖于C B为A 的第一直接依赖 C为B 的第二直接依赖。
根据scope的依赖范围不同 可以将C于A 的依赖范围 也会有变化 ,具体变化为以下表格 蓝色字体为第一直接依赖 红色字体为第二直接依赖
依赖范围 | compile | test | provided | runtime |
compile | compile | —— | —— | runtime |
test | test | —— | —— | test |
provided | provided | —— | provided | provided |
runtime | runtime | —— | —— | runtime |
5、依赖调解
maven传递依赖为我们带来了很多的方便,但是如果 A->B->C(2.0) A->D->C(1.0) 这个时候会解析 哪个版本的C
maven有两条规则:(当第一条规则 不生效时 使用第二条规则)
1、路径最近者优先 实例中 都是两步 距离是相同的 如果不同则去最近者
2、第一声明者优先 程序中 看B 和C 哪个jar里面的类先被使用,然后解析先被使用的jar的那条线路上的c
6、查看依赖的命令
mvn dependency:list(显示所有已解析的依赖)
mvn dependency:tree(显示依赖树)
mvn dependency:analyze(分析当前项目的依赖)