印象中第一次接触maven是在2013年,到2017年才真正系统得学习了一下。
Maven本身
解压后maven目录下包含如下内容:
|
|
坐标系统
|
|
依赖范围
maven在编译项目主代码的时候需要一套classpath,编译和执行测试的时候需要另一套classpath,实际运行项目的时候又会使用另一个classpath。依赖范围就是针对这三种classpath的。
依赖范围 | 编译 | 测试 | 运行 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | N | Y | Y | JUnit |
provided | Y | Y | N | servlet-api |
runtime | N | Y | Y | JDBC |
system | Y | Y | N | 本地的,maven之外的类库文件 |
传递性依赖
当依赖产生冲突的时候,按序依据如下规则进行解决:
- 路径最近者优先
- 第一声明者优先
注意:可选依赖不被传递。
仓库
maven的仓库分为本地仓库和远程仓库两种。当编译项目时,优先从本地仓库获取资源,若本地仓库没有,则从远程仓库获取,若远程仓库也没有,则报错。
从仓库解析依赖的机制
- 当依赖的范围是system时,直接从本地文件系统解析构件
- 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功
- 在本地仓库不存在相应构件的情况下,如果依赖的版本是显式的发布版本构件,则遍历所有的远程仓库,发现后,下载并解析使用
- 如果依赖的版本是RELEASES或LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASES或LATEST的真实值,然后基于这个值检查本地仓库和远程仓库,如步骤2和3
- 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该版本检查本地仓库,或者从远程仓库下载
- 如果最后解析得到的构建版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,并使用该非时间戳格式的构件
生命周期与插件
每一个插件里包含很多功能,每一个功能就是一个插件目标
clean生命周期的各个阶段
|
|
default生命周期的各个阶段
|
|
site生命周期的各个阶段
|
|
配置文件
配置文件settings.xml
settings.xml配置文件有两个,一个是全局的,位于M2_HOME/conf/settings.xml,另一个是用户级的,位于USER_HOME/.m2/settings.xml。如果两个配置文件都存在,会合并,若出现冲突,优先采用用户级别的内容。
3.0版本之后,settings.xml文件内的值可以采用${USER_HOME}这样的变量。
配置文件的内容如下:
|
|
配置项mirrors
|
|
配置文件pom.xml
pom.xml是每个项目的配置文件,内容如下:
|
|
配置项parent
|
|
配置项build
|
|
配置项distributionManagement
|
|
配置项repositories
|
|
配置项dependencies
|
|
配置项modules
|
|