当本地仓库没有构件的时候,Maven会自动从远程仓库下载。当依赖版本为快照版本时,Maven会自动找到最新的快照。

依赖机制如下:

  1. 当依赖的范围是system时,Maven直接从本地文件系统解析构件。
  2. 根据依赖坐标计算仓库路径后,尝试直接从本地文件系统解析构件。如果发现相应的构件,则解析成功。
  3. 在本地仓库不存在相应的构件情况下,如果依赖的版本是显式的发布版本构件,则遍历所有的远程仓库,发现后下载使用
  4. 如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或LATEST真实的值,然后基于这个真实的值检查本地和远程仓库。
  5. 如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
  6. 如果最后解析得到的构件版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,并使用该非时间戳格式的构件。

当依赖的版本不清晰的时候,如RELEASE,LATEST,SNAPSHOT,Maven就需要基于更新远程仓库的更新策略来检查更新。

有一些配置与此有关:首先是<releases><enabled><snapshot><enabled>,只有仓库开启了对于发布版本的支持时,才能访问该仓库的发布版本构件信息,对于快照版本也是一样。

其次:<releases>snapshots子元素<updatePolicy>,该元素配置了检查更新的频率,每日、永久、从不、自定义等。

最后,用户还可以从命令行加入参数-U,强制检查更新,使用参数后,Maven就会忽略<updatePolicy>配置。

当Maven检查完更新策略,并决定价差依赖更新的时候,就需要检查仓库元数据maven-metadata.xml

RELEASE和LATEST的最新版本就是根据maven-metadata.xml计算出来的。所以在项目中使用RELEASE和LATEST版本不推荐,因为Maven可能会解析出新得组件。