【maven】maven settings.xml 中 mirror 和 repository 的区别

2023-11-13

一、概述

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

  1. proxy是服务器不能直接访问外网时需要设置的代理服务,不常用
  2. server是服务器要打包上传到私服时,设置私服的鉴权信息
  3. repository是服务器下载jar包的仓库地址
  4. mirror是用于替代仓库地址的镜像地址

二、源码解析执行流程

2.1》初始化远程仓库

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

this.mavenRepositorySystem.injectMirror(request.getRemoteRepositories(), request.getMirrors());
this.mavenRepositorySystem.injectProxy(session, request.getRemoteRepositories());
this.mavenRepositorySystem.injectAuthentication(session, request.getRemoteRepositories());

 2.2》遍历注入镜像

在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");
  }

2.3》匹配镜像

在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

四 、实践

4.1》maven 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">

  <pluginGroups></pluginGroups>
  <proxies></proxies>

  <servers>
      <server>
      <id>nexus-releases</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
    <server>
      <id>nexus-snapshots</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
  </servers>

  <mirrors> 
    <mirror> 
      <id>nexus-releases</id> 
      <mirrorOf>nexus-releases</mirrorOf> 
      <url>http://localhost:8081/nexus/content/groups/public</url> 
    </mirror>
    <mirror> 
      <id>nexus-snapshots</id> 
      <mirrorOf>nexus-snapshots</mirrorOf> 
      <url>http://localhost:8081/nexus/content/groups/public-snapshots</url> 
    </mirror> 
  </mirrors> 
 
  <profiles>
   <profile>
      <id>nexus</id>
      <repositories>
        <repository>
          <id>nexus-releases</id>
          <url>http://nexus-releases</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
        <repository>
          <id>nexus-snapshots</id>
          <url>http://nexus-snapshots</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
         <pluginRepository>
                <id>nexus-releases</id>
                 <url>http://nexus-releases</url>
                 <releases><enabled>true</enabled></releases>
                 <snapshots><enabled>true</enabled></snapshots>
               </pluginRepository>
               <pluginRepository>
                 <id>nexus-snapshots</id>
                  <url>http://nexus-snapshots</url>
                <releases><enabled>true</enabled></releases>
                 <snapshots><enabled>true</enabled></snapshots>
             </pluginRepository>
         </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles>
      <activeProfile>nexus</activeProfile>
  </activeProfiles>
 
</settings>

4.2》项目所在pom.xml配置

<distributionManagement>
        <!-- 两个ID必须与 setting.xml中的<server><id>nexus-releases</id></server>保持一致-->
        <repository>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://localhost:8081/nexus/content/repositories/releases</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
        </snapshotRepository>
    </distributionManagement>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【maven】maven settings.xml 中 mirror 和 repository 的区别 的相关文章

  • 书店管理系统

    设计一个书店管理系统 能完成书店的日常管理工作 要求完成的基本功能 1 进货入库记录 2 销售出货记录 3 图书信息查询 可通过书名 作者等途径查询某本图书的详细信息 含书名 作者 出版社 页数 最新入库时间 库存量 价格等 4 自动预警提
  • 时间和日期

    Boost使用的timer和data timerj进行对应和时间日期相关的出来文档 timer包含三个组件 分别为timer progress timer以及对应的progress display timer timer可以测量运行时间 t
  • ROS系统基本功能的使用详解(基本指令/节点/服务/启动文件/动态参数)

    ROS系统基本功能的使用详解 一 创建工作空间 二 创建与编译ROS功能包 三 ROS的基本命令 3 1 节点 3 2 主题 3 3 服务 3 4 参数服务器 四 节点的创建与运行 4 1 创建源文件 4 2 修改CMakeLists tx

随机推荐

  • 域名+七牛云+PicGo+pypora

    域名 七牛云 PicGo pypora 前提准备 域名 自己的域名 七牛云 免费注册申请10G空间够用 picGo 地址 pypora 自行下载 GO 七牛云 注册 gt 登录 gt 控制台 找到对象存储 新建自己空间 绑定域名 添加域名自
  • STM32使用SPI通信驱动2.4G无线射频模块发送数据

    目录 SPI介绍 SPI接口原理 SPI工作原理 SPI特征 引脚配置 结构体 库函数 SPI配置过程 SPI h SPI c NRF24L01无线射频模块 NRF24L01厂家驱动代码移植 NRF24L01 h NRF24L01 c ma
  • 分析一个别人的qt+opengl例子

    Qt5 OpenGL学习笔记 用Qt封装的QOpenGL系列绘制有颜色有深度的三角形 最近学习OpenGL 虽然说Qt可以使用原生OpenGL的API 但是Qt也提供了封装的QOpenGL系列 我用原生的和封装的分别实现了一次简单渲染 都是
  • 竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

    文章目录 1 前言 2 前言 3 数据集 3 1 良性样本 3 2 病变样本 4 开发环境 5 代码实现 5 1 实现流程 5 2 部分代码实现 5 2 1 导入库 5 2 2 图像加载 5 2 3 标记 5 2 4 分组 5 2 5 构建
  • Python Web系列学习2-Django

    1 django admin Django项目管理工具 建立一个Django项目用 django admin startproject xxx 生成的站点目录结构为 2 进入站点目录 建立一个应用 python manage py star
  • Qt基础篇:Qt读取路径下所有文件或指定类型文件(含递归、判断是否为空、创建路径)

    文件路径的拆解 QFileInfo fileinfo QString file full ui gt m AlgorithmFilePathLineEdit gt text qDebug lt lt file full 输出1 filein
  • Java框架体系架构的知识,分享一点面试小经验

    前言 当前我们都会说SpringBoot是Spring框架对 约定优先于配置理念的最佳实践的产物 一个典型的SpringBoot应用本质上其实就是一个基于Spring框架的应用 而如果大家对Spring框架已经了如指掌 那么 在我们一步步揭
  • Python实现截图——附完整源码

    Python实现截图 附完整源码 为了能在日常工作中方便地截取并保存屏幕截图 我们可以利用Python编写一段代码实现这个功能 本文将介绍基于Windows平台下的Python截图实现方法 包括如何使用Python的Pillow模块以及py
  • YOLO8添加facial landmark和Head Pose的评价逻辑

    目录 TOC 目录 前言 一 如何在val py中添加NME的逻辑 二 在val py中添加Angle Eorror的逻辑 1 引入库 三 将AFLW2000转为yolo格式 1 参考ultralyticsFaceMark process3
  • JAVA开发环境JDK安装及配置

    一 安装JDK 获取JDK的安装包 1 通过官网下载 2 打开安装包 开始安装JDK和JRE 1 打开JDK安装包 2 点击下一步开始JDK安装 3 更改安装路径 接下来以我的电脑为例安装到E盘 其他盘同理 4 将文件夹路径改到E盘新建的文
  • 用js动态创建svg

    吃水不忘挖井人 svg基础教程https www bilibili com video BV1Pt411y7V6 p 1 要实现的效果 svg文件的写法
  • 【LSTM回归】基于粒子群优化注意力机制的长短时记忆神经网络PSO-attention-LSTM实现数据回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab完整代码及仿真定制内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器
  • MySQL之分表分库分区

    数据库分表可以解决单表海量数据的查询性能问题 分库可以解决单台数据库的并发访问压力问题 分表 分表分为水平分表和垂直分表 水平分表原理 分表策略通常是用户ID取模 如果不是整数 可以首先将其进行hash获取到整 水平分表遇到的问题 1 跨表
  • Hadoop序列化案例

    Hadoop序列化案例 统计每一个手机号耗费的总上行流量 总下行流量 总流量 数据 1 13736230513 192 196 100 1 www baidu com 2481 24681 200 2 13846544121 192 196
  • Kafka3.0.0版本——Leader Partition自动平衡

    目录 一 Leader Partition自动平衡的概述 二 Leader Partition自动平衡的相关配置参数 三 Leader Partition自动平衡的示例 一 Leader Partition自动平衡的概述 正常情况下 Kaf
  • 代码审计练习题

    代码审计练习题 源码 方法 简单记录一下姿势 源码 判断var1和var2是否为对象 用弱不等号判断 分别判断md5
  • 将CSDN文章导出为.md、HTML、pdf格式

    将CSDN文章导出为 md HTML pdf格式 一 将CSDN文章导出为 md文件 二 将CSDN文章导出为HTML文件 三 把 md文件转换为pdf格式 一 将CSDN文章导出为 md文件 1 打开一篇CSDN文章 点击上方的 导出 按
  • 后端(五):JVM

    目录 JVM 中的内存区域划分 JVM 的类加载机制 1 加载 2 验证 3 准备 4 解析 5 初始化 JVM 中的垃圾回收策略 找 确认垃圾 1 引用计数 2 可达行分析 释放 垃圾 对象 1 标记清除 2 复制算法 3 标记整理 分代
  • Ubuntu18.04搭建VSCode编译环境

    确认ubuntu 18 04 uname a 添加root帐户密码 sudo passwd root 第一步 配置C 编译环境 安装gcc 和 g gcc v g v sudo apt install gcc sudo apt instal
  • 【maven】maven settings.xml 中 mirror 和 repository 的区别

    一 概述 maven的settings xml文件里面有proxy server repository mirror的配置 在配置仓库地址的时候容易混淆 proxy是服务器不能直接访问外网时需要设置的代理服务 不常用 server是服务器要