1. 通用解析流程

  1. 当依赖范围是 system 的时候,Maven 直接从本地文件系统解析构件。

  2. 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功。

  3. 在本地仓库不存在相应构件的情况下,如果依赖的是发布版本的构件,则按照优先级遍历所有的远程仓库,发现后,下载并解析使用。

2. 版本不明确时的处理

当依赖的版本不明确的时候,Maven 需要:

  1. 基于更新远程仓库的更新策略来检查更新。

  2. 合并远程和本地仓库的 maven-metadata.xml 文件。

  3. 计算出需要的最终版本号。

  4. 使用最终版本号解析依赖(第一节的步骤 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 官方已不建议使用,在后续的版本中会移除这两个特性。这里就不过多介绍了,有兴趣的同学可以自行了解下。