全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-23 12 分钟 ✍️ juanwangdev

Profile 基础与激活方式

Profile 是 Maven 实现多环境配置的核心机制。实际项目中,开发、测试、生产环境的数据库连接、服务地址、日志级别等配置各不相同,手动修改配置文件既繁琐又容易出错。Profile 让你只需一个命令就能切换整个环境配置。

为什么需要 Profile

传统方式的问题

XML
场景:项目需要在不同环境部署

方式1:手动修改配置文件
开发环境:application.properties → db.url=localhost
测试环境:手动改 → db.url=test-server
生产环境:手动改 → db.url=prod-server

问题:
- 每次切换都要手动改
- 容易改错或遗漏
- 生产环境敏感信息不能提交到代码库
- 多人协作,配置可能冲突

Maven Profile 解决方案

XML
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <db.url>jdbc:mysql://localhost:3306/dev</db.url>
    </properties>
  </profile>
  <profile>
    <id>prod</id>
    <properties>
      <db.url>jdbc:mysql://prod-server:3306/prod</db.url>
    </properties>
  </profile>
</profiles>

切换环境只需:
mvn package -Pdev    # 开发环境
mvn package -Pprod   # 生产环境

优势

  • 配置集中管理
  • 一键切换环境
  • 不会遗漏配置项
  • 团队配置统一

Profile 定义位置

pom.xml 中定义

XML
<project>
  <profiles>
    <profile>
      <id>dev</id>
      <properties>
        <env>dev</env>
      </properties>
    </profile>
  </profiles>
</project>

特点

  • 提交到版本库,团队共享
  • 项目级配置,所有开发者统一

settings.xml 中定义

Bash
<settings>
  <profiles>
    <profile>
      <id>local-dev</id>
      <properties>
        <db.password>my-local-password</password>
      </properties>
    </profile>
  </profiles>
</settings>

特点

  • 仅存储在本地
  • 适合存放敏感配置(密码等)
  • 不同开发者可以有不同的本地配置

推荐:公共配置放在 pom.xml,敏感/个人配置放在 settings.xml。

Profile 可配置内容

Profile 可以覆盖以下 POM 配置:

配置项说明使用场景
properties属性定义数据库连接、服务地址
dependencies依赖声明不同环境依赖不同库
dependencyManagement依赖版本管理不同环境版本不同
plugins插件配置生产环境启用优化插件
repositories仓库配置不同环境使用不同仓库
build 配置构建配置不同环境打包方式

Profile 激活方式

方式1:命令行激活(最常用)

XML
mvn package -Pdev           # 激活 dev Profile
mvn package -Pprod          # 激活 prod Profile
mvn package -Pdev,debug     # 激活多个 Profile
mvn package -P !dev         # 禁用 dev Profile

实际场景

Bash
开发环境构建:
mvn clean package -Pdev

测试环境构建:
mvn clean package -Ptest

生产环境构建:
mvn clean deploy -Pprod

方式2:默认激活

XML
<profile>
  <id>dev</id>
  <activation>
    <activeByDefault>true</activeByDefault>  <!-- 默认激活 -->
  </activation>
  <properties>
    <env>dev</env>
  </properties>
</profile>

效果

  • 不指定 Profile 时,默认激活 dev
  • 指定其他 Profile 时,默认激活被覆盖
Bash
mvn package          # 自动激活 dev(默认)
mvn package -Pprod   # 激活 prod,dev 不激活

重要规则:显式指定 Profile 会禁用所有 activeByDefault 的 Profile。

方式3:属性激活

XML
<profile>
  <id>prod</id>
  <activation>
    <property>
      <name>env</name>
      <value>prod</value>
    </property>
  </activation>
</profile>

效果

XML
mvn package                    # 不激活(env 未设置)
mvn package -Denv=prod         # 激活 prod(env=prod)
mvn package -Denv=prod -Pdev   # 同时激活 dev 和 prod

实际用途:CI/CD 中通过参数控制激活。

方式4:JDK 版本激活

XML
<profile>
  <id>java17</id>
  <activation>
    <jdk>17</jdk>              <!-- JDK 17 时激活 -->
  </activation>
  <properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
  </properties>
</profile>

<profile>
  <id>java11</id>
  <activation>
    <jdk>[11,17)</jdk>         <!-- JDK 11-16 激活 -->
  </activation>
</profile>

效果

  • 使用 JDK 17 编译时自动激活 java17 Profile
  • 使用 JDK 11 编译时自动激活 java11 Profile

实际用途:多 JDK 版本兼容配置。

方式5:操作系统激活

XML
<profile>
  <id>linux</id>
  <activation>
    <os>
      <family>unix</family>
    </os>
  </activation>
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>native-linux</artifactId>
    </dependency>
  </dependencies>
</profile>

<profile>
  <id>windows</id>
  <activation>
    <os>
      <family>windows</family>
    </os>
  </activation>
</profile>

os 元素

元素说明
nameOS 名称(linux、windows、mac)
familyOS 家族(unix、windows、mac)
arch系统架构(x86、x86_64)
versionOS 版本

实际用途:平台特定的本地库依赖。

方式6:文件存在激活

XML
<profile>
  <id>custom-config</id>
  <activation>
    <file>
      <exists>${project.basedir}/custom.properties</exists>
    </file>
  </activation>
</profile>

<profile>
  <id>default-config</id>
  <activation>
    <file>
      <missing>${project.basedir}/custom.properties</missing>
    </file>
  </activation>
</profile>

效果

  • 项目根目录存在 custom.properties → 激活 custom-config
  • 不存在 → 激活 default-config

实际用途

  • 有自定义配置文件时使用自定义配置
  • 没有时使用默认配置

方式7:settings.xml 中 activeProfiles

Bash
<settings>
  <activeProfiles>
    <activeProfile>local-dev</activeProfile>    <!-- 默认激活 -->
    <activeProfile>company-proxy</activeProfile>
  </activeProfiles>
</settings>

效果:每次构建自动激活这些 Profile。

实际用途:本地开发环境的个人配置默认激活。

激活优先级

优先级顺序(从高到低)

Bash
1. 命令行 -P              ← 最高,可覆盖所有其他
2. 命令行 -D 属性
3. 文件存在/缺失
4. JDK 版本
5. 操作系统
6. settings.xml activeProfiles
7. activeByDefault        ← 最低

优先级示例

Bash
<profile>
  <id>dev</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
</profile>

<profile>
  <id>prod</id>
</profile>
XML
mvn package               # 激活 dev(activeByDefault)
mvn package -Pprod        # 激活 prod(命令行覆盖默认)
mvn package -Pdev,prod    # 同时激活 dev 和 prod

查看 Profile 激活状态

查看激活的 Profile

properties
mvn help:active-profiles

输出:

Bash
[INFO] Active Profiles:
[INFO] dev (source: pom.xml)
[INFO] local-dev (source: settings.xml)

查看所有 Profile

XML
mvn help:all-profiles

输出:

XML
[INFO] Profile Id: dev (Activation: activeByDefault)
[INFO] Profile Id: prod (Activation: manual)

Profile 实际应用场景

场景1:多环境数据库配置

groovy
<profiles>
  <profile>
    <id>dev</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
      <db.url>jdbc:mysql://localhost:3306/dev</db.url>
      <db.user>dev</db.user>
      <db.password>dev123</db.password>
      <log.level>DEBUG</log.level>
    </properties>
  </profile>

  <profile>
    <id>test</id>
    <properties>
      <db.url>jdbc:mysql://test-server:3306/test</db.url>
      <db.user>test</db.user>
      <db.password>test123</db.password>
      <log.level>INFO</log.level>
    </properties>
  </profile>

  <profile>
    <id>prod</id>
    <properties>
      <db.url>jdbc:mysql://prod-server:3306/prod</db.url>
      <db.user>${env.DB_USER}</db.user>         <!-- 环境变量 -->
      <db.password>${env.DB_PASSWORD}</db.password>
      <log.level>WARN</log.level>
    </properties>
  </profile>
</profiles>
YAML
# application.properties(使用资源过滤)
database.url=${db.url}
database.user=${db.user}
database.password=${db.password}
log.level=${log.level}
Bash
mvn package -Pdev    → localhost 连接,DEBUG 日志
mvn package -Ptest   → test-server 连接,INFO 日志
mvn package -Pprod   → prod-server 连接,密码从环境变量读取

场景2:不同环境不同依赖

XML
<profiles>
  <profile>
    <id>dev</id>
    <dependencies>
      <!-- 开发环境:内存数据库方便测试 -->
      <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
      </dependency>
      <!-- 开发工具 -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
      </dependency>
    </dependencies>
  </profile>

  <profile>
    <id>prod</id>
    <dependencies>
      <!-- 生产环境:真实数据库驱动 -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
      </dependency>
    </dependencies>
  </profile>
</profiles>

场景3:不同环境不同插件

Bash
<profiles>
  <profile>
    <id>prod</id>
    <build>
      <plugins>
        <!-- 生产环境:代码混淆 -->
        <plugin>
          <groupId>com.github.wvengen</groupId>
          <artifactId>proguard-maven-plugin</artifactId>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>proguard</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <!-- 生产环境:GPG 签名 -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-gpg-plugin</artifactId>
          <executions>
            <execution>
              <phase>verify</phase>
              <goals>
                <goal>sign</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

场景4:CI/CD 环境切换

Jenkins Pipeline

Bash
stage('Build Dev') {
  steps {
    sh 'mvn clean package -Pdev'
  }
}

stage('Build Prod') {
  steps {
    withCredentials([
      usernamePassword(credentialsId: 'prod-db', usernameVariable: 'DB_USER', passwordVariable: 'DB_PASSWORD')
    ]) {
      sh 'mvn clean deploy -Pprod'
    }
  }
}

GitHub Actions

text
- name: Build Production
  run: mvn clean deploy -Pprod
  env:
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}

Profile 配置最佳实践

推荐做法

做法说明
Profile ID 简洁明了dev、test、prod 而非 development-env
公共配置放 pom.xml团队共享的配置
敏感配置放 settings.xml 或环境变量密码等不应提交版本库
开发环境设为默认activeByDefault=true
生产环境用环境变量${env.DB_PASSWORD}

不推荐做法

做法风险
多个 activeByDefault冲突混乱
pom.xml 存密码密码暴露
Profile 过多难以管理

Profile 常见问题

问题1:Profile 配置不生效

text
mvn package -Pdev
# 但配置没有替换

原因:资源过滤未启用。

解决

text
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>   <!-- 必须启用 -->
    </resource>
  </resources>
</build>

问题2:多个 Profile 配置冲突

text
mvn package -Pdev,prod
# 配置混乱

原因:后激活的 Profile 覆盖前一个的配置。

解决

  • 避免同时激活冲突的 Profile
  • 或明确配置覆盖预期

问题3:settings.xml Profile 不生效

原因:settings.xml 位置不对或未配置 activeProfiles。

解决

text
# 查看 settings.xml 位置
mvn -X | grep "settings file"

# 添加 activeProfiles
<activeProfiles>
  <activeProfile>my-profile</activeProfile>
</activeProfiles>

要点总结

  1. Profile 定义环境配置:不同环境不同数据库、服务地址、日志级别
  2. 命令行激活 -P:mvn package -Pdev,最常用方式
  3. activeByDefault 默认激活:开发环境作为默认
  4. 属性激活 -D:mvn package -Denv=prod
  5. JDK/OS/文件条件激活:根据环境自动激活
  6. 优先级:命令行最高,activeByDefault最低
  7. 敏感配置用环境变量:生产密码 ${env.DB_PASSWORD}
  8. 公共放 pom.xml,敏感放 settings.xml:团队共享和个人私密分离

📝 发现内容有误?点击此处直接编辑

← 上一篇 资源过滤与变量替换
下一篇 → Profile 外部化配置管理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库