Maven setting文件中<mirrors>(镜像)和 <servers>两个标签的区别
Maven 中 <mirrors>
(镜像)和 <servers>
(服务器认证)的作用不同,且执行顺序有明确规则,简单来说:
1. 优先使用 <mirrors>
中匹配的镜像,而非原始仓库地址
无论是否配置了 <servers>
,Maven 都会先检查 <mirrors>
中是否有镜像匹配当前需要访问的仓库。
- 如果镜像匹配(通过
<mirrorOf>
规则),则会优先使用镜像地址,并使用该镜像对应的<server>
认证信息(如果有)。 - 如果没有匹配的镜像,则直接访问原始仓库地址,并使用该仓库对应的
<server>
认证信息(如果有)。
2. 举例说明
假设你的配置如下:
<!-- settings.xml -->
<mirrors><!-- 阿里云镜像,匹配中央仓库 --><mirror><id>aliyun</id><url>https://maven.aliyun.com/repository/public</url><mirrorOf>central</mirrorOf> <!-- 匹配官方中央仓库 --></mirror>
</mirrors><servers><!-- 阿里云镜像的认证(通常不需要,公共仓库开放访问) --><server><id>aliyun</id><username>xxx</username><password>xxx</password></server><!-- 公司Nexus私服的认证 --><server><id>company-nexus</id><username>yyy</username><password>yyy</password></server>
</servers>
-
当依赖来自 Maven 中央仓库(central) 时:
Maven 会匹配到<mirrorOf>central</mirrorOf>
的阿里云镜像,优先从阿里云下载,使用<server id="aliyun">
的认证(如果需要)。 -
当依赖来自 公司Nexus私服(如在
pom.xml
中配置了<repository id="company-nexus">
)时:
由于没有镜像匹配该私服(<mirrorOf>
未指定),Maven 会直接访问私服地址,使用<server id="company-nexus">
的认证信息。
3. 关键结论
<mirrors>
决定了访问哪个地址(镜像地址优先于原始仓库地址)。<servers>
仅提供认证信息,不影响地址选择,且认证信息的匹配依赖于<id>
(必须与镜像或仓库的<id>
一致)。
因此,配置了 <servers>
后,Maven 仍会优先使用 <mirrors>
中匹配的镜像(如阿里云),只有当访问的仓库没有对应的镜像时,才会直接访问原始仓库(如Nexus私服)并使用其认证。