一、相关概念解析
Maven的settings.xml文件里面有proxy、server、repository、mirror的配置,在配置仓库地址的时候容易混淆。
- proxy是服务器不能直接访问外网时需要设置的代理服务,不常用。
- 就是VPN中的代理。网络被墙时可以使用这个配置处理。
- server是服务器要打包上传到私服时,设置私服的鉴权信息的地方。
- 一般为企业私服的鉴权信息。
- 它一般通过ID和repository进行匹配。比如某个私有仓库需要用户认证信息,可以在此处配置。
- repository是服务器下载jar包的地址。
- 存储jar包的地址。从这个地址下载jar包。
- 可以配置多个,每个repository都有一个唯一ID。理论上,ID是随意的,不过ID为central的repository是特殊的repository。
- 如果我们不配置任何repository,那么maven默认会生成一个id为central的repository供自身使用。
- Maven在进行jar包下载时从配置的所有repository中逐一查找。如果所有的repository都找不到,那么会提示异常。
- mirror是用于覆盖repository的镜像地址。此时我们下载jar包时如果需要从这个repository下载。那么实际上maven会从此repository对应的mirror对应的地址下载jar包。可以理解为mirror地址会覆盖它对应的repository地址,从而改变jar包的下载地址,这也是各种maven镜像站点的工作原理。(repository和mirror的对应是通过它们的ID进行匹配的)。
二、mirror和repository匹配逻辑
mirror和repository如何匹配规则如下。
- 全等匹配。如果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>
- 通配符匹配。“*”可以匹配所有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>
- 外部匹配。使用“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>
- 外部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”是指:
- URL中host部分是“localhost”的URL。
- URL中host部分是“127.0.0.1”的URL。
- URL中protocol部分是“file”的URL。
- 其他都不匹配。
- URL中protocol部分是“http”、“dav”、“dav:http”或“dav+http”且不是“本地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>
- 取反匹配。使用“!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的配置。
- 插件仓库的配置和repository的配置一致。且mirror也会拦截(或者说是“镜像”)匹配的插件仓库的jar包下载请求。所以这里不做特别解释。
一些问题。
- 开发时曾遇到某个版本的依赖的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>
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>
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>
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>