1. 通用解析流程
-
当依赖范围是 system 的时候,Maven 直接从本地文件系统解析构件。
-
根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功。
-
在本地仓库不存在相应构件的情况下,如果依赖的是发布版本的构件,则按照优先级遍历所有的远程仓库,发现后,下载并解析使用。
2. 版本不明确时的处理
当依赖的版本不明确的时候,Maven 需要:
-
基于更新远程仓库的更新策略来检查更新。
-
合并远程和本地仓库的 maven-metadata.xml 文件。
-
计算出需要的最终版本号。
-
使用最终版本号解析依赖(第一节的步骤 2、3)。
3. SNAPSHOT 版本解析
SNAPSHOT 就是一个版本号不明确的情况,就会通过第二节的方式来进行依赖解析,其中 maven-metadata.xml 的路径为:groupId/artifactId/version/maven-metadata.xml。
下面是一个 SNAPSHOT 构件的 maven-metadata.xml 文件内容,当前这个 1.1-SNAPSHOT 版本的实际版本号其实是由 <snapshot> 标签下的 <timestamp> 和 <buildNumber> 决定的,实际版本号是这样:1.1-20221101.064905-35。
<?xml version="1.0" encoding="UTF-8"?>
<metadata modelVersion="1.1.0">
<groupId>org.example</groupId>
<artifactId>maven-01</artifactId>
<version>1.1-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20221101.064905</timestamp>
<buildNumber>35</buildNumber>
</snapshot>
<lastUpdated>20221101064905</lastUpdated>
<snapshotVersions>
<snapshotVersion>
<extension>pom</extension>
<value>1.1-20221101.064905-35</value>
<updated>20221101064905</updated>
</snapshotVersion>
</snapshotVersions>
</versioning>
</metadata>
当 Maven 下载版本号为 1.1-20221101.064905-35 的快照构件到本地之后,Maven 会复制此构件生成一个新名称的构件,将版本号改为 1.1-SNAPSHOT,然后解析使用这个新的构件。
4. 两个过期版本值
Maven 中还有两个特殊的版本值,一个是 RELEASE,表示某个构件的最新发布版本,另一个是 LATEST,表示某个构件的最新版本(包括快照版本)。
但是由于使用这两个值带来的不确定性太大,Maven 官方已不建议使用,在后续的版本中会移除这两个特性。这里就不过多介绍了,有兴趣的同学可以自行了解下。