Maven 的 settings.xml详解
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
),避免影响全局环境。