maven访问仓库的顺序(六)

前言

一、顺序

maven项目使用的仓库一共有如下几种方式:

  1. 中央仓库,这是默认的仓库
  2. 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置
  3. 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置
  4. 项目仓库,通过 pom.xml 中的 project.repositories.repository 配置
  5. 项目profile仓库,通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置
  6. 本地仓库

搜索顺序如下:

local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central

================

查询顺序

        现在maven的查询顺序为:

        首先在本地资源库中查找依赖,若不存在,则进入下一步,否则,退出;

        然后在 远程仓库(私服) 中查找依赖,若不存在,则进入下一步,否则,退出;

        最后在 中央仓库 中查找依赖,若不存在,则提示错误信息,退出。

  (1,如果在找寻的过程中,如果发现该仓库有镜像设置,则用镜像的地址代替。 2,如果仓库的id设置成“central”,则该配置会覆盖maven默认的中央仓库配置。)

================

三个仓库:
本地仓库:本地的一个文件夹,用来存放所有的jar包,由自己维护;
远程仓库(或私服):由公司或单位创建的一个仓库,由公司维护;
中央仓库:互联网上的仓库,由Maven团队维护;

 =========

maven的仓库只有两大类:

1.本地仓库

2.远程仓库,在远程仓库中又分成了3种:

2.1 中央仓库

2.2 私服

2.3 其它公共库

参看链接:https://www.cnblogs.com/YuyuanNo1/p/12938161.html

二、MAVEN 仓库加载顺序

2.1如果未配置有 mirrorOf * 的镜像仓库按照下面顺序获取jar

1 、查找本地仓库

2 、查找全局repository仓库配置并且按配置文件编辑倒序查找

【如果配置多个全局私服仓库,就算其中一个找到jar也会继续执行其他全局私服仓库下载操作,是否存在覆盖关系无法验证;如果全局有配置的情况下,未找到jar直接抛错,不会去项目配置的私有仓库下载资源】

3 、查找项目的repository仓库配置

【如果全局仓库找到jar,还会继续下载项目配置的私有仓库资源,是否存在覆盖关系无法验证;如果全局仓库无法找到jar,直接抛错,不会继续下载项目私服仓库配置】

4 、查找中央仓库,如果没有配置mirror 就默认中央仓库地址 https://repo.maven.apache.org/maven2

5 、查找中央仓库,如果配置了mirror并且配置多个mirrorOf 是central 只会获取第一个配置进行下载jar

2.2如果配置有 mirrorOf * 的镜像仓库

<mirrors>
         <mirror>
            <id>xx-repository</id>
            <name>xxx</name>
            <mirrorOf>*</mirrorOf>
            <url>xxxxx</url>
        </mirror>
  </mirrors>

则忽略上述规则,只从此仓库获取jar包。

1.<mirrorOf>*</mirrorOf>匹配所有远程仓库。

2.<mirrorOf>external:*</mirrorOf>匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。

3.<mirrorOf>repo1,repo2</mirrorOf>匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。

4.<mirrorOf>*,!repo1</miiroOf>匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。

2.3个人总结

总体来说,根据实验,得出以下个人想法:

1、本地仓库永远是第一个被查找的对象。

2、本地仓库找不到了,他会判断maven是否配置了<mirrorOf>*</mirrorOf>的镜像,如果是则从这里下载,不是则往下走。

3、判断是否存在私服配置,不管是maven settings.xml全局配置还是项目的pom私有配置,如果有则优先全局而后是项目私有,都会下载一遍jar【更正,取决于私服相关配置和启用条件】,是否存在覆盖关系无法验证。若都是启用状态则全局配置按配置文件倒序排优先级,找不到挨个往上找,但如果全局下不到jar就直接抛错了,不会继续去项目pom配置的私服下载。

4、查找中央仓库是否配置镜像,有走镜像,无走默认镜像。

参看链接:https://blog.csdn.net/kkillala/article/details/105809519

2.4 多个仓库同时使用

注意:maven的mirrors可以配置多个镜像地址,但是它默认使用的是第一个mirror,只有当第一个mirror不可用后,才会使用第二个,并不能达到第一个mirror找不到的包去第二个mirror下载的效果

  • https://blog.csdn.net/yxhxj2006/article/details/104217767
  • https://blog.csdn.net/lisheng19870305/article/details/111293301

简介
工作中通常会碰到需要使用公司私服的情况,但是有的私服jar包不全,你的本地环境可能希望私服跟其他仓库一起使用。

mirror
maven的mirrors可以配置多个镜像地址,但是它默认使用的是第一个mirror,只有当第一个mirror不可用后,才会使用第二个,并不能达到第一个mirror找不到的包去第二个mirror下载的效果。

<settings>
    <mirrors>
        <mirror>
            <id>mirror1</id>
            <mirrorOf>central,jcenter</mirrorOf>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
        <mirror>
            <id>mirror2</id>
            <mirrorOf>central,jcenter</mirrorOf>
            <url>私服地址</url>
        </mirror>
    </mirrors>
</settings>

repository

maven可以配置多个repository,在下载依赖时,maven会从第一个repository去下载,找不到去第二个,依此类推。因此,我们可以通过在repository添加自己私服地址的方式来解决这个问题。

<settings>
    <mirrors>
        <mirror>
            <id>mirror1</id>
            <mirrorOf>central,jcenter,!myRepo</mirrorOf>
            <url>https://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
        <mirror>
            <id>mirror2</id>
            <mirrorOf>myRepo</mirrorOf>
            <url>私服地址</url>
        </mirror>
    </mirrors>
    
    <profiles>
        <profile>
            <id>myProfile</id>
            <repositories>
                <repository>
                    <id>central</id>
                    <url>https://maven.aliyun.com/nexus/content/groups/public</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>myRepo</id>
                    <url>local repo url</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
    </profiles>    
    <activeProfiles>
        <activeProfile>myProfile</activeProfile>
    </activeProfiles>
</settings>

如果你的私服是http地址,且maven是3.8.1及以上版本,需要添加以下mirror阻止maven对http私服地址的屏蔽。

<mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>dummy</mirrorOf>
      <name>Dummy mirror to override default blocking mirror that blocks http</name>
      <url>http://0.0.0.0/</url>
      <blocked>false</blocked>
</mirror>

参看链接:https://blog.csdn.net/liuzhenghua66/article/details/135213707

 

posted @ 2021-09-10 14:56  慎终若始  阅读(6172)  评论(0编辑  收藏  举报