惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
GbyAI
GbyAI
爱范儿
爱范儿
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
罗磊的独立博客
Recent Announcements
Recent Announcements
博客园 - 司徒正美
M
MIT News - Artificial intelligence
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
B
Blog RSS Feed
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网

博客园 - wastonl

Spring事务抛出UnexpectedRollbackException异常细节 RocketMQ消费机制整理 RocketMQ重平衡机制 @JacksonXmlElementWrapper使用限制 JSR303和SpringBoot参数校验机制 同一Java进程生产者和消费者与MqClientInstance对应关系 RocketMQ自动创建主题机制 SpringMVC异步请求 tomcat异步请求机制 Spring异步任务和定时任务 Spring ResolvableType说明 Jvm内存以及垃圾回收相关知识 RocketMQ如何保证消息可靠性 RocketMQ整体架构 mybatis-plus易忘点笔记 SpringMVC使用Resource实现二进制传输(下载) Spring事件异步执行设计与实现 Spring Bean销毁机制 Spring Lifecycle组件 Zipkin Brave使用 Spring Boot日志系统简要介绍 spring cloud sleuth基本使用 Spring懒加载与@Lazy注解 tomcat自动刷新响应输出流缓冲区 https碎碎念 ES脚本使用 SpringMVC静态资源处理 Maven插件运行方式 如何使用Maven将项目中的依赖打进jar包 时区以及时区对于Java时间类格式化的影响
maven选择settings.xml策略
wastonl · 2026-08-29 · via 博客园 - wastonl

Maven 查找 settings.xml 时,可以理解为 两层配置:全局(Global)+ 用户级(User),其中用户级优先。

注:相同的按照优先级生效,不同的会进行合并,不是单存的文件级覆盖。全局文件和用户级文件都会进行加载(如果存在的话)

1. 默认位置

级别 默认路径 优先级
用户级 ${user.home}/.m2/settings.xml
全局级 ${maven.home}/conf/settings.xml

例如 macOS:

~/.m2/settings.xml

以及 Maven 安装目录:

/opt/maven/apache-maven-3.9.x/conf/settings.xml

2. Maven 实际加载顺序

Maven 默认会加载:

${maven.home}/conf/settings.xml
        ↓
${user.home}/.m2/settings.xml

可以把它理解成:

Global settings
      +
User settings
      ↓
Effective settings

用户级配置覆盖全局级配置。

例如全局:

<settings>
    <localRepository>/data/maven/repository</localRepository>
</settings>

用户:

<settings>
    <localRepository>/Users/xxx/.m2/repository</localRepository>
</settings>

最终使用用户级的:

/Users/xxx/.m2/repository

3. -s 可以指定用户 settings

执行:

mvn -s /tmp/settings.xml clean install

此时指定的 settings.xml 会作为 User Settings

也就是说:

mvn -s xxx/settings.xml

相当于告诉 Maven:

不使用默认的 ~/.m2/settings.xml,使用我指定的这个文件作为用户级 settings。

4. -gs 可以指定全局 settings

还有一个容易混淆的参数:

mvn -gs /tmp/global-settings.xml clean install

它指定的是:

Global Settings

所以:

mvn -s user.xml -gs global.xml

可以同时指定两套配置:

global.xml
    ↓
user.xml
    ↓
最终 Effective Settings

5. 一个比较完整的优先级关系

可以记成:

                    Maven 参数
                       │
              ┌────────┴────────┐
              │                 │
             -gs               -s
              │                 │
              ▼                 ▼
        Global Settings     User Settings
              │                 │
              │                 │
              └────────┬────────┘
                       ↓
              Effective Settings

默认情况下则是:

${maven.home}/conf/settings.xml
              │
              ▼
${user.home}/.m2/settings.xml
              │
              ▼
      Effective Settings

6. 怎么确认 Maven 到底用了哪个?

最实用的是:

mvn help:effective-settings

它会把 Maven 最终合并后的配置打印出来。

如果想看 Maven 的环境信息:

mvn -version

可以看到类似:

Apache Maven 3.9.x
Maven home: /xxx/apache-maven-3.9.x
Java version: 21

那么全局 settings 就可以推断为:

/xxx/apache-maven-3.9.x/conf/settings.xml

7. 一个很容易踩坑的地方

IDEA / Eclipse / Jenkins / CI 使用的 Maven,不一定是你命令行的 Maven。

例如命令行:

mvn -version

显示:

Maven home: /opt/maven

那么它找:

/opt/maven/conf/settings.xml

但 IDEA 可能配置了自己的 Maven:

Settings
  → Build, Execution, Deployment
  → Build Tools
  → Maven

甚至 IDEA 可以直接指定:

User settings file:
    /xxx/settings.xml

这时你会发现:

mvn clean package

和 IDEA 点击 Maven 构建,使用的 settings.xml 不一样。