Maven 拉依赖时卡在中央仓库,最省事的办法是在 settings.xml 里加一个镜像。配置 maven阿里云仓库 之后,依赖从境外直连换成国内节点,下载慢和超时的问题一般会明显缓解。下面按配置顺序说明,并附上一个实际排查的例子。

默认仓库为什么慢
Maven 默认从 Maven Central(repo.maven.apache.org)下载依赖,这台服务器在境外。国内直连时速度时快时慢,大项目第一次构建往往要等很久,某个依赖超时后还会反复重试。阿里云的 maven阿里云仓库 会同步中央仓库的内容,节点在国内,访问延迟低,多数情况下下载会稳定很多。
先在 settings.xml 里加镜像
建议修改用户级文件 ~/.m2/settings.xml。它只影响你自己的机器,不用动项目代码,也不会影响同事。在 mirrors 节点下添加一个 mirror,有三个字段需要注意:
- id:随便起个名字,比如 aliyunmaven,之后在日志或 effective-settings 输出里好辨认。
- mirrorOf:写 *,表示所有仓库请求都走这个镜像。
- url:填 https://maven.aliyun.com/repository/public。这是聚合仓库,包含中央仓库以及一些常用的第三方内容。
如果团队只需要中央仓库的内容,url 可以换成 https://maven.aliyun.com/repository/central。Android 相关依赖可以用 …/repository/google,Gradle 插件可以用 …/repository/gradle-plugin。这些公开仓库都不需要账号密码。
mirrorOf 和协议最容易出问题
如果照着配了还是慢,多半卡在下面两处。
一是 mirrorOf 写成了 central。这样只有中央仓库走镜像。项目里如果还引用了 Spring 相关仓库或 Gradle 插件仓库,这些请求依然直连境外,速度上不去。写成 * 才能覆盖全部。
二是 url 用了 HTTP。Maven 3.8.1 起内置的 maven-default-http-blocker 会默认拦下 HTTP 仓库,报错通常是 Blocked mirror for repositories。把地址改成 https:// 即可。
清缓存后再验证
Maven 会在本地仓库(默认 ~/.m2/repository)里记录每个依赖的来源。之前超时留下的不完整文件,或者失败状态的记录,会让新配置看起来没有生效。这时执行一次强制更新:
mvn -U clean install
-U 会强制检查远程仓库的更新。要确认配置是否真的生效,运行 mvn help:effective-settings,在输出里看 mirror 节点的 url 和 mirrorOf 是不是你写的值。
一次真实的构建排查
某后端团队在新电脑上拉取一个 Spring Boot 项目,执行 mvn package 时卡在依赖下载阶段,大约 20 分钟后报出 Could not transfer artifact。排查过程大致如下:
- 查看日志,失败的请求指向 repo.maven.apache.org,说明中央仓库仍在直连。
- 检查 settings.xml,发现只配了 mirrorOf 为 central,而 pom.xml 里引用的 Spring 相关仓库没有被覆盖。
- 把 mirrorOf 改成 *,url 换成 HTTPS 的 public 聚合地址,然后执行 mvn -U clean package。
- 重新构建,依赖下载完成,整个构建几分钟内就通过了。
这个案例的教训是,settings.xml 里有配置不代表已经生效。要看覆盖范围,最好用 effective-settings 或实际日志核对一遍。
几个常见坑
IDE 里还是慢
IntelliJ IDEA 等工具可能用的是自己的 Maven 配置。去 Settings 里找到 Maven 的 User settings file,确认它指向你改过的 settings.xml,然后在 Maven 面板里点击刷新。
公司私有依赖拉不下来
内部发布的 jar 一般放在私有仓库里。mirrorOf 设成 * 之后,私有仓库的请求也会被转到阿里云,自然找不到。这时把私有仓库排除掉,写成 *,!company-repo,其中 company-repo 是 settings.xml 里该私有仓库的 id。
pom.xml 里写死了境外地址
有些项目在 repositories 节点直接写了境外地址。镜像的 mirrorOf 会拦截这些请求,通常不需要改项目代码。如果确实要调整 pom.xml,先和团队商量,免得别人构建时出现意外。
适用场景和注意事项
maven阿里云仓库适合国内网络下的日常开发和 CI 构建。镜像同步有一定延迟,刚发布的新版本依赖可能暂时拉不到,这时可以临时切回中央仓库验证。另外,如果 settings.xml 里写了私有仓库的账号和令牌,最好用环境变量或加密方式保存,不要提交进代码仓库。