1. 问题现象与背景解析
最近在将Maven从3.6.x升级到3.8.6版本后,突然发现项目构建时频繁出现"Blocked mirror for repositories"错误,导致依赖下载失败。控制台输出的典型错误信息如下:
code复制[ERROR] Failed to execute goal on project demo:
Could not resolve dependencies for project com.example:demo:jar:1.0:
Failed to collect dependencies at org.springframework.boot:spring-boot-starter-web:jar:2.7.0 ->
org.springframework.boot:spring-boot-starter:jar:2.7.0:
Blocked mirror for repositories: [central (http://repo.maven.apache.org/maven2, default, releases)]
-> [Help 1]
这个错误在开发团队中引发了不小困惑,因为同样的settings.xml配置在Maven 3.6版本上运行良好。经过排查发现,这是Maven 3.8.x引入的新安全机制导致的兼容性问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Maven 3.8+的安全策略变更
2.1 HTTP仓库的默认拦截机制
Maven 3.8.1开始引入了一项重要的安全改进:默认阻止所有非HTTPS的仓库连接。这个变更源于Maven项目对软件供应链安全的重视,旨在防止依赖下载过程中的中间人攻击(MITM)。
在技术实现上,Maven会在以下两种情况下自动添加blocked规则:
- 当仓库URL使用http://协议时
- 当镜像配置中的mirrorOf使用通配符(*)时
2.2 settings.xml中的blocked标签
新版本在settings.xml中引入了<blocked>标签,用于显式标记被阻止的仓库。典型配置如下:
xml复制<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
这个默认配置会导致所有HTTP仓库请求被重定向到一个无效地址(0.0.0.0),从而强制使用HTTPS连接。
3. 解决方案与配置调整
3.1 方案一:升级仓库URL为HTTPS(推荐)
最彻底的解决方案是将所有仓库URL升级为HTTPS协议。以Maven中央仓库为例:
xml复制<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
注意:部分私有仓库可能尚未支持HTTPS,这种情况下需要采用其他方案。
3.2 方案二:移除默认的http-blocker镜像
在settings.xml中找到并删除或注释掉以下镜像配置:
xml复制<!-- 注释或删除这个镜像配置 -->
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<url>http://0.0.0.0/</url>
<bl
