Maven本地仓库默认路径为Linux/macOS的~/.m2/repository或Windows的C:\Users{用户名}.m2\repository,可通过修改~/.m2/settings.xml中的<localRepository>标签自定义路径,注意使用绝对路径且需手动迁移旧数据。

本地仓库路径默认在哪,怎么改
Java 项目中 Maven 的本地仓库默认是 ~/.m2/repository(Linux/macOS)或 C:\Users\{用户名}\.m2\repository(Windows)。这个位置由 Maven 自动创建,所有下载的依赖(.jar、.pom)都缓存在这里。
想改路径?直接修改 ~/.m2/settings.xml(若不存在可复制 $M2_HOME/conf/settings.xml 创建),在 <settings></settings> 标签下加:
<localRepository>/path/to/your/local/repo</localRepository>
注意:settings.xml 文件必须是 UTF-8 编码;路径不要以 ~ 或环境变量开头(如 $HOME),Maven 不解析这些;改完后旧仓库不会自动迁移,需手动复制或等下次构建时重下。
远程仓库怎么配:中央仓、阿里云镜像、私有 Nexus
Maven 默认只连中央仓库(https://repo.maven.apache.org/maven2/),但国内直连慢且不稳定。通常做法是配置镜像(<mirror>)或显式声明仓库(<repository>)。
立即学习“Java免费学习笔记(深入)”;
常用配置方式:
- 用阿里云镜像替代中央仓库(推荐,全局生效):在
settings.xml的<mirrors>下加
<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>Aliyun Maven</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
<mirrorOf>*</mirrorOf> 表示拦截所有仓库请求;若只想镜像中央仓,写 central;若同时用 Nexus 私服,别设为 *,否则私服请求也被转发走。
- 项目级添加私有仓库(如 Nexus):在
pom.xml的<repositories>中声明
<repository> <id>nexus-snapshots</id> <url>https://nexus.example.com/repository/maven-snapshots/</url> <releases><enabled>false</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository>
注意:<id> 必须和 settings.xml 中 <server> 的 <id> 一致(用于认证);<releases>/<snapshots> 控制是否允许拉取对应类型构件;Nexus 地址末尾斜杠不能少,否则部分版本会 404。
为什么 settings.xml 里配了镜像,但 pom.xml 还是连了中央仓
常见现象:明明 settings.xml 配了阿里云镜像,执行 mvn clean compile 却仍看到日志里出现 Downloading from central: —— 这不是失败,而是 Maven 的日志误导。
真实原因有三个:
- Maven 日志里显示的
central是仓库逻辑 ID,不是实际 URL;只要镜像<mirrorOf>匹配成功,请求就发到了镜像地址,只是日志没更新显示名 -
pom.xml显式声明了<repository>且<id>为central,会绕过镜像(镜像只作用于未显式声明的仓库) - 插件依赖(如
maven-compiler-plugin)从插件仓库下载,而插件仓库默认是pluginRepositories,需单独配镜像或声明
验证是否真走镜像:打开 ~/.m2/repository/.cache/maven-central/(或对应路径),看里面是否有 aliyun 字样缓存文件;或用 mvn -X 查看 debug 日志中实际 HTTP 请求的 URL。
多仓库共存时的优先级与冲突处理
当项目同时涉及中央仓、镜像、私有 Nexus、JitPack 等多个源,Maven 按以下顺序查找依赖:
- 先查本地仓库(
.m2/repository) - 再按
pom.xml中<repositories>声明顺序依次请求远程仓库(跳过被镜像覆盖的) - 若未声明,才 fallback 到
settings.xml中镜像所指向的目标仓库
关键点:
-
<mirrorOf>的值支持通配符,但匹配规则严格:external:*不匹配 localhost;*,!nexus表示“所有仓库,除了 id=nexus 的” - 如果两个镜像都匹配同一个仓库 ID,只有第一个生效(按 XML 顺序)
- 私有仓库应放在
pom.xml而非settings.xml,避免泄露敏感地址到团队共享配置中
最易被忽略的是:settings.xml 中的 <profiles> 激活状态会影响镜像是否启用——没激活 profile,镜像配置就等于不存在。










