Maven settings.xml 配置详解

每次换电脑或者重装系统,都要重新配置Maven的settings.xml文件。里面的配置项不少,很多都不记得是干什么的。
这里整理下相关内容。

settings.xml 的位置

settings.xml文件可以在两个位置:

1. 用户级别配置

${user.home}/.m2/settings.xml

在macOS和Linux上是 ~/.m2/settings.xml,在Windows上是 C:\Users\你的用户名\.m2\settings.xml

2. 全局配置

${maven.home}/conf/settings.xml

用户级别配置优先级更高,会覆盖全局配置。

完整配置示例(带注释)

先给你一个完整的settings.xml配置文件,每一项都加了注释说明:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
​
    <!-- 本地仓库路径:Maven下载的jar包存放位置 -->
    <!-- 默认值:${user.home}/.m2/repository -->
    <localRepository>${user.home}/.m2/repository</localRepository>
​
    <!-- 是否离线模式:true表示不联网,false表示正常联网 -->
    <offline>false</offline>
​
    <!-- 交互模式:true表示构建时会提示用户输入,false表示使用默认值 -->
    <interactiveMode>true</interactiveMode>
​
    <!-- 插件组:当使用插件时,如果没指定groupId,会在这里查找 -->
    <pluginGroups>
        <pluginGroup>org.apache.maven.plugins</pluginGroup>
        <pluginGroup>org.codehaus.mojo</pluginGroup>
    </pluginGroups>
​
    <!-- 代理配置:如果网络需要代理访问外网,在这里配置 -->
    <proxies>
        <proxy>
            <id>my-proxy</id>
            <active>true</active>
            <protocol>http</protocol>
            <host>proxy.example.com</host>
            <port>8080</port>
            <username>代理用户名(如果需要)</username>
            <password>代理密码(如果需要)</password>
            <!-- 不走代理的主机,用|分隔 -->
            <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
        </proxy>
    </proxies>
​
    <!-- 服务器认证:部署到私服时需要的用户名密码 -->
    <servers>
        <!-- 私服发布仓库认证 -->
        <server>
            <id>my-nexus-releases</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
        <!-- 私服快照仓库认证 -->
        <server>
            <id>my-nexus-snapshots</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
    </servers>
​
    <!-- 镜像配置:用国内镜像加速Maven中央仓库下载 -->
    <mirrors>
        <!-- 阿里云镜像 -->
        <mirror>
            <id>aliyun</id>
            <name>Aliyun Maven</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <!-- mirrorOf=central表示替代Maven中央仓库 -->
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>
​
    <!-- Profile配置:一组配置,可以在不同环境下激活 -->
    <profiles>
        <!-- JDK 17配置 -->
        <profile>
            <id>jdk-17</id>
            <!-- 激活条件:默认激活 -->
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>17</jdk>
            </activation>
            <!-- 属性配置 -->
            <properties>
                <maven.compiler.source>17</maven.compiler.source>
                <maven.compiler.target>17</maven.compiler.target>
                <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
            </properties>
        </profile>
​
        <!-- JDK 1.8配置 -->
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>false</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
​
        <!-- 开发环境配置 -->
        <profile>
            <id>dev</id>
            <properties>
                <env>dev</env>
                <db.url>jdbc:mysql://localhost:3306/dev</db.url>
            </properties>
            <!-- 仓库配置 -->
            <repositories>
                <repository>
                    <id>aliyun</id>
                    <url>https://maven.aliyun.com/repository/public</url>
                    <releases><enabled>true</enabled></releases>
                    <snapshots><enabled>false</enabled></snapshots>
                </repository>
            </repositories>
        </profile>
​
        <!-- 生产环境配置 -->
        <profile>
            <id>prod</id>
            <properties>
                <env>production</env>
                <db.url>jdbc:mysql://prod-db:3306/prod</db.url>
            </properties>
        </profile>
    </profiles>
​
    <!-- 激活的Profile:指定默认激活哪些profile -->
    <activeProfiles>
        <activeProfile>jdk-17</activeProfile>
        <activeProfile>dev</activeProfile>
    </activeProfiles>
​
</settings>

各配置项详细说明

下面结合我本地的配置文件,逐个说明每个配置项的用途。

1. localRepository - 本地仓库路径

指定Maven本地仓库的位置。

<localRepository>/Users/smalleyes/environment/maven_repository</localRepository>

默认值${user.home}/.m2/repository

说明

Maven会把下载的jar包、插件都存放在本地仓库。默认在用户目录下的.m2/repository

我改成了自定义路径 /Users/smalleyes/environment/maven_repository,主要是想统一管理开发工具的依赖文件。

为什么改?

  • 默认路径在系统盘,占用C盘空间
  • 方便备份和迁移
  • 多个Maven版本可以共用同一个本地仓库

如果不配置

就用默认的 ~/.m2/repository

2. pluginGroups - 插件组

<pluginGroups>
</pluginGroups>

说明

这是插件组ID列表。当你在pom.xml中使用插件时,如果没有指定完整的groupId,Maven会在这个列表里查找。

举例说明

比如你在pom.xml里这样配置插件:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
</plugin>

没有指定groupId,Maven会去pluginGroups里找。如果配置了:

<pluginGroups>
    <pluginGroup>org.apache.maven.plugins</pluginGroup>
    <pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>

Maven会自动尝试 org.apache.maven.plugins:maven-compiler-pluginorg.codehaus.mojo:maven-compiler-plugin

我的配置是空的

因为大部分情况下,我都会在pom.xml里写完整的groupId和artifactId,所以这个配置没填。

3. proxies - 代理配置

<proxies>
</proxies>

说明

如果你的网络需要通过代理访问外网,需要在这里配置代理信息。

示例配置

<proxies>
    <proxy>
        <id>my-proxy</id>
        <active>true</active>
        <protocol>http</protocol>
        <host>proxy.example.com</host>
        <port>8080</port>
        <username>proxyuser</username>
        <password>proxypass</password>
        <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts>
    </proxy>
</proxies>

字段说明

  • id:代理的唯一标识
  • active:是否激活
  • protocol:代理协议(http、https、socks等)
  • host:代理服务器地址
  • port:代理端口
  • username/password:代理认证信息(如果需要)
  • nonProxyHosts:不走代理的主机,用 | 分隔

我的配置是空的

公司网络不需要代理,所以没配置。

什么时候需要

  • 公司网络有限制,需要通过代理访问外网Maven仓库
  • 某些内网环境

4. servers - 服务器认证

<servers>
    <!-- 私服认证信息  -->
    <!--  <server>
      <id>releases</id>
      <username>admin</username>
      <password>admin123</password>
    </server>
    <server>
      <id>snapshots</id>
      <username>admin</username>
      <password>admin123</password>
    </server> -->
</servers>

说明

配置Maven仓库的认证信息。当Maven需要部署(deploy)构件到私服时,需要用户名和密码。

示例配置

<servers>
    <!-- Nexus私服 -->
    <server>
        <id>my-nexus</id>
        <username>admin</username>
        <password>admin123</password>
    </server>

    <!-- 阿里云云效 -->
    <server>
        <id>aliyun-releases</id>
        <username>你的账号</username>
        <password>你的密码</password>
    </server>

    <!-- GitHub Packages -->
    <server>
        <id>github</id>
        <username>你的GitHub用户名</username>
        <password>GitHub Token</password>
    </server>
</servers>

重要

这里的 <id> 要和pom.xml里distributionManagement的repository id对应上:

<distributionManagement>
    <repository>
        <id>my-nexus</id>
        <url>http://你的私服地址/releases</url>
    </repository>
</distributionManagement>

我的配置被注释了

因为暂时不需要部署到私服,所以注释掉了。

5. mirrors - 镜像配置

<mirrors>
    <mirror>
        <!-- 公共镜像 -->
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

说明

镜像仓库用来替代远程仓库。最常见的场景就是用国内镜像加速Maven中央仓库的下载。

字段说明

  • id:镜像的唯一标识
  • name:镜像名称
  • url:镜像地址
  • mirrorOf:被镜像的仓库ID

mirrorOf 的几种写法

<!-- 替代中央仓库 -->
<mirrorOf>central</mirrorOf>

<!-- 替代多个仓库,用逗号分隔 -->
<mirrorOf>central,repo1,repo2</mirrorOf>

<!-- 替代所有仓库 -->
<mirrorOf>*</mirrorOf>

<!-- 除了某个仓库,其他都镜像 -->
<mirrorOf>*,!repo1</mirrorOf>

常用国内镜像

<mirrors>
    <!-- 阿里云 -->
    <mirror>
        <id>aliyun</id>
        <name>Aliyun Maven</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

    <!-- 腾讯云 -->
    <mirror>
        <id>tencent</id>
        <name>Tencent Maven</name>
        <url>https://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>

    <!-- 华为云 -->
    <mirror>
        <id>huaweicloud</id>
        <name>Huawei Cloud Maven</name>
        <url>https://repo.huaweicloud.com/repository/maven/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

我的配置

用了阿里云镜像,替换Maven中央仓库。下载速度快很多。

6. profiles - Profile配置

Profile是Maven的一组配置,可以在不同环境下激活不同的配置。

我本地配置了两个profile:

<profiles>
    <!-- JDK 版本17-->
    <profile>
        <id>jdk-17</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>17</jdk>
        </activation>
        <properties>
            <JAVA_HOME>/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home</JAVA_HOME>
            <maven.compiler.source>17</maven.compiler.source>
            <maven.compiler.target>17</maven.compiler.target>
            <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
        </properties>
    </profile>

    <!-- JDK 版本8-->
    <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>false</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>
</profiles>

说明

我配置了JDK 17和JDK 1.8两个profile,JDK 17默认激活。

profile 的激活方式

1. 默认激活

<activation>
    <activeByDefault>true</activeByDefault>
</activation>

2. 命令行激活

mvn clean install -P jdk-1.8

3. JDK版本激活

<activation>
    <jdk>17</jdk>
</activation>

4. 操作系统激活

<activation>
    <os>
        <family>windows</family>
    </os>
</activation>

5. 文件存在激活

<activation>
    <file>
        <exists>/path/to/file</exists>
    </file>
</activation>

profile 里可以配置什么

<profile>
    <id>my-profile</id>

    <!-- 激活条件 -->
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>

    <!-- 属性 -->
    <properties>
        <my.property>value</my.property>
    </properties>

    <!-- 仓库 -->
    <repositories>
        <repository>
            <id>my-repo</id>
            <url>http://my-repo</url>
        </repository>
    </repositories>

    <!-- 插件仓库 -->
    <pluginRepositories>
        <pluginRepository>
            <id>my-plugin-repo</id>
            <url>http://my-plugin-repo</url>
        </pluginRepository>
    </pluginRepositories>

    <!-- 插件配置 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

常见使用场景

  • 不同环境的配置(开发、测试、生产)
  • 不同JDK版本的切换
  • 不同操作系统的配置

我配置文件中没有涉及的其他配置项

1. activeProfiles - 激活的Profile

作用:指定默认激活的profile。

<activeProfiles>
    <activeProfile>jdk-17</activeProfile>
    <activeProfile>my-profile</activeProfile>
</activeProfiles>

说明

这等价于在命令行执行 mvn -P jdk-17,my-profile

使用场景

  • 想让某些profile默认激活,又不想在profile里写 activeByDefault

2. offline - 离线模式

作用:设置Maven是否在离线模式下运行。

<offline>false</offline>

默认值false

说明

  • true:Maven不会联网下载任何依赖,所有依赖都必须在本地仓库
  • false:正常模式,会联网下载依赖

使用场景

  • 网络不通的环境
  • 已下载完所有依赖,不想联网验证

命令行等效

mvn clean install -o

3. interactiveMode - 交互模式

作用:设置Maven是否与用户交互。

<interactiveMode>true</interactiveMode>

默认值true

说明

  • true:Maven会在需要时提示用户输入(比如版本号)
  • false:Maven使用默认值,不提示用户

使用场景

  • CI/CD自动化构建,设为 false
  • 本地开发,保持 true

最后

settings.xml文件配置项不多,但每个都挺实用的。

本地仓库路径、镜像配置、Profile这几个是最常用的。其他的根据实际情况配置就好。

我把这些整理出来,以后换电脑或者帮别人配置Maven的时候,直接照着来就行。

如果你有其他配置技巧,也欢迎补充。

最后修改:2026 年 01 月 25 日
如果觉得我的文章对你有用,请随意赞赏