乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 介绍与核心概念

    • Maven是什么
    • 约定优于配置
  • 第2章 安装与配置

    • 安装与验证
    • settings.xml
    • 本地仓库与镜像
  • 第3章 POM与项目坐标

    • POM
    • GAV坐标
    • packaging
  • 第4章 标准目录布局

    • 标准目录布局
  • 第5章 依赖机制

    • dependencies
    • scope
    • 依赖传递
    • 依赖冲突与调解
    • exclusions
    • optional
    • dependencyManagement
  • 第6章 仓库

    • 仓库体系
    • 本地仓库
    • 远程仓库与镜像
    • 私服
  • 第7章 构建生命周期

    • 生命周期概述
    • clean 生命周期
    • default 生命周期
    • site 生命周期
    • 生命周期与插件绑定
  • 第8章 插件

    • 插件概述
    • maven-compiler-plugin
    • maven-surefire-plugin
    • maven-war-plugin
  • 第9章 继承与聚合

    • parent继承
    • 聚合
    • BOM
    • properties
  • 第10章 属性与资源过滤

    • 资源过滤
    • Profile
  • 第11章 常用命令

    • mvn compile
    • mvn test
    • mvn package
    • mvn clean
    • mvn install
    • mvn dependency:tree
  • 第12章 常见问题与最佳实践

    • 依赖冲突排查
    • 最佳实践

settings.xml

本章承接"安装与验证",深入讲解 Maven 的行为配置文件。如果说 mvn -v 验证了 Maven"能不能跑",那么 settings.xml 就决定了 Maven"怎么跑"——去哪里下载依赖、用什么账号连接私服、本地仓库放在哪。


核心机制

settings.xml 包含用于定义配置 Maven 执行方式的各种值的元素。官方明确区分了两种配置:

  1. 项目级配置:pom.xml,描述项目"是什么"(坐标、依赖、构建方式)
  2. 用户/全局级配置:settings.xml,描述 Maven"怎么跑"(仓库位置、镜像、认证信息)

关键原则:settings.xml 不描述项目本身,只描述 Maven 运行时的环境行为。因此它不会被提交到版本控制(Git),而 pom.xml 必须提交。

两个 settings.xml:全局 vs 用户

Maven 启动时会寻找两个 settings.xml 文件,它们有明确的优先级关系:

层级文件路径作用范围修改者
全局(Global)${maven.home}/conf/settings.xml影响本台机器上所有用户的 Maven 行为运维/管理员
用户(User)${user.home}/.m2/settings.xml只影响当前用户的 Maven 行为开发者自己
  • 全局文件:位于 Maven 安装目录的 conf/ 下。例如 C:\apache-maven-3.9.6\conf\settings.xml。这是 Maven 安装包自带的默认配置,任何修改都会影响这台机器上的所有开发者。
  • 用户文件:位于当前用户主目录的 .m2/ 下。例如 C:\Users\小崔\.m2\settings.xml。如果该文件不存在,开发者可以手动创建。这个文件只对小崔自己生效,不影响同机其他用户。

优先级规则:用户配置覆盖全局配置

当两个文件同时存在且配置了相同元素时,Maven 采用**"用户覆盖全局"**的策略:

  1. Maven 先加载全局 settings.xml,获得基础配置
  2. 再加载用户 settings.xml,用其中的同名配置覆盖全局值
  3. 最终生效的是合并后的配置,其中冲突项以用户配置为准

这个设计的意图是:管理员设定团队基准,开发者保留个性化调整的空间。例如,管理员在全局配置中指定了公司私服地址,但开发者可以在用户配置中把本地仓库改到 D 盘(因为 C 盘空间不足)。

生活类比:公司制度与个人偏好

想象飞翔科技的办公环境:

  • 全局 settings.xml 就像公司发布的《员工手册》:所有人必须遵守,规定了上下班时间、报销流程、代码提交规范。由行政部(运维李眉)统一制定和维护。
  • 用户 settings.xml 就像你工位上的个人设置:你的显示器亮度、键盘布局、椅子高度。由你自己(小崔)决定,不影响隔壁同事。

如果公司手册说"上班时间是 9:00",但你自己习惯 8:30 到公司——你的个人偏好不会覆盖公司制度。但如果公司手册说"默认使用 C 盘作为工作目录",而你在个人设置里把项目目录改到了 D 盘——这个个人设置优先,因为不影响他人。


图示

上图展示了两个 settings.xml 的协作关系:全局配置提供默认值,用户配置提供个性化覆盖。最终生效的是一个"合并视图",既保证了团队一致性,又保留了个体灵活性。


完整示例

场景

飞翔科技的开发团队有 5 人:大翔(CTO)、白歌(架构师)、小崔(后端)、黄俪(前端)、李眉(运维)。李眉在每台开发机上统一安装了 Maven 3.9.6,现在需要配置 settings.xml,让团队既能统一行为,又能保留个人调整空间。

操作前:文件状态

李眉检查小崔的新电脑,发现:

  • 全局 settings.xml 存在(Maven 安装自带),位于 C:\apache-maven-3.9.6\conf\settings.xml
  • 用户 settings.xml 不存在,.m2/ 目录也不存在

操作步骤

步骤 1:李眉配置全局 settings.xml

李眉作为运维,在全局配置中设定团队的基准规则——本地仓库统一放在 D 盘(避免 C 盘空间不足),并预留镜像配置位:

<!-- C:\apache-maven-3.9.6\conf\settings.xml -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0
                              https://maven.apache.org/xsd/settings-1.2.0.xsd">

    <!-- 全局本地仓库:团队统一放在 D 盘 -->
    <localRepository>D:/maven-repo</localRepository>

    <!-- 镜像占位:由用户配置覆盖 -->
    <mirrors>
        <!-- 默认空,允许用户自行配置加速镜像 -->
    </mirrors>

    <!-- 私服认证占位 -->
    <servers>
        <!-- 由用户配置各自账号 -->
    </servers>

    <!-- 默认 profile:JDK 17 -->
    <profiles>
        <profile>
            <id>jdk-17</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
            </properties>
        </profile>
    </profiles>

</settings>

步骤 2:小崔创建用户 settings.xml

小崔入职后,发现公司网络访问 Maven 中央仓库较慢,白歌建议他配置阿里云镜像。小崔在自己的用户目录下创建 .m2/settings.xml:

<!-- C:\Users\小崔\.m2\settings.xml -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0
                              https://maven.apache.org/xsd/settings-1.2.0.xsd">

    <!-- 小崔把本地仓库改到更大的 E 盘(覆盖全局的 D 盘) -->
    <localRepository>E:/maven-repo-xiaocui</localRepository>

    <!-- 阿里云镜像:加速依赖下载 -->
    <mirrors>
        <mirror>
            <id>aliyunmaven</id>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>

    <!-- 公司私服账号(仅小崔个人使用) -->
    <servers>
        <server>
            <id>feixiang-nexus</id>
            <username>xiaocui</username>
            <password>{加密密码或明文}</password>
        </server>
    </servers>

</settings>

步骤 3:验证优先级

小崔执行命令查看生效配置:

mvn help:effective-settings

关键输出片段:

<settings ...>
    <!-- 本地仓库:用户配置覆盖了全局配置 -->
    <localRepository>E:\maven-repo-xiaocui</localRepository>

    <!-- 镜像:来自用户配置 -->
    <mirrors>
        <mirror>
            <id>aliyunmaven</id>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>

    <!-- profile:来自全局配置(用户未覆盖) -->
    <profiles>
        <profile>
            <id>jdk-17</id>
            <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
            </properties>
        </profile>
    </profiles>
</settings>

操作结果及分析

配置项全局值用户值最终生效值说明
localRepositoryD:/maven-repoE:/maven-repo-xiaocuiE 盘用户覆盖全局
mirrors空阿里云镜像阿里云用户补充全局
profiles/jdk-17JDK 17未声明JDK 17继承全局默认值
servers空小崔私服账号小崔账号用户补充全局

这个结果完美体现了 settings.xml 的设计哲学:团队基准由运维统一维护,个人需求由开发者自行覆盖,两者互不冲突。


易错点与常见问题

误区一:把 settings.xml 提交到 Git

错误做法:小崔把 C:\Users\小崔\.m2\settings.xml 复制到项目目录,提交到 Git 仓库。

后果:

  • 黄俪拉下代码后,小崔的本地仓库路径(E:/maven-repo-xiaocui)在黄俪的 Mac 上不存在,导致构建失败
  • 小崔的私服密码被泄露到代码仓库,存在安全风险

纠正:settings.xml 是环境配置,不是项目配置。它描述的是"这台机器/这个用户怎么跑 Maven",而不是"这个项目是什么"。正确的做法是:

  • pom.xml → 提交到 Git(项目定义)
  • settings.xml → 不提交到 Git(环境定义),由团队 Wiki 或运维脚本分发

误区二:在用户 settings.xml 里写项目依赖

错误配置:小崔想在所有项目里都用 Spring Boot,于是在 settings.xml 里写:

<!-- 错误!settings.xml 里不能写 dependencies -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>

后果:settings.xml 的 Schema 不允许 <dependencies> 标签,Maven 启动时会直接报错解析失败。

纠正:依赖声明只能在 pom.xml 里。settings.xml 能配置的元素非常有限,主要包括:

  • localRepository:本地仓库路径
  • mirrors:镜像服务器
  • servers:私服认证信息
  • profiles:环境特定的属性(如 JDK 版本)
  • activeProfiles:默认激活的 profile
  • pluginGroups:插件搜索路径

误区三:修改全局配置却不通知团队

错误做法:李眉某天把全局 settings.xml 里的本地仓库从 D 盘改到了网络共享盘 \\nas\\maven-repo,没有发邮件通知团队。

后果:第二天小崔来上班,执行 mvn compile,发现所有依赖都要重新下载(因为本地仓库路径变了,原来的缓存失效),一上午都在等下载。

纠正:全局 settings.xml 影响所有人,修改前必须:

  1. 在团队群里发通知
  2. 确认新路径对所有开发者可访问(权限、网络)
  3. 考虑迁移旧本地仓库的缓存,避免重复下载

小结

settings.xml 是 Maven 的运行时行为配置文件,分为全局(${maven.home}/conf/)和用户(${user.home}/.m2/)两个层级。用户配置优先级高于全局配置,冲突时以用户为准。它的职责是定义"Maven 怎么跑"(仓库位置、镜像、认证),而非"项目是什么"(坐标、依赖),因此不应提交到版本控制。

本章与全局的关系:本章讲解了 Maven 的行为配置机制。下一章"本地仓库与镜像"将深入讲解 settings.xml 中最常用的两个配置项——localRepository 和 mirror,它们直接决定了依赖下载的速度和存储位置。

上一页
安装与验证
下一页
本地仓库与镜像