1. System 范围依赖
当依赖的范围是 system 时,Maven 直接从本地文件系统中解析构件。这种类型的依赖通常用于那些不在远程仓库中发布的库,开发者需要手动指定依赖的位置。
<dependency>
<groupId>com.example</groupId>
<artifactId>example-system</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/example-system-1.0.jar</systemPath>
</dependency>
2. 本地仓库解析
Maven 解析依赖时,会首先根据依赖坐标计算出在本地仓库中的路径,然后尝试在本地仓库中寻找该构件。如果找到对应的构件,就认为解析成功。例如,对于一个依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>example-artifact</artifactId>
<version>1.0</version>
</dependency>
本地仓库路径可能是:~/.m2/repository/com/example/example-artifact/1.0/example-artifact-1.0.jar
3. 远程仓库解析
如果本地仓库中不存在相应的构件,Maven 就会遍历所有配置的远程仓库,尝试从远程仓库下载该构件并解析使用。例如:
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
4. 版本是 RELEASE 或 LATEST
如果依赖的版本是 RELEASE 或 LATEST,Maven 需要基于更新策略读取所有远程仓库的元数据文件(groupId/artifactId/maven-metadata.xml),将其与本地仓库的对应元数据合并后,计算出 RELEASE 或 LATEST 的真实版本值。
- RELEASE:最新的稳定版本。
- LATEST:最新的版本,无论是稳定版还是快照版。
例如,Maven 会读取远程仓库中的 maven-metadata.xml 文件,合并后得到最新的版本,然后根据这个版本去检查本地仓库,或者从远程仓库下载。
5. 版本是 SNAPSHOT
如果依赖的版本是 SNAPSHOT,Maven 会基于更新策略读取所有远程仓库的元数据文件,将它与本地仓库对应的元数据合并,得到最新快照版本的值。
- SNAPSHOT:代表在开发过程中不断变化的版本。
Maven 会读取远程仓库中的 maven-metadata.xml 文件,合并后得到最新的快照版本。然后根据这个版本去检查本地仓库,或者从远程仓库下载。
6. 时间戳快照版本
如果最终解析得到的构件版本包含时间戳(通常用于快照版本),Maven 会先将该文件下载下来,再将文件名中的时间戳信息删除,剩下 SNAPSHOT 并使用。例如:
- 远程仓库中可能有一个文件 example-artifact-1.0-20210801.123456-1.jar,Maven 下载后会将其重命名为 example-artifact-1.0-SNAPSHOT.jar 并使用。
元数据文件是管理版本信息的文件
稳定版是经过全面测试和验证的正式发布版本。这些版本是不可变的,一旦发布,不应该再修改。通常以标准的版本号表示,例如 1.0.0、2.1.3、3.0 等。
快照版是开发中的版本,表示代码还在不断变化和改进中。它们是临时的、不稳定的版本,用于持续集成和测试。通常以 -SNAPSHOT 作为后缀,例如 1.0.0-SNAPSHOT、2.1.3-SNAPSHOT。