我的settings.xml一般这样设置:

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <localRepository>X:\工具\maven资源\repository</localRepository>

  <pluginGroups></pluginGroups>

  <proxies></proxies>

  <servers></servers>

  <mirrors>

    <mirror>

      <id>nexus-aliyun</id>

      <name>Nexus aliyun</name>

      <mirrorOf>central</mirrorOf>

      <url>http://maven.aliyun.com/nexus/content/groups/public</url>

    </mirror>

    <mirror>

      <id>nexus-mine</id>

      <name>Nexus mine</name>

      <mirrorOf>*</mirrorOf>

      <url>http://xx.xx.xx.xx/nexus/content/groups/public</url>

    </mirror>

  </mirrors>

  <profiles></profiles>

</settings>

nexus-aliyun使用阿里云的镜像作为central中央仓库

nexus-mine作为私服,mirrorOf配置为*来提供中央仓库中不存在的jar包

---------------------------------------------------------------没时间下面不用看了-----------------------------------------------------------------------------

一、概述

maven的settings.xml文件里面有proxy、server、repository、mirror的配置,在配置仓库地址的时候容易混淆

proxy是服务器不能直接访问外网时需要设置的代理服务,不常用

server是服务器要打包上传到私服时,设置私服的鉴权信息

repository是服务器下载jar包的仓库地址

mirror是用于替代仓库地址的镜像地址

下面查看源码来确定repository和mirror的优先顺序

二、初始化远程仓库

在maven的远程仓库初始化时会执行newRepositorySession方法,会创建mirror、proxy、authentication和其它系统环境信息:

this.mavenRepositorySystem.injectMirror(request.getRemoteRepositories(), request.getMirrors());

this.mavenRepositorySystem.injectProxy(session, request.getRemoteRepositories());

this.mavenRepositorySystem.injectAuthentication(session, request.getRemoteRepositories());

三、遍历注入镜像

在injectMirror方法中:

public void injectMirror(List<ArtifactRepository> repositories, List<Mirror> mirrors)

  {

    if ((repositories != null) && (mirrors != null)) {

      for (ArtifactRepository repository : repositories)

      {

        Mirror mirror = getMirror(repository, mirrors);

        injectMirror(repository, mirror);

      }

    }

  }

遍历repositories,获得mirror然后注入mirror

注:这里不用担心repositories没数据,因为在之前的初始化repositories方法中会判断没有配置"central"中央仓库的时候加入默认仓库

private void injectDefaultRepositories(MavenExecutionRequest request)

    throws MavenExecutionRequestPopulationException

  {

    Set<String> definedRepositories = this.repositorySystem.getRepoIds(request.getRemoteRepositories());

    if (!definedRepositories.contains("central")) {

      try

      {

        request.addRemoteRepository(this.repositorySystem.createDefaultRemoteRepository(request));

      }

      catch (Exception e)

      {

        throw new MavenExecutionRequestPopulationException("Cannot create default remote repository.", e);

      }

    }

  }

public ArtifactRepository createDefaultRemoteRepository(MavenExecutionRequest request)

    throws Exception

  {

    return createRepository("https://repo.maven.apache.org/maven2", "central", true, "daily", false, "daily", "warn");

  }

三、匹配镜像

在getMirror方法中:

public static Mirror getMirror(ArtifactRepository repository, List<Mirror> mirrors)

  {

    String repoId = repository.getId();

    if ((repoId != null) && (mirrors != null))

    {

      for (Mirror mirror : mirrors) {

        if ((repoId.equals(mirror.getMirrorOf())) && (matchesLayout(repository, mirror))) {

          return mirror;

        }

      }

      for (Mirror mirror : mirrors) {

        if ((matchPattern(repository, mirror.getMirrorOf())) && (matchesLayout(repository, mirror))) {

          return mirror;

        }

      }

    }

    return null;

  }

忽略不常用的layout配置,第一个循环优先寻找mirrorOf与repositoryId完全相同的mirror

第二个循环通过规则来匹配mirror,matchPattern的方法:

static boolean matchPattern(ArtifactRepository originalRepository, String pattern)

  {

    boolean result = false;

    String originalId = originalRepository.getId();

    if (("*".equals(pattern)) || (pattern.equals(originalId)))

    {

      result = true;

    }

    else

    {

      String[] repos = pattern.split(",");

      for (String repo : repos) {

        if ((repo.length() > 1) && (repo.startsWith("!")))

        {

          if (repo.substring(1).equals(originalId))

          {

            result = false;

            break;

          }

        }

        else

        {

          if (repo.equals(originalId))

          {

            result = true;

            break;

          }

          if (("external:*".equals(repo)) && (isExternalRepo(originalRepository))) {

            result = true;

          } else if ("*".equals(repo)) {

            result = true;

          }

        }

      }

    }

    return result;

  }

如果是mirrorOf是*号就匹配,如果不是就遍历可能是逗号分隔的mirrorOf值,同时看是否是!号排除的

在找到mirror后会执行injectMirror方法,把匹配的mirror注入到repository里面:

private void injectMirror(ArtifactRepository repository, Mirror mirror)

  {

    if (mirror != null)

    {

      ArtifactRepository original = createArtifactRepository(repository.getId(), repository.getUrl(), repository.getLayout(), repository

        .getSnapshots(), repository.getReleases());

      

      repository.setMirroredRepositories(Collections.singletonList(original));

      

      repository.setId(mirror.getId());

      repository.setUrl(mirror.getUrl());

      if (StringUtils.isNotEmpty(mirror.getLayout())) {

        repository.setLayout(getLayout(mirror.getLayout()));

      }

    }

  }

四、总结

1、在mirrorOf与repositoryId相同的时候优先是使用mirror的地址

2、mirrorOf等于*的时候覆盖所有repository配置

3、存在多个mirror配置的时候mirrorOf等于*放到最后

4、只配置mirrorOf为central的时候可以不用配置repository

maven mirror 优先级相关推荐

  1. Maven 仓库优先级

    maven仓库优先级:本地仓库(localRepositories) > pom.xml文件中的repositories仓库 > setting.xml配置文件中mirrors镜像仓库 m ...

  2. maven Mirror镜像

    maven Mirror镜像 mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配 ...

  3. Maven Mirror镜像配置

    Maven Mirror镜像 在setting.xml 配置镜像如下: <!--两个可用的mirror站点--><!-- 阿里云的镜像站--><mirror>< ...

  4. maven mirror repository

    简单点来说,repository就是个仓库.maven里有两种仓库,本地仓库和远程仓库.远程仓库相当于公共的仓库,大家都能看到.本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用.当你向仓库请 ...

  5. 配置Maven mirror

    文章目录 Maven出现 Maven Cannot resolve plugin xxx 配置文件地址 配置文件元素介绍 Mirror简介 修改配置 Maven出现 Maven Cannot reso ...

  6. Maven仓库理解和优先级

    前言 使用 maven 也有一段时间了,有时候在配置 repository,mirror,profile的时候,总会导致 jar 拉取不到.所以认真的分析了 maven 获取 jar 包时候的优先级. ...

  7. maven setting.xml 中文配置详解(全配置)

    <?xml version="1.0" encoding="UTF-8"?> <!--| 官方文档: https://maven.apache ...

  8. maven详解之仓库

    在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件. Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依赖和插件的地方) 任何的 ...

  9. 史上最详细的maven仓库详解

    写在前面: 我是「沸羊羊_」,昵称来自于姓名的缩写 fyy ,之前呕心沥血经营的博客因手残意外注销,现经营此账号. 本人是个小菜,正向着全栈工程师的方向努力着,文章可能并不高产,也很基础,但每写一篇都 ...

最新文章

  1. 图书管理系统python代码课程设计报告_数据结构图书管理系统课程设计报告
  2. JS对数据分页的封装方法
  3. java获得服务器路径的几中方法
  4. HDU1071_数学几何
  5. 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
  6. nde升级_NDE新闻编辑室工具KDE Plasma Mobile和更多新闻
  7. 2019工作榜单|Python程序员吸金榜,AI排第一,这个我服!
  8. 用RT Server Customizer定制Windows 2008 R2安装光盘
  9. Frobenius companion matrix
  10. java winform程序_重拾JAVA之WinForm实战之(四)
  11. 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经(转)
  12. r语言 与python r中python环境的创建
  13. k3服务器重装系统,金蝶K3安装教程07:K3 WEB系统配置工具
  14. 更新Win10版本后,wifi图标不见了,并且连接不到wifi和宽带,以及点击网络和Internet闪退的情况
  15. STC学习:可校准的实时时钟
  16. 编写php自动脚本,自己编写自动签到脚本
  17. android手机震动
  18. 模拟退火算法学习笔记
  19. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(8月4日)...
  20. 左右植树java_Plant 模拟植树活动,编写一个java应用程序 联合开发网 - pudn.com

热门文章

  1. 厦门大学计算机专业录取分数线2019,2019年厦门大学各省市各批次录取分数线公布【完整版】...
  2. MariaDB之SQL语句基础
  3. Anaconda安装新模块
  4. zabbix邮件内容乱码与邮件内容为附件解决办法
  5. spring aop的两种写法aspect和advisor
  6. 2017.5.3 博客园自动生成章节目录
  7. VS搭建lua开发环境和LuaBridge注册c++类(cocos2dx项目)(一)
  8. 今天终于有自己的博客了!!!
  9. CSS英文单词强制换行
  10. 学习:MOSS2007 实现单点登陆(转)