Maven的配置
作为上层开发者 ,需重点关注conf/settings.xml文件,它是maven的全局配置,也可通过项目中的.mvn目录设置当前项目的配置,优先级为:
- 项目级配置(
.mvn目录)> 全局配置(conf/settings.xml)。
全局配置
Maven 的全局配置主要通过安装目录下的 conf/settings.xml 文件实现,它定义了 Maven 全局的仓库、镜像、代理、认证等核心配置,作用于所有使用该 Maven 安装实例的项目。
与项目级配置(.mvn/settings.xml)和用户级配置(~/.m2/settings.xml)相比,全局 settings.xml 优先级最低(用户级 > 项目级 > 全局级),但适合配置团队共用的基础规则(如公司内部仓库镜像)。
settings.xml 的核心作用
- 定义本地仓库路径(默认
~/.m2/repository)。 - 配置远程仓库的镜像(加速依赖下载,如阿里云镜像)。
- 设置代理服务器(适用于企业内网环境)。
- 配置私有仓库的认证信息(账号密码)。
- 定义构建时的
profiles(环境隔离,如开发 / 生产环境)。
settings.xml 完整语法结构
settings.xml 采用 XML 格式,根元素为 <settings>,核心子元素结构如下(带 * 表示可选):
xml
<?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 https://maven.apache.org/xsd/settings-1.2.0.xsd">
<!-- 1. 本地仓库路径(默认:~/.m2/repository) -->
<localRepository>/path/to/local/repo</localRepository>
<!-- 2. 交互式模式是否需要密码(默认true) -->
<interactiveMode>true</interactiveMode>
<!-- 3. 是否使用离线模式(默认false,离线时不下载远程依赖) -->
<offline>false</offline>
<!-- 4. 全局仓库镜像配置(核心!加速依赖下载) -->
<mirrors>
<mirror>
<id>mirror-id</id> <!-- 镜像唯一标识 -->
<name>mirror-name</name> <!-- 镜像名称(可选) -->
<url>https://mirror-repo-url</url> <!-- 镜像仓库地址 -->
<mirrorOf>central</mirrorOf> <!-- 镜像对应的原始仓库ID(central为Maven中央仓库) -->
</mirror>
</mirrors>
<!-- 5. 服务器认证信息(私有仓库的账号密码) -->
<servers>
<server>
<id>server-id</id> <!-- 与仓库ID对应,必须一致 -->
<username>your-username</username> <!-- 账号 -->
<password>your-password</password> <!-- 密码(建议加密) -->
<!-- 其他可选:私钥/公钥路径(用于SSH认证) -->
<privateKey>/path/to/private-key</privateKey>
<passphrase>key-passphrase</passphrase>
</server>
</servers>
<!-- 6. 代理服务器配置(企业内网访问外网时使用) -->
<proxies>
<proxy>
<id>proxy-id</id> <!-- 代理唯一标识 -->
<active>true</active> <!-- 是否启用(默认true) -->
<protocol>http</protocol> <!-- 代理协议(http/https) -->
<host>proxy-host</host> <!-- 代理服务器地址 -->
<port>8080</port> <!-- 代理端口 -->
<username>proxy-user</username> <!-- 代理账号(可选) -->
<password>proxy-pass</password> <!-- 代理密码(可选) -->
<nonProxyHosts>localhost|127.0.0.1|*.company.com</nonProxyHosts> <!-- 不使用代理的地址 -->
</proxy>
</proxies>
<!-- 7. 配置文件(profiles):用于环境隔离(如开发/测试/生产) -->
<profiles>
<profile>
<id>dev</id> <!-- 配置文件ID -->
<!-- 激活条件(可选,可通过命令行 -Pdev 手动激活) -->
<activation>
<activeByDefault>true</activeByDefault> <!-- 是否默认激活 -->
<jdk>1.8</jdk> <!-- 当JDK版本匹配时激活 -->
<os> <!-- 当操作系统匹配时激活 -->
<name>Windows 10</name>
<family>windows</family>
</os>
</activation>
<!-- 配置文件专属的仓库 -->
<repositories>
<repository>
<id>dev-repo</id>
<url>https://dev-repo-url</url>
<releases><enabled>true</enabled></releases> <!-- 是否启用正式版 -->
<snapshots><enabled>true</enabled></snapshots> <!-- 是否启用快照版 -->
</repository>
</repositories>
<!-- 配置文件专属的插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>dev-plugin-repo</id>
<url>https://dev-plugin-repo-url</url>
</pluginRepository>
</pluginRepositories>
<!-- 配置文件专属的属性(可在pom.xml中引用) -->
<properties>
<env>development</env>
</properties>
</profile>
</profiles>
<!-- 8. 激活的配置文件(指定默认激活哪些profile) -->
<activeProfiles>
<activeProfile>dev</activeProfile> <!-- 激活ID为dev的profile -->
</activeProfiles>
</settings>
核心元素详解
<localRepository>
- 定义本地仓库路径,
Maven下载的依赖会缓存到该目录。 - 示例:
<localRepository>D:\java\maven\apache-maven-3.9.9\mvn_repo</localRepository>(Windows)。
<mirrors>(最常用)
用于配置远程仓库的镜像,解决中央仓库访问慢的问题(如阿里云镜像)。
取值说明:
central:仅镜像 Maven 中央仓库(https://repo.maven.apache.org/maven2)。*:镜像所有远程仓库(不建议,可能影响私有仓库)。external:*:镜像除本地仓库外的所有远程仓库。repo1,repo2:仅镜像 ID 为repo1和repo2的仓库。
示例(阿里云镜像):
xml
<mirrors>
<mirror>
<id>aliyun-central</id>
<name>Aliyun Central Repository</name>
<url>https://maven.aliyun.com/repository/central</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>aliyun-spring</id>
<name>Aliyun Spring Repository</name>
<url>https://maven.aliyun.com/repository/spring</url>
<mirrorOf>spring-milestones,spring-snapshots</mirrorOf>
</mirror>
</mirrors>
<servers>
配置私有仓库(如 Nexus、Artifactory)的认证信息,id 必须与 pom.xml 或 profile 中仓库的 id 一致。
- 密码建议通过 Maven 加密(避免明文存储),加密方式:
- 执行
mvn --encrypt-password your-password生成加密后的密码。 - 将加密结果填入
<password>标签。
- 执行
<proxies>
企业内网环境下,若无法直接访问外网,需配置代理。
<nonProxyHosts>用|分隔不需要代理的地址(如内网仓库、本地地址)。
<profiles>与<activeProfiles>
<profiles>定义一组可切换的配置(如不同环境的仓库、属性)。<activeProfiles>指定默认激活的profile,也可通过命令行-PprofileId临时激活。
示例 :默认激活 dev 环境,打包时通过 mvn package -Pprod 切换到生产环境。
注意事项
- 全局
settings.xml影响所有项目,建议仅配置团队通用规则(如公共镜像),个人配置优先使用用户级~/.m2/settings.xml。 - 配置文件修改后无需重启
Maven,立即生效。 - 首次使用时,
conf/settings.xml通常是模板(带注释),需删除注释(或根据注释提示重写一份)后填入实际配置。
项目级配置(.mvn目录)
项目级的 .mvn 目录是 Maven 3.3.1+ 引入的项目专属配置目录 ,用于存放当前项目的个性化 Maven 配置。它的优先级高于 Maven 全局配置(安装根目录下的 conf/settings.xml),可针对单个项目定制构建行为,而不影响其他项目或全局配置。
.mvn 目录位于项目根目录(与 pom.xml 同级),通常包含以下核心配置文件:
maven.config:定义Maven命令行参数的默认值,替代手动在命令行输入的参数。jvm.config:配置Maven运行时的JVM参数(如内存分配、编码格式等)。extensions.xml:配置当前项目的Maven扩展组件(Extensions)。settings.xml:项目专属的Maven配置文件,使当前项目覆盖全局conf/settings.xml的配置。
这些文件会被 Maven 自动识别并应用于当前项目的构建过程。
maven.config
场景:当项目需要固定的构建参数(如跳过测试、指定日志级别)时,可在此统一配置,避免每次执行命令时重复输入。
示例:
bash
# 跳过测试(等效于命令行 -DskipTests)
-DskipTests
# 启用调试日志(等效于命令行 -X)
-X
# 指定 Maven 并行构建的线程数(适用于多模块项目)
-T 4
# 强制更新快照版本依赖(等效于命令行 -U)
-U
生效方式 :执行 mvn clean package 时,Maven 会自动读取 maven.config 中的参数,等效于执行:
bash
mvn clean package -DskipTests -X -T 4 -U
jvm.config
场景:解决项目构建时的内存溢出(OOM)、指定默认编码,或需要特殊 JVM 启动参数的场景。
示例:
bash
# 堆内存配置(初始256M,最大1024M)
-Xms256m
-Xmx1024m
# 永久代/元空间配置(适用于JDK8及以下的永久代,JDK9+用-XX:MetaspaceSize)
-XX:PermSize=128m
-XX:MaxPermSize=256m
# 强制指定文件编码为UTF-8
-Dfile.encoding=UTF-8
# 启用JVM调试模式(端口5005,允许远程调试)
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
生效方式 :Maven 启动时会自动将这些参数传递给 JVM,无需手动在命令行添加 -J 前缀(如 -J-Xmx1024m)。
extensions.xml
扩展组件:是一类特殊的 Maven 插件,在 Maven 生命周期早期加载,可扩展 Maven 的核心功能(如自定义依赖解析、仓库管理等)。
xml
<extensions>
<!-- 配置Maven仓库镜像扩展(如阿里云扩展) -->
<extension>
<groupId>com.aliyun.maven</groupId>
<artifactId>aliyun-maven-extension</artifactId>
<version>1.0.0</version>
</extension>
<!-- 配置依赖分析扩展 -->
<extension>
<groupId>org.apache.maven.extensions</groupId>
<artifactId>maven-dependency-analyzer-extension</artifactId>
<version>1.0.0</version>
</extension>
</extensions>
作用说明:
- 扩展组件会在 Maven 初始化阶段加载,优先级高于普通插件。
- 常用于集成第三方仓库、自定义生命周期等高级场景。
settings.xml
场景:为当前项目单独配置本地仓库路径、镜像、代理、认证信息等,不影响其他项目。
示例
xml
<settings>
<!-- 项目专属本地仓库(默认继承全局,此处可单独指定) -->
<localRepository>/path/to/project-specific/repo</localRepository>
<!-- 项目专属镜像(覆盖全局镜像) -->
<mirrors>
<mirror>
<id>aliyun</id>
<name>阿里云Maven仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!-- 项目专属服务器认证(如私有仓库的账号密码) -->
<servers>
<server>
<id>private-repo</id>
<username>your-username</username>
<password>your-password</password>
</server>
</servers>
</settings>
优先级 :项目级 settings.xml > 用户级 ~/.m2/settings.xml > 全局 conf/settings.xml。
.mvn 目录的优势
- 项目隔离:配置仅对当前项目生效,避免全局配置被污染(尤其在多项目开发或团队协作时)。
- 版本控制友好 :可将
.mvn目录提交到 Git 等版本控制系统,确保团队成员使用一致的构建配置。 - 简化命令 :通过
maven.config和jvm.config固化常用参数,减少命令行输入成本。
使用注意事项
- 兼容性 :
.mvn目录仅在Maven 3.3.1+版本支持,低版本会忽略该目录。 - 配置粒度 :仅在需要项目专属配置时使用,通用配置 建议放在用户级
~/.m2/settings.xml或全局conf/settings.xml。 - 敏感信息 :
settings.xml中的密码等敏感信息不建议提交到代码仓库,可通过环境变量或加密方式处理。
通过 .mvn 目录,开发者可以更灵活地定制项目的构建行为,尤其在大型项目或团队协作中,能显著提升配置一致性和开发效率。