Spring Boot 多环境配置详解:Maven Profile vs 启动参数注入
🌍 Spring Boot 多环境配置详解:Maven Profile vs 启动参数注入
🧭 一、背景说明
在项目开发和部署过程中,我们通常会维护多套配置文件:
- 开发环境(dev):打印调试日志、使用本地数据库;
- 测试环境(test):连接测试库、关闭控制台输出;
- 生产环境(prod):追求性能、关闭 debug、连接生产数据库。
Spring Boot 天生支持多环境配置,但不同团队在使用上有两种主要方式:
- Maven Profile 方式(打包阶段固定环境)
- Spring Profile 启动参数方式(运行时动态选择)
这两者目标一致但理念不同:
- Maven Profile 更偏向 构建时环境固化。
- Spring Profile 更偏向 运行时灵活切换。
⚙️ 二、核心区别一览表
| 对比维度 | Maven Profile(构建时) | 启动参数注入(运行时) |
|---|---|---|
| 配置切换时机 | 打包阶段确定 | 启动阶段动态指定 |
| 构建产物 | 每个环境一个 jar | 一个通用 jar |
| 命令方式 | mvn clean package -Pprod | java -jar app.jar --spring.profiles.active=prod |
| 配置文件数量 | 每个环境一个 jar 内部配置不同 | 所有配置文件打包进一个 jar |
| 修改环境成本 | 高(需重新打包) | 低(重启命令即可) |
| CI/CD 兼容度 | 一般 | 极佳 |
| 本地开发体验 | 稍繁琐 | 方便(命令切换) |
| 适用部署场景 | 传统服务器、手动运维 | Docker、K8s、Jenkins 等现代环境 |
| 企业使用比例(经验值) | 🔸约30% | 🟢约70%(主流) |
🧩 三、方案一:Maven Profile 多环境打包
📘 1. 原理简介
Maven 的 <profiles> 标签允许在 打包阶段 注入不同属性值。
结合 Spring Boot 的占位符替换机制(@spring.profiles.active@),
可以让打出来的 jar 在内部就写死对应环境。
这种方式的核心理念是:
🧱 “一个环境,一个包” —— 打包即部署。
🧾 2. pom.xml 配置示例
<profiles><profile><id>dev</id><activation><activeByDefault>true</activeByDefault></activation><properties><spring.profiles.active>dev</spring.profiles.active></properties></profile><profile><id>test</id><properties><spring.profiles.active>test</spring.profiles.active></properties></profile><profile><id>prod</id><properties><spring.profiles.active>prod</spring.profiles.active></properties></profile>
</profiles>
📄 3. application.yml
spring:profiles:active: @spring.profiles.active@
打包时执行:
mvn clean package -Pprod
将生成的配置内容:
spring:profiles:active: prod
⚙️ 4. 打包命令
mvn clean package -Pdev
mvn clean package -Ptest
mvn clean package -Pprod
⚡ 四、方案二:启动参数注入(推荐)
📘 1. 原理简介
Spring Boot 在运行时根据 spring.profiles.active 参数加载对应配置文件。
这种方式无需重新打包,只要调整命令即可切换环境。
💡 “一个包,多环境复用”。
🗂️ 2. 配置文件结构
src/main/resources/
├── application.yml
├── application-dev.yml
├── application-test.yml
└── application-prod.yml
🚀 3. 启动命令示例
java -jar app.jar --spring.profiles.active=dev
java -jar app.jar --spring.profiles.active=test
java -jar app.jar --spring.profiles.active=prod
🌍 4. 环境变量方式(生产推荐)
export SPRING_PROFILES_ACTIVE=prod
java -jar app.jar
Spring Boot 自动读取环境变量配置。
🧠 五、选择建议
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 开发环境 | 启动参数注入 | 切换快速 |
| 测试环境 | 启动参数注入 | 无需重打包 |
| 生产环境 | 环境变量或 Maven Profile | 稳定可控 |
| Docker/K8s 部署 | 启动参数注入 | 最佳实践 |
🧩 六、混合写法(兼容两者)
spring:profiles:active: @spring.profiles.active@
启动命令可覆盖:
java -jar app.jar --spring.profiles.active=prod
✅ 七、总结
💬 Maven Profile 是“打包时选环境”,Spring Profile 是“运行时选环境”。
在现代 DevOps 或容器化部署中,更推荐使用启动参数注入方式。
