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 中央仓库(idcentral 的仓库)。
    • 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)或访问需要认证的仓库。

​核心规则​ ​:serverid 必须与 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:代理协议(如 httphttpssocks)。
  • 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),避免影响全局环境。

相关推荐
bulucc1 天前
Maven 或 Gradle 下载和添加 jar 文件的步骤
java·maven·jar
越来越无动于衷1 天前
Tomcat本地部署Maven Java Web项目
java·tomcat·maven
艺杯羹2 天前
Maven 之工程化开发核心指南:插件配置、pom 文件与依赖管理
maven·java 工程化·maven 插件·pom 文件
Niloofar2 天前
SpringBootWeb请求响应
java·maven
二宝哥2 天前
maven命令安装jar包到本地仓库
java·maven·jar
forestsea4 天前
Maven多模块项目架构设计:聚合、继承与依赖治理
java·maven
码码不爱我4 天前
报错:Maven无法解析插件 org.apache.maven.plugins:maven-surefire-plugin:3.0.0
java·数据库·maven
暮 夏4 天前
部署Maven Java Web项目
java·tomcat·maven·intellij-idea
aini_lovee5 天前
在IntelliJ IDEA中使用Maven配置Tomcat环境
tomcat·maven·intellij-idea