maven mirror 优先级

本文详细解析了Maven中settings.xml文件的配置项,重点介绍了proxy、server、repository及mirror的作用与优先级,并通过源码分析揭示了mirror的匹配机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的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

 

### 如何使用ADS进行S参数仿真 #### 1. 创建新项目并设置工作环境 启动Advanced Design System (ADS),创建一个新的设计文件。选择合适的模板来初始化项目结构,这有助于后续操作更加便捷[^1]。 #### 2. 构建电路原理图 进入Layout编辑器绘制所需的微波/射频电路拓扑结构。对于晶体管的S参数测量,需注意连接方式的选择——共发射极、共基极还是共集电极配置会影响最终结果的一致性[^2]。 #### 3. 添加直流偏置网络 为了准确反映实际应用条件,在测试点之间加入必要的DC Biasing组件(如电阻分压器)。然而需要注意的是,不当的偏置可能会改变器件的行为特性;例如,当采用特定接法时可能导致某些类型的增益消失或变得不明显。 #### 4. 插入S Parameter Simulation模块 通过Simulation Envelope功能向设计方案中嵌入用于执行散射矩阵分析的任务框体。此时可以指定频率范围及其他相关选项以满足具体需求。 #### 5. 配置端口定义与激励信号 明确各个输入输出接口的位置,并为其分配相应的标识符以便于识别。同时设定适当的源类型及其属性值作为驱动条件的一部分。 #### 6. 进行初步验证运行 完成上述准备工作之后即可尝试首次计算过程。观察所得图形化反馈数据是否合理并与预期相符。如果发现异常情况,则应回溯检查之前的每一步骤是否存在潜在错误之处。 #### 7. 调整优化直至满意为止 基于初次试验所获得的信息作出相应调整改进措施,重复迭代直到达到令人满意的精度水平。特别要注意不同模式下性能指标之间的差异可能暗示着内部机制上的区别对待。 ```matlab % MATLAB代码片段展示如何读取和处理由ADS导出的数据文件 data = load('sparam_data.mat'); % 加载MATLAB格式保存的结果 figure; freq = data.freq; % 获取频率轴信息 plot(freq, db(data.s_param)); % 绘制幅度响应曲线 xlabel('Frequency (GHz)'); ylabel('|S_{db}|'); title('Simulated S-Parameters Magnitude Response'); grid on; ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值