转载留存,原文地址:maven 配置mirror 与repository 以及它们之间的配置优先级 | 航行学园 (voycn.com)
一般公司都是有maven的私服即自己的仓库。 因此一般配置maven的时候都需要会配置一个 公司的maven私服与一个 比如 阿里云的maven仓库这样来用。 最近 胡乱配置了mirror 与 repository 导致 jar 下载不成功, 打包不成功。 于是重新了解了一下 maven 镜像仓库
1. 为什么还需要配置多一个maven公共仓库而不是仅仅一个maven私服即可?
比如在setting.xml 下配置一个私服的
<mirror> <id>nexus-releases</id> <mirrorOf>*</mirrorOf> <url>[http://47.112.201.193:8081/nexus/content/groups/public](http://47.112.201.193:8081/nexus/content/groups/public)</url> </mirror>
如果仅仅是配置一个maven私服的话,一般情况下是没有问题的。 但是可能并不好用。比如 maven私服没有的jar 包 就会取 maven 公共仓库取下载。 但是 这个 maven 公共仓库是国外的地址,可能会非常慢甚至 下载不来对应的jar. 因此就需要 额外多配置一个 公共的maven 仓库,比如 阿里云的maven库
2. 谨慎配置 mirrorOf 为 *
比如
<mirror> <id>nexus-aliyun-public</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>nexus-snapshots</id>
<mirrorOf>snapshots</mirrorOf>
<url>http://47.112.201.193:8081/nexus/content/repositories/snapshots</url>
</mirror>
那么 maven 读取mirror 配置是 从上往下读取的。 如果 mirrorOf 配置为 * 在 第一个个。 说明了 所有的 远程 jar 都是通过 nexus-aliyun-public 这个 mirror 去下载了,忽略了 nexus-snapshots 这个镜像配置。 如果 nexus-snapshots 是私服的话,那么 公司私服的jar 就都下载不来了。就算自己手动下载了,那么 maven 编译打包的时候也会报错 比如
maven resolution will not be reattempted until the update interval of nexus-aliyun has elapsed or up
等等 说是 xxxjar 下载不了的 问题。 那么 配置顺序应该是 mirrorOf 配置为 * 应该是在最后一个位置 参考
https://www.cnblogs.com/li1111xin/p/4777965.html
https://blog.csdn.net/wuqilianga/article/details/79094314
https://blog.csdn.net/LD799989470LD/article/details/80257725
https://www.cnblogs.com/ctxsdhy/p/8482725.html
1、在mirrorOf与repositoryId相同的时候优先是使用mirror的地址
2、mirrorOf等于*的时候覆盖所有repository配置
3、存在多个mirror配置的时候mirrorOf等于*放到最后
4、只配置mirrorOf为central的时候可以不用配置repository
我的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包
3. mirror 与 repository 配置优先级
mirror 优先级 高于 repository 配置。 特别是 mirror 配置了 mirrorOf等于 * , 那么 repository 配置就失效了。 参考 https://www.jianshu.com/p/c2ca01cdcb6e
maven获取真正起作用的repository集合流程:
首先会获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素;
如果repository的id和mirror的mirrorOf的值相同,则该mirror替代该repository;
如果该repository找不到对应的mirror, 则使用其本身,依此可以得到最终起作用的repository集合, repositories中默认包含了中央仓库central,当然也可以重新它的url;
可以理解mirror是复写了对应id的repository
即 mirror 不是配置 mirrorOf等于 * , 那么最终的 获取远程 jar 就会 结合 mirror 与 repository 配置一起 获取都所有的远程maven 仓库。 然后 一个仓库一个仓库取找jar 。