maven 中 repository 是如何工作的

本文中,我们将来看下如何在 maven 项目中定义和解决依赖关系,然后深入研究 maven 存储库如何使这些依赖关系可供使用的。

什么是 maven 依赖项?

关于这个相信都不会陌生,就是在 里面申明这样一个配置

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>com.glmapper.bridge.boot</groupId>
<artifactId>client</artifactId>
<version>${version}</version>
</dependency>
</dependencies>

maven 坐标

大多数的 dependency 申明都会包括 groupId、artifactId、version 这些标签项,这样一组 key/value 对的组合成了maven 坐标,来标识一个特定的 dependency,和地图的经纬度坐标一样,通过这个坐标我们就可以精准的指定一个特定的 dependency。

maven 是如何定位和解析 dependencies?

maven 的仓库和其他的像 APT、YUM 等不同,它不存在类似于主索引文件这样的东西存在能够去列举出当前仓库中所有可用的 artifacts。maven 使用的是通过给定依赖项的坐标值,然后再根据 maven repository layout 构造出依赖的 URL。

maven repository layout 映射

对于一个 maven artifact,它的 URL 大概格式如下:

1
2
/$groupId[0]/../${groupId[n]/$artifactId/$version/$artifactId-$version.$extension
# 如 /com/glmapper/bridge/boot/client/1.0.0/client-1.0.0.jar

groupId 的规则

groupId 是一个字符串数组,以 . 分隔,如 org.springframework.boot,那实际上实际路径会转换成的文件路径是 /org/springframework/boot/ 。

artifact

maven 的核心功能之一是其处理传递依赖性的能力。也就是说,以递归的方式查找和下载依赖项的依赖项以及它们的依赖项,直到它们全部满足为止。

pom

我们把 com.glmapper.bridge.boot 的 groupId 转换成 /com/glmapper/bridge/boot,然后用 $artifactId 和$versionId 构造 URL 的其余部分,像这样:

1
/com/glmapper/bridge/boot/client/1.0.0/client-1.0.0.pom

jar

和 pom 差不多,如下:

1
/com/glmapper/bridge/boot/client/1.0.0/client-1.0.0.jar

https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/#maven-metadataxml

maven 中 repository 是如何工作的

http://www.glmapper.com/2020/12/06/maven/maven-repository/

作者

卫恒

发布于

2020-12-06

更新于

2022-04-21

许可协议

评论