说说依赖的解析机制?

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值