maven解析说明文档

maven确定一个依赖:

  • 坐标:maven通过groupId、artifactId、version三个变量来唯一确定一个具体的依赖(俗称GAV)

关于依赖名、版本、作用域(解析dependencies)

  1. 依赖名为groupId:artifactId
  • groupId : 解析<groupId>xxx</groupId>
    • project级别的groupId可能来源于<parent><groupId>xxx</groupId></parent>
    • 若含有${xxx},查询properties,当前pom没有,则查询父pom
  • artifactId : 解析<artifactId>xxx</artifactId>
    • 若含有${xxx},查询properties,当前pom没有,则查询父pom
  1. 依赖版本为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})
  1. 依赖作用域为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>

关于聚合与继承

  1. 聚合:解析<modules><module>xxx</module></modules>
  • moudle的内容表示的是文件夹名称(可以理解为子项目名称)
  • 聚合仅仅是将子项目聚合到父项目中,并不表示依赖的父子关系。
  1. 单继承:解析<parent></parent>
  2. 多继承 : import,仅出现在dependencyManagement中,如下代码所示:

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>maven</groupId>
			<artifactId>A</artifactId>
			<version>1.0</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

更多推荐