Maven 的 settings.xml
是 Maven 的核心配置文件之一,用于定义 Maven 的全局或用户级行为,例如仓库地址、认证信息、代理设置、环境变量等。它通常位于以下两个位置:
- 全局配置 :
${M2_HOME}/conf/settings.xml
(影响所有用户) - 用户配置 :
${USER_HOME}/.m2/settings.xml
(仅当前用户生效,优先级高于全局配置)
以下是 settings.xml
的详细说明,按功能模块分类讲解:
一、基础配置
1. <localRepository>
:本地仓库路径
定义 Maven 本地仓库的存储位置(默认:~/.m2/repository
)。
作用 :所有下载的依赖、上传的构件都会存储在此目录。
示例:
<localRepository>/path/to/my/local/repo</localRepository>
2. <interactiveMode>
:交互模式
布尔值(true
/false
),默认 true
。
作用 :当 Maven 需要用户输入时(如确认覆盖文件),是否启用交互式提示。
示例:
<interactiveMode>true</interactiveMode>
3. <offline>
:离线模式
布尔值(true
/false
),默认 false
。
作用 :若设为 true
,Maven 不会尝试连接远程仓库,仅使用本地仓库的依赖。
适用场景 :网络不稳定时临时离线构建。
示例:
<offline>false</offline>
二、远程仓库与镜像配置
1. <mirrors>
:镜像仓库
定义远程仓库的镜像,用于加速下载或替换默认仓库(如中央仓库)。
核心属性:
id
:镜像的唯一标识(需唯一)。name
:镜像的描述名称。url
:镜像仓库的地址(如阿里云镜像)。mirrorOf
:指定要镜像的目标仓库(支持通配符):*
:镜像所有仓库请求。central
:仅镜像 Maven 中央仓库(id
为central
的仓库)。external-repo-id
:镜像指定id
的远程仓库。
常见场景 :用阿里云镜像替代 Maven 中央仓库(加速国内下载)。
示例:
<mirrors>
<!-- 阿里云公共仓库镜像 -->
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>*</mirrorOf> <!-- 镜像所有仓库请求 -->
</mirror>
</mirrors>
2. <profiles>
:环境配置集
定义不同环境(如开发、测试、生产)的仓库地址、插件仓库或属性,通过 <activation>
激活生效。
(1)<repository>
:远程仓库声明
定义项目依赖的远程仓库地址(覆盖 pom.xml
中的 <repositories>
)。
核心属性:
-
id
:仓库唯一标识(需与<servers>
中的认证id
匹配,否则无法下载私有构件)。 -
name
:仓库描述。 -
url
:仓库地址(如 Nexus 私服:http://nexus.example.com/repository/maven-public/
)。 -
releases
/snapshots
:控制是否启用该仓库的发布版/快照版依赖(可选)。
示例:<releases> <enabled>true</enabled> <!-- 启用发布版 --> <updatePolicy>never</updatePolicy> <!-- 更新策略:never(不更新)、daily(每日)、interval:X(X分钟) --> <checksumPolicy>warn</checksumPolicy> <!-- 校验和策略:ignore(忽略)、fail(失败)、warn(警告) --> </releases> <snapshots> <enabled>true</enabled> <!-- 启用快照版 --> </snapshots>
(2)<pluginRepositories>
:插件仓库声明
定义 Maven 插件的远程仓库地址(覆盖 pom.xml
中的 <pluginRepositories>
),用法同 <repository>
。
(3)<activation>
:激活条件
定义 profile
何时生效(如 JDK 版本、操作系统、属性值等)。
常见激活方式:
- JDK 版本 :
<jdk>1.8</jdk>
(匹配 JDK 1.8 及以上)。 - 操作系统 :
<os><name>Windows</name></os>
(匹配 Windows 系统)。 - 文件存在性 :
<file><exists>path/to/file</exists></file>
(文件存在时激活)。 - 属性值 :
<property><name>env</name><value>prod</value></property>
(系统属性env=prod
时激活)。 - 默认激活 :
<activeByDefault>true</activeByDefault>
(无其他激活条件时生效)。
示例:多环境 Profile
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault> <!-- 默认激活 -->
<jdk>11</jdk>
</activation>
<repositories>
<repository>
<id>dev-nexus</id>
<url>http://nexus.example.com/repository/dev/</url>
</repository>
</repositories>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>prod</value> <!-- 执行 mvn 命令时添加 -Denv=prod 激活 -->
</property>
</activation>
<repositories>
<repository>
<id>prod-nexus</id>
<url>http://nexus.example.com/repository/prod/</url>
</repository>
</repositories>
</profile>
</profiles>
三、服务器认证(<servers>
)
定义远程仓库的认证信息(如私服的用户名/密码),用于部署构件(mvn deploy
)或访问需要认证的仓库。
核心规则 :server
的 id
必须与 pom.xml
中 <distributionManagement>
或 <repositories>
中的仓库 id
完全一致。
示例:
<servers>
<!-- 私服发布仓库认证 -->
<server>
<id>nexus-releases</id> <!-- 与 pom.xml 中 repository 的 id 一致 -->
<username>admin</username> <!-- 私服用户名 -->
<password>123456</password> <!-- 私服密码 -->
</server>
<!-- 私服快照仓库认证 -->
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
四、代理配置(<proxies>
)
当需要通过代理服务器访问互联网时,配置代理信息(如公司内网需要通过 HTTP 代理访问外网)。
核心属性:
id
:代理唯一标识。active
:是否启用(true
/false
)。protocol
:代理协议(如http
、https
、socks
)。host
:代理服务器地址。port
:代理端口(如8080
)。nonProxyHosts
:绕过代理的主机列表(用|
分隔,支持通配符*
)。
示例:
<proxies>
<proxy>
<id>http-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.example.com</host>
<port>8080</port>
<nonProxyHosts>localhost|*.example.com</nonProxyHosts> <!-- 这些主机不通过代理 -->
</proxy>
</proxies>
五、环境变量与属性(<properties>
)
定义全局变量,供 pom.xml
或其他配置使用(类似 Maven 的 ${property.name}
占位符)。
常见用途:
- 统一管理版本号(如
spring.version=5.3.0
)。 - 定义路径变量(如
project.build.dir=./target
)。 - 传递系统属性(如
java.home
)。
示例:
<properties>
<!-- 自定义属性 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<!-- 依赖版本统一管理 -->
<spring.version>5.3.23</spring.version>
<junit.version>5.8.2</junit.version>
</properties>
在 pom.xml
中使用:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
六、其他高级配置
1. <pluginGroups>
:插件组
定义插件组的前缀,简化插件调用(适用于非标准 Maven 插件)。
示例:
<pluginGroups>
<pluginGroup>com.example.plugins</pluginGroup> <!-- 插件组前缀 -->
</pluginGroups>
<!-- 调用时使用前缀:插件名 -->
<plugin>
<groupId>com.example.plugins</groupId>
<artifactId>my-plugin</artifactId>
<version>1.0.0</version>
</plugin>
2. <servers>
与 <distributionManagement>
的关系
<servers>
中的id
对应<distributionManagement>
中<repository>
或<snapshotRepository>
的id
。- 当执行
mvn deploy
时,Maven 会根据构件的类型(发布版/快照版)选择对应的仓库,并使用<servers>
中的认证信息。
七、完整示例(用户级 settings.xml)
以下是一个典型的用户级 settings.xml
配置,包含镜像、Profile、代理和认证:
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- 本地仓库路径 -->
<localRepository>/Users/yourname/.m2/my-repo</localRepository>
<!-- 镜像:阿里云公共仓库 -->
<mirrors>
<mirror>
<id>aliyunmaven</id>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
<!-- 代理配置(公司内网需要) -->
<proxies>
<proxy>
<id>http-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.company.com</host>
<port>8080</port>
<nonProxyHosts>localhost|*.company.com</nonProxyHosts>
</proxy>
</proxies>
<!-- 多环境 Profile -->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>dev-nexus</id>
<url>http://nexus.company.com/repository/dev/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>prod</id>
<activation>
<property><name>env</name><value>prod</value></property>
</activation>
<repositories>
<repository>
<id>prod-nexus</id>
<url>http://nexus.company.com/repository/prod/</url>
<releases><enabled>true</enabled></releases>
</repository>
</repositories>
</profile>
</profiles>
<!-- 私服认证 -->
<servers>
<server>
<id>dev-nexus</id>
<username>dev-user</username>
<password>dev-pass</password>
</server>
<server>
<id>prod-nexus</id>
<username>prod-user</username>
<password>prod-pass</password>
</server>
</servers>
</settings>
总结
settings.xml
是 Maven 的核心配置文件,主要用于:
- 管理本地仓库位置。
- 配置远程仓库镜像(加速下载)。
- 定义多环境(开发/测试/生产)的依赖源。
- 配置代理访问互联网。
- 存储私有仓库的认证信息。
- 统一管理全局属性(如版本号、编码)。
合理配置 settings.xml
可以显著提升构建效率,避免依赖下载慢、认证失败等问题。建议将个性化配置放在用户级 settings.xml
(${USER_HOME}/.m2/settings.xml
),避免影响全局环境。