Maven的mirror、repository、server和proxy配置以及jar包下载逻辑

一、相关概念解析

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

  1. proxy是服务器不能直接访问外网时需要设置的代理服务,不常用。
    • 就是VPN中的代理。网络被墙时可以使用这个配置处理。
  2. server是服务器要打包上传到私服时,设置私服的鉴权信息的地方。
    • 一般为企业私服的鉴权信息。
    • 它一般通过ID和repository进行匹配。比如某个私有仓库需要用户认证信息,可以在此处配置。
  3. repository是服务器下载jar包的地址。
    • 存储jar包的地址。从这个地址下载jar包。
    • 可以配置多个,每个repository都有一个唯一ID。理论上,ID是随意的,不过ID为central的repository是特殊的repository。
    • 如果我们不配置任何repository,那么maven默认会生成一个id为central的repository供自身使用。
    • Maven在进行jar包下载时从配置的所有repository中逐一查找。如果所有的repository都找不到,那么会提示异常。
  4. mirror是用于覆盖repository的镜像地址。此时我们下载jar包时如果需要从这个repository下载。那么实际上maven会从此repository对应的mirror对应的地址下载jar包。可以理解为mirror地址会覆盖它对应的repository地址,从而改变jar包的下载地址,这也是各种maven镜像站点的工作原理。(repository和mirror的对应是通过它们的ID进行匹配的)。

二、mirror和repository匹配逻辑

mirror和repository如何匹配规则如下。

  1. 全等匹配。如果mirror的mirrorOf的值和repository的ID完全一致,则这个mirror和repository匹配。不过mirrorOf通常可以配置多个值,使用逗号分隔。如下配置,当我们需要从aliyun或者google这两个仓库下载jar时,maven会直接从ALiYunMirror这个mirror下载。即从 https://maven.aliyun.com/repository/public 这个地址进行下载。
<mirror>
     <id>ALiYunMirror</id>
     <mirrorOf>aliyun,google</mirrorOf>
     <name>Nexus aliyun</name>
     <url>https://maven.aliyun.com/repository/public</url>
</mirror>


<repository>
    <id>aliyun</id>
    <url>https://maven.aliyun.com/repository/central</url>
</repository>

<repository>
    <id>google</id>
    <url>https://maven.aliyun.com/repository/google</url>
</repository>
  1. 通配符匹配。“*”可以匹配所有repository。如下所示,当需要从aliyun或者google下载jar包时下载的地址都会重定向到ALiYunMirror配置的地址上。
<mirror>
     <id>ALiYunMirror</id>
     <mirrorOf>*</mirrorOf>
     <name>Nexus aliyun</name>
     <url>https://maven.aliyun.com/repository/public</url>
</mirror>


<repository>
    <id>aliyun</id>
    <url>https://maven.aliyun.com/repository/central</url>
</repository>

<repository>
    <id>google</id>
    <url>https://maven.aliyun.com/repository/google</url>
</repository>
  1. 外部匹配。使用“external:*”对repository进行匹配。它匹配“不在本地主机上且不基于文件的所有内容”的repository配置。如下所示,当需要从aliyun或者google下载jar包时下载的地址都会重定向到ALiYunMirror配置的地址上。而不会重定向local或者local-http的下载请求。
    1. URL中host部分是“localhost”的不匹配。
    2. URL中host部分是“127.0.0.1”的不匹配。
    3. URL中protocol部分是“file”的不匹配。
    4. 其他都匹配。
<mirror>
     <id>ALiYunMirror</id>
     <mirrorOf>external:*</mirrorOf>
     <name>Nexus aliyun</name>
     <url>https://maven.aliyun.com/repository/public</url>
</mirror>


<repository>
    <id>aliyun</id>
    <url>https://maven.aliyun.com/repository/central</url>
</repository>

<repository>
    <id>google</id>
    <url>https://maven.aliyun.com/repository/google</url>
</repository>

<repository>
    <id>local</id>
    <url>file:///root/m2/</url>
</repository>

<repository>
    <id>local-http</id>
    <url>http://localhost:8080/m2/</url>
</repository>
  1. 外部http匹配。使用“external:http:*”对repository进行匹配。它匹配“http相关协议”的repository配置。如下所示,当需要从http-repo和http-dav下载jar包时下载的地址都会重定向到ALiYunMirror配置的地址上。而不会重定向aliyun、google、local或者local-http的下载请求。
    • URL中protocol部分是“http”、“dav”、“dav:http”或“dav+http”且不是“本地URL”的 匹配。
      • “本地URL”是指:
      1. URL中host部分是“localhost”的URL。
      2. URL中host部分是“127.0.0.1”的URL。
      3. URL中protocol部分是“file”的URL。
    • 其他都不匹配。
<mirror>
     <id>ALiYunMirror</id>
     <mirrorOf>external:*</mirrorOf>
     <name>Nexus aliyun</name>
     <url>https://maven.aliyun.com/repository/public</url>
</mirror>


<repository>
    <id>aliyun</id>
    <url>https://maven.aliyun.com/repository/central</url>
</repository>

<repository>
    <id>google</id>
    <url>https://maven.aliyun.com/repository/google</url>
</repository>

<repository>
    <id>local</id>
    <url>file:///root/m2/</url>
</repository>

<repository>
    <id>local-http</id>
    <url>http://localhost:8080/m2/</url>
</repository>

<repository>
    <id>http-repo</id>
    <url>http://maven456.com:8080/m2/</url>
</repository>

<repository>
    <id>http-dav</id>
    <url>dav:http://maven123.com:8080/m2/</url>
</repository>
  1. 取反匹配。使用“!repo”对repository进行匹配。它表示不匹配以“repo”为ID的repository。如下所示,当需要从aliyun、local、http-repo、local-http和http-dav下载jar包时下载的地址都会重定向到ALiYunMirror配置的地址上。而不会重定向google的下载请求。
<mirror>
     <id>ALiYunMirror</id>
     <mirrorOf>*,!google</mirrorOf>
     <name>Nexus aliyun</name>
     <url>https://maven.aliyun.com/repository/public</url>
</mirror>


<repository>
    <id>aliyun</id>
    <url>https://maven.aliyun.com/repository/central</url>
</repository>

<repository>
    <id>google</id>
    <url>https://maven.aliyun.com/repository/google</url>
</repository>

<repository>
    <id>local</id>
    <url>file:///root/m2/</url>
</repository>

<repository>
    <id>local-http</id>
    <url>http://localhost:8080/m2/</url>
</repository>

<repository>
    <id>http-repo</id>
    <url>http://maven456.com:8080/m2/</url>
</repository>

<repository>
    <id>http-dav</id>
    <url>dav:http://maven123.com:8080/m2/</url>

</repository>

插件仓库pluginRepositories的配置。

  1. 插件仓库的配置和repository的配置一致。且mirror也会拦截(或者说是“镜像”)匹配的插件仓库的jar包下载请求。所以这里不做特别解释。

一些问题。

  1. 开发时曾遇到某个版本的依赖的jar包和pom不在同一个仓库的情况。因此这个版本的依赖想要完整下载必须将jar包所在的仓库pom所在的仓库都进行配置才可以(当然正常情况下不会发生这种情况,一些私有仓库的可能有这种情况)。
    同一版本的依赖jar包和pom不在同一个仓库

三、图示Jar包(或者pom)下载情况

1.【Maven:无mirror配置下的jar包(或者pom)下载逻辑】

Maven配置参考:

<repository>
    <id>repo1</id>
    <url>http://mv.com/m1/</url>
</repository>
<repository>
    <id>repo2</id>
    <url>http://mv.com/m2/</url>
</repository>
<repository>
    <id>repo3</id>
    <url>http://mv.com/m3/</url>
</repository>

1.【Maven:无mirror配置下的jar包(或者pom)下载逻辑】

2. 【Maven:有mirror配置下的jar包(或者pom)下载逻辑】

Maven配置参考:

<mirror>
     <id>ALiYunMaven</id>
     <mirrorOf>*</mirrorOf>
     <name>Nexus aliyun</name>
     <url>https://maven.aliyun.com/repository/public</url>
</mirror>

<repository>
    <id>repo1</id>
    <url>http://mv.com/m1/</url>
</repository>
<repository>
    <id>repo2</id>
    <url>http://mv.com/m2/</url>
</repository>
<repository>
    <id>repo3</id>
    <url>http://mv.com/m3/</url>
</repository>

2. 【Maven:有mirror配置下的jar包(或者pom)下载逻辑】

3. 【Maven:有mirror和server配置下的jar包(或者pom)下载逻辑】

Maven配置参考:

<server>
    <id>repo1</id>
    <username>repouser1</username>
    <password>repopwd1</password>
</server>
<server>
    <id>repo2</id>
    <username>repouser2</username>
    <password>repopwd2</password>
</server>
<server>
    <id>repo3</id>
    <username>repouser3</username>
    <password>repopwd3</password>
</server>
<mirror>
    <id>ALiYunMaven</id>
    <mirrorOf>repo1,repo2</mirrorOf>
    <name>Nexus aliyun</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>
<repository>
    <id>repo1</id>
    <url>http://mv.com/m1/</url>
</repository>
<repository>
    <id>repo2</id>
    <url>http://mv.com/m2/</url>
</repository>
<repository>
    <id>repo3</id>
    <url>http://mv.com/m3/</url>
</repository>

3. 【Maven:有mirror和server配置下的jar包(或者pom)下载逻辑】

4. 【Maven:有mirror、proxy和server配置下的jar包(或者pom)下载逻辑】

Maven配置参考:

<proxy>
    <id>optional</id>
    <active>true</active>
    <protocol>http</protocol>
    <username>proxyuser</username>
    <password>proxypass</password>
    <host>proxy.host.net</host>
    <port>80</port>
    <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
<server>
    <id>repo1</id>
    <username>repouser1</username>
    <password>repopwd1</password>
</server>
<server>
    <id>repo2</id>
    <username>repouser2</username>
    <password>repopwd2</password>
</server>
<server>
    <id>repo3</id>
    <username>repouser3</username>
    <password>repopwd3</password>
</server>
<mirror>
    <id>ALiYunMaven</id>
    <mirrorOf>repo1,repo2</mirrorOf>
    <name>Nexus aliyun</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>
<repository>
    <id>repo1</id>
    <url>http://mv.com/m1/</url>
</repository>
<repository>
    <id>repo2</id>
    <url>http://mv.com/m2/</url>
</repository>
<repository>
    <id>repo3</id>
    <url>http://mv.com/m3/</url>
</repository>

4. 【Maven:有mirror、proxy和server配置下的jar包(或者pom)下载逻辑】

猜你喜欢

转载自blog.csdn.net/qq_14947845/article/details/124765578
今日推荐