Skip to content

Maven HTTP仓库被阻止错误解决方案

问题描述

自Maven 3.8.1版本起,Maven默认阻止所有使用HTTP协议的远程仓库。当项目依赖的仓库使用HTTP协议而非HTTPS时,会出现以下错误:

Blocked mirror for repositories

这是Maven为了增强安全性而引入的改变,旨在防止中间人攻击(MITM attack)。由于Maven Central中的某些POM文件可能包含指向HTTP仓库的配置,而开发者往往对此不知情,Maven团队决定默认屏蔽这些不安全的连接。

解决方案

首选方案:使用HTTPS仓库

如果仓库同时提供HTTPS端点,应优先使用HTTPS版本:

xml
<repository>
  <id>primefaces.org</id>
  <name>PrimeFaces Maven Repository</name>
  <!-- 使用HTTPS仓库 -->
  <url>https://repository.primefaces.org</url>
</repository>

安全建议

尽可能使用HTTPS仓库,这是最安全且推荐的解决方案。

方案二:为特定HTTP仓库创建镜像

如果仓库只提供HTTP协议,可以为该特定仓库创建镜像:

xml
<mirrors>
  <mirror>
    <id>eclipselink-mirror</id>
    <name>EclipseLink HTTP Mirror</name>
    <url>http://download.eclipse.org/rt/eclipselink/maven.repo/</url>
    <mirrorOf>eclipselink</mirrorOf>
  </mirror>
</mirrors>

方案三:修改默认HTTP拦截器配置

在用户settings.xml文件中重写默认的HTTP拦截器配置:

xml
<mirrors>
  <mirror>
    <id>maven-default-http-blocker</id>
    <mirrorOf>dummy</mirrorOf>
    <url>http://127.0.0.1/dont-go-here</url>
    <blocked>false</blocked>
  </mirror>
</mirrors>

或者完全禁用HTTP拦截器:

xml
<mirrors>
  <!--
  <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>
  -->
</mirrors>

方案四:排除特定仓库的拦截

使用!repositoryId语法排除特定仓库不被拦截:

xml
<mirror>
  <id>maven-default-http-blocker</id>
  <mirrorOf>!repositoryId,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>

IDE配置说明

IntelliJ IDEA用户

确保Maven配置指向正确的settings.xml文件:

  1. 打开 File → Settings → Build, Execution, Deployment → Build Tools → Maven
  2. 检查 User settings file 路径是否正确
  3. 如有必要,勾选 Override 选项使用自定义配置文件

注意

删除 .m2/repository 文件夹后重新构建有时可以解决缓存导致的镜像问题,但这会重新下载所有依赖。

配置文件位置说明

Maven有两个settings.xml文件位置:

  1. 全局配置${maven.home}/conf/settings.xml(Maven安装目录)
  2. 用户配置${user.home}/.m2/settings.xml(用户目录)

用户配置会覆盖全局配置。建议优先修改用户级别的settings.xml文件。

安全考虑

重要安全提示

解除HTTP仓库的拦截会降低安全性,使构建过程容易受到中间人攻击。只有在以下情况下才应考虑此方案:

  1. 仓库确实不提供HTTPS支持
  2. 你信任该仓库及其网络连接
  3. 没有其他替代方案

总结

Maven 3.8.1+默认阻止HTTP仓库是为了提高安全性。解决方案的优先顺序应为:

  1. 使用HTTPS仓库(首选)
  2. 为特定HTTP仓库创建镜像
  3. 修改默认拦截器配置
  4. 完全禁用HTTP拦截(不推荐)

遵循这些解决方案,你应该能够解决"Blocked mirror for repositories"错误,同时保持适当的网络安全水平。