Spring Boot Profile 多环境切换实战 —— 以 springboot-properties 为例(含踩坑)
Spring Boot Profile 多环境切换实战 —— 以 springboot-properties 为例(含踩坑)
本文基于 springboot-learning-example 中的springboot-properties模块,记录 Spring Boot 多环境(Profile)切换的几种方式、配置优先级,以及运行测试时容易踩的两个坑。
一、项目背景
该模块演示用@ConfigurationProperties绑定自定义配置,并通过 Profile 区分开发(dev)与生产(prod)环境。启动类Application.java实现了CommandLineRunner,启动时会打印HomeProperties;HelloWorldController在/返回 "Hello,World!"。
二、Spring Boot Profile 是什么
Profile 是 Spring 提供的「按环境隔离配置」的机制。核心约定:
- 主配置文件:
application.properties - 环境专属文件:
application-{profile}.properties(如application-dev.properties、application-prod.properties) - 通过
spring.profiles.active指定激活哪个环境
三、本项目的多环境配置
application.properties(主,指定激活环境)
# Spring Profiles Active spring.profiles.active=prodapplication-dev.properties(开发环境)
## 家乡属性 Dev home.province=ZheJiang home.city=WenLing home.desc=dev: I'm living in ${home.province} ${home.city}.application-prod.properties(生产环境)
## 家乡属性 Prod home.province=ZheJiang home.city=WenLing home.desc=prod: I'm living in ${home.province} ${home.city}.dev 与 prod 仅home.desc前缀不同(dev:/prod:),这正是用来验证当前激活环境的「标记」。
四、4 种切换环境的方式
优先级(高 → 低):命令行参数 / 环境变量 > 主配置文件 > 默认值。下面 4 种方式任选其一即可。
方式 1:修改主配置文件(最常用,随代码提交)
# application.properties spring.profiles.active=dev # 改成 dev / prod 即可方式 2:运行 Jar 时传命令行参数(不改动文件,推荐部署用)
java -jar target/springboot-properties-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod方式 3:Maven 插件启动时指定(开发调试用)
mvn spring-boot:run -Dspring-boot.run.profiles=prod方式 4:环境变量(容器 / 服务器部署最常用)
# Linux / macOS export SPRING_PROFILES_ACTIVE=prod # Windows set SPRING_PROFILES_ACTIVE=prod五、优先级速查表
| 方式 | 示例 | 优先级 | 适用场景 |
|---|---|---|---|
| 命令行参数 | --spring.profiles.active=prod | 最高 | 临时验证、部署 |
| 环境变量 | SPRING_PROFILES_ACTIVE=prod | 高 | Docker / K8s |
| 主配置文件 | spring.profiles.active=prod | 中 | 随代码固定 |
| 默认值 | 无 | 最低 | 兜底 |
提示:高优先级的配置会「覆盖」低优先级,所以命令行/环境变量设了 prod,就算文件里写 dev 也会生效 prod。
六、如何验证当前环境生效
启动应用后看两处:
- 控制台打印的
HomeProperties中desc字段 —— 带dev:还是prod:前缀。 - 或浏览器访问
http://localhost:8080/,确认接口正常返回。
HomeProperties{province='ZheJiang', city='WenLing', desc='prod: I'm living in ZheJiang WenLing.'}七、附:运行测试时的两个隐藏坑
mvn test测试被悄悄跳过pom 里maven-surefire-plugin写死了<skipTests>true</skipTests>。这个值是写在<configuration>里的字面量,命令行-DskipTests=false根本覆盖不了,导致测试一直被跳过。
解决:把 pom 中skipTests改为false。
pom 里硬编码了spring-boot-test:1.4.2.RELEASE,与父依赖spring-boot 2.1.3.RELEASE冲突,运行时抛NoSuchMethodError: SpringApplication.<init>(java.lang.Object[])。
解决:删除这个冗余依赖,spring-boot-starter-test已经带正确版本。
修复后运行单个测试方法的命令:
cd springboot-properties mvn test -Dtest=PropertiesTest#getHomeProperties八、总结
- 切换环境本质就是改
spring.profiles.active,4 种方式按场景选。 - 优先级记住一句话:命令行 > 环境变量 > 配置文件。
- 用
home.desc前缀这个「标记」快速验证环境是否真的切换成功。 - 跑测试前先确认 pom 没把
skipTests写死、没引冲突的老版本依赖。
