maven的mirrors和repositories笔记

时间:2025-04-26 11:56:06

前言

Maven仓库是存储项目依赖组件的第三方库,企业为了解决下载依赖速度慢和存放自研组件,通常会搭建企业内部的一个Maven私有仓库。

一、概念

本地仓库:存储在本地磁盘的镜像仓库,通常通过的<localRepository>配置。
远程仓库:通过网络链接的不在本地磁盘存储的仓库,通常包含: maven社区维护的 *仓库、由各大社区或企业提供的公共仓库、企业内部建设的内网私库。

Maven会按照以下顺序来查找需要的jar包:

  1. 首先在本地仓库查找。
  2. 如果本地仓库没有找到,则会去配置的私有仓库查找。
  3. 如果私有仓库也没有找到,则会去*仓库查找。

二、仓库配置优先级

本地仓库 -> mirrorOf(比较特殊,后续会讲)是*的镜像路径 -> 的profile repositories->的profile repositories->的repositories->通过id匹配的mirror。对此官网的解释:
Remote repository URLs are queried in the following order for artifacts until one returns a valid result:

  1. effective settings:
    a. Global
    b. User
  2. local effective build POM:
    a. Local
    b. Parent POMs, recursively
    c. Super POM
  3. effective POMs from dependency path to the artifact.
    意思大概如下:
    • 全局配置文件中的配置项的优先级最高,也就是maven安装目录下的conf/优先级最高
    • 其次是用户级别的配置文件优先级次高,默认是${}/.m2/
    • 最后就是本地的文件优先级次次高
    • 当确定了要查询某个仓库时,会先看这个仓库有没有对应的镜像仓库,如果有的话,则转向去查镜像仓库,也就是会查当前仓库的替代品(镜像仓库),跳过对本仓库的检索
    • 如果同一个pom文件里面有多个激活的profile,则靠后面激活的profile的优先级高
    • 针对pom文件,如果有激活的profile,且profile里面配置了repositories,则profile里面的repositories的仓库优先级比标签下面的repositories的优先级高
    • 针对pom文件,无论是project标签下面直接定义的repositories,还是profile标签下面定义的repositories,repositories内部的repository的查询顺序,都是按照仓库定义的顺序查询,也就是自上而下查询。
    • 如果中的profile的id和pom文件中的profile的id一样,则以中的profile中配置的值为准
    • 如果同一个pom文件中有多个profile被激活,那么处于profiles内部靠后面生效的profile优先级比profiles中靠前的profile的优先级高

三、mirrors

mirror :可以理解为仓库的映射关系,虽然mirrors标签可以配置多个,但是默认只有第一个mirror生效,只有在第一个节点无法连接的时候才会去找下一个。而我们想要的效果是:当在第一个 mirror 中不存在的时候,maven会去第二个 mirror 中查询下载,但是maven不会这样做!

四、repositories和mirrors的关系

maven下载镜像过程:
1、通过上面的仓库配置优先级顺序定位到具体的repository
2、通过定位repository的id,去下的mirrors 通过mirrorOf匹配到一个节点。
3、如果没有匹配到对应的mirror,就使用repository配置的路径下载。

注:mirror的匹配规则:使用mirrorOf配置匹配仓库ID, 且MAVEN仅使用匹配到的第一个镜像,其余符合匹配条件的镜像将不起作用。也就是说,如果你的第一个仓库的mirrorOf 配置为 * ,则其余镜像配置将不起作用

<mirrorOf>*</mirrorOf>:匹配所有远程仓库,不建议使用,如果要使用放在最后。
<mirrorOf>external:*</mirrorOf>:匹配所有远程仓库(不在本地仓库的文件就从配置和这个的镜像地址获取),使用 localhost 和 file:// 协议的除外。即,匹配所有不在本机上的远程仓库。
<mirrorOf>repo1,repo2</mirrorOf>:匹配仓库 repo1 和 repo2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1</mirroOf>:匹配所有远程仓库,repo1 除外,使用感叹号将仓库从匹配中排除。

配置建议

1、文件的mirrors不要配置<mirrorOf>*</mirrorOf>,优先级最高,避免每个jar包都从这个镜像仓库去找,如果在这个镜像仓库找不到,则报错;
2、文件mirrors只需要配置*仓库地址<mirrorOf>central</mirrorOf>,maven根据本地仓库->repositories配置的私库->*仓库的顺序查找,如果在本地仓库和repositories配置的私库都没有找到,会从*仓库找,然后通过镜像地址找到配置镜像*仓库去下载;
3、在的profile或者项目的repositories配置自己使用的私库,比如:在私库repo1,在私库repo2,则在profile或者的repositories依次配置repo1和repo2,这样下载就会先从repo1去查找,找到后不往下找,会从repo1找,没找到会从repo2找,找到后不会向下找。
经过以上三点配置,就解决了私库和*仓库混合使用的目的。

总结

本人是根据几篇博客,以及自己实验结果,得出的结论,如果有不同的结论或者意见,请联系我,帮助我提升自己,感激不尽,谢谢。

参考资料

/abu935009066/article/details/124206273
/s?id=1763680183859351390&wfr=spider&for=pc