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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Maven是一个开源的构建管理工具,它能够自动化构建过程和依赖管理。其中,Maven仓库是Maven的关键组成部分之一,用于存储各种构建依赖项,如Jar包、插件、依赖库等。在Maven中,有两个概念:仓库repositories和镜像mirrors,它们在Maven中的作用不同,下面我们将分别进行介绍。 Maven仓库repositories Maven仓库repositories是指Maven默认的依赖项存储区。在Maven的构建过程中,如果在本地计算机上没有找到所需的依赖项,Maven会从repositories中查找并下载。repositories有两种类型:本地仓库和远程仓库。 本地仓库是指Maven在本地计算机上缓存的依赖项存储区。当我们第一次构建项目时,Maven会自动在我们的本地仓库中创建一个默认位置,例如:~/.m2/repository。当我们需要依赖项时,Maven会首先在本地仓库中查找,如果找到,则直接使用本地仓库中的依赖项。如果本地仓库中没有找到,Maven会从远程仓库中查找。 远程仓库是指存储依赖项的远程服务器,我们可以将依赖项上传到远程仓库中,以供他人使用。Maven官方提供了一个默认的远程仓库Central Repository。当我们需要依赖项时,Maven会首先从本地仓库中查找,然后再从Central Repository中查找。 Maven默认使用的repositories中包含了Central Repository,也可以配置其他的repositories,以便于从其他的仓库中获取依赖项。 Maven镜像mirrors Maven镜像mirrors是指一个可以从其他地方复制数据的复制品。在Maven中,Mirrors是由Central Repository提供的一个特殊功能。使用Mirrors的主要目的是减少从Central Repository下载依赖项的时间。在国外,由于网络环境较好,所以使用Central Repository可以快速下载依赖项。但是,在国内如果直接访问Central Repository,由于网络原因,可能会导致下载速度非常慢,甚至是无法连接。 为了解决这个问题,Maven提供了Mirrors的功能,我们可以将Central Repository配置为一个镜像。这样,在使用Maven下载依赖项时,就会从配置的镜像中下载,而不是直接从Central Repository中下载。通过使用镜像,能够提高依赖项下载的速度,提高构建效率。 总结 Maven仓库repositories和镜像mirrors是Maven构建过程中的两个重要概念。repositories用于存储依赖项,包含本地仓库和远程仓库。而mirrors是借助Central Repository提供的功能,用于提高依赖项的下载速度。在配置Maven时,需要同时考虑到repositoriesmirrors的配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值