maven mirror 优先级

 2023-09-09 阅读 17 评论 0

摘要:我的settings.xml一般这样设置: <?xmlversion="1.0" encoding="UTF-8"?> <settingsxmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoc

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

eclipse maven配置?  <localRepository>X:\工具\maven资源\repository</localRepository>

  <pluginGroups></pluginGroups>

  <proxies></proxies>

  <servers></servers>

  <mirrors>

    <mirror>

maven配置多个镜像、      <id>nexus-aliyun</id>

      <name>Nexus aliyun</name>

      <mirrorOf>central</mirrorOf>

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

    </mirror>

    <mirror>

maven配置本地镜像lib。      <id>nexus-mine</id>

      <name>Nexus mine</name>

      <mirrorOf>*</mirrorOf>

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

    </mirror>

  </mirrors>

maven setting配置,  <profiles></profiles>

</settings>

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

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

 

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

 

一、概述

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

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

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

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

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

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

junit maven依赖? 

二、初始化远程仓库

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

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

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

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

 

三、遍历注入镜像

maven镜像地址、在injectMirror方法中:

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

  {

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

      for (ArtifactRepository repository : repositories)

      {

maven dependency plugin、        Mirror mirror = getMirror(repository, mirrors);

        injectMirror(repository, mirror);

      }

    }

  }

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

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

private void injectDefaultRepositories(MavenExecutionRequest request)

    throws MavenExecutionRequestPopulationException

  {

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

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

maven mirrorof?      try

      {

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

      }

      catch (Exception e)

      {

maven强制使用某一个版本、        throw new MavenExecutionRequestPopulationException("Cannot create default remote repository.", e);

      }

    }

  }

public ArtifactRepository createDefaultRemoteRepository(MavenExecutionRequest request)

    throws Exception

maven配置多个mirror优先级?  {

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

  }

 

三、匹配镜像

在getMirror方法中:

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

maven仓库搜索顺序,  {

    String repoId = repository.getId();

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

    {

      for (Mirror mirror : mirrors) {

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

maven dependency?          return mirror;

        }

      }

      for (Mirror mirror : mirrors) {

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

          return mirror;

maven import?        }

      }

    }

    return null;

  }

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

maven继承与聚合?第二个循环通过规则来匹配mirror,matchPattern的方法:

static boolean matchPattern(ArtifactRepository originalRepository, String pattern)

  {

    boolean result = false;

    String originalId = originalRepository.getId();

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

maven加载顺序,    {

      result = true;

    }

    else

    {

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

Maven依赖?      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

 

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/29574.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息