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 元素:
| 元素 | 说明 |
|---|---|
| name | OS 名称(linux、windows、mac) |
| family | OS 家族(unix、windows、mac) |
| arch | 系统架构(x86、x86_64) |
| version | OS 版本 |
实际用途:平台特定的本地库依赖。
方式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>
要点总结
- Profile 定义环境配置:不同环境不同数据库、服务地址、日志级别
- 命令行激活 -P:mvn package -Pdev,最常用方式
- activeByDefault 默认激活:开发环境作为默认
- 属性激活 -D:mvn package -Denv=prod
- JDK/OS/文件条件激活:根据环境自动激活
- 优先级:命令行最高,activeByDefault最低
- 敏感配置用环境变量:生产密码 ${env.DB_PASSWORD}
- 公共放 pom.xml,敏感放 settings.xml:团队共享和个人私密分离
📝 发现内容有误?点击此处直接编辑