maven pom.xml 依赖解析说明文档
·
maven解析说明文档
maven确定一个依赖:
- 坐标:maven通过groupId、artifactId、version三个变量来唯一确定一个具体的依赖(俗称GAV)
关于依赖名、版本、作用域(解析dependencies)
- 依赖名为groupId:artifactId
- groupId : 解析
<groupId>xxx</groupId>- project级别的groupId可能来源于
<parent><groupId>xxx</groupId></parent> - 若含有${xxx},查询properties,当前pom没有,则查询父pom
- project级别的groupId可能来源于
- artifactId : 解析
<artifactId>xxx</artifactId>- 若含有${xxx},查询properties,当前pom没有,则查询父pom
- 依赖版本为version : 解析
<version>xxx</version>
- 在当前pom中:
- 无verstion标签,查询dependencyManagement
- 有version标签,含有${xxx},查询properties
- scope同上(一般不会在scope中定义${xxx})
- 查询父pom(若当前pom version或scope无法获取)
- 无verstion标签,查询父pom的dependencyManagement
- 有version标签,含有${xxx},查询pom的properties
- scope同上(一般不会在scope中定义${xxx})
- 依赖作用域为scope : 解析
<scope>xxx</scope>
- compile:编译依赖范围,在编译,测试,运行时都需要,依赖范围默认值
- test:测试依赖范围,测试时需要。编译和运行不需要,如junit
- provided:已提供依赖范围,编译和测试时需要。 运行时不需要,如servlet-api
- runtime:运行时依赖范围,测试和运行时需要。编译不需要,例如面向接口编程,JDBC驱动实现jar
- system:系统依赖范围。本地依赖,不在maven中央仓库,结合systemPath标签使用
判断同一项目
- 寻找顶层pom(最短路径):一个顶层pom代表一个项目
- 找到顶层pom后,寻找其所有子pom,(继承、聚合关系之后考虑)
pom文件标签解析顺序:
- properties–>parent–import–>dependencyManagement–>dependencies
- parent与import表示继承关系,import只能出现在dependencyManagement中
- modules随便
- exclusions:与dependencyManagement/dependencies解析同步进行。
- properties:可能含有$:需解析
- G:groupId A:artifactId V:version S:scope------
- ${project.version}特指
<project><version>xxxxx</version></project>
关于dependencyManagement
- 非实际依赖,仅用于管理,供实际依赖参考(主要用于实际依赖获取版本号、作用域)
- 含有GAVS
- 含有import,表示继承
关于顶层pom有没有moudles的处理:
- 有moudles按正常流程处理
- 没有moudles,所有文件都解析
maven一些原则:
- 第一原则: 路径最短者优先
- 第二原则: 第一声明者优先
exclusion 忽略(避免冲突)
<dependency>
<groupId>com.xxx</groupId>
<artifactId>xxx</artifactId>
<version>x.version</version>
<exclusions>
<exclusion>
<groupId>com.xxx</groupId> <!-- 若为*则忽略全部 -->
<artifactId>yyy</artifactId> <!-- 若为*则忽略全部 -->
</exclusion>
</exclusions>
</dependency>
关于聚合与继承
- 聚合:解析
<modules><module>xxx</module></modules>
- moudle的内容表示的是文件夹名称(可以理解为子项目名称)
- 聚合仅仅是将子项目聚合到父项目中,并不表示依赖的父子关系。
- 单继承:解析
<parent></parent> - 多继承 : import,仅出现在dependencyManagement中,如下代码所示:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>maven</groupId>
<artifactId>A</artifactId>
<version>1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
更多推荐

所有评论(0)