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-plugin 和 org.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.83. 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 -o3. interactiveMode - 交互模式
作用:设置Maven是否与用户交互。
<interactiveMode>true</interactiveMode>默认值:true
说明:
true:Maven会在需要时提示用户输入(比如版本号)false:Maven使用默认值,不提示用户
使用场景:
- CI/CD自动化构建,设为
false - 本地开发,保持
true
最后
settings.xml文件配置项不多,但每个都挺实用的。
本地仓库路径、镜像配置、Profile这几个是最常用的。其他的根据实际情况配置就好。
我把这些整理出来,以后换电脑或者帮别人配置Maven的时候,直接照着来就行。
如果你有其他配置技巧,也欢迎补充。