maven的mirrors和repositories笔记

前言

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

一、概念

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

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

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

二、仓库配置优先级

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

三、mirrors

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

四、repositories和mirrors的关系

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

总结

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

参考资料

https://blog.csdn.net/abu935009066/article/details/124206273
https://baijiahao.baidu.com/s?id=1763680183859351390&wfr=spider&for=pc

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值