Spring Boot Profile 多环境切换实战 —— 以 springboot-properties 为例(含踩坑)

📅 2026/7/23 19:45:49 👁️ 阅读次数 📝 编程学习
Spring Boot Profile 多环境切换实战 —— 以 springboot-properties 为例(含踩坑)
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,启动时会打印HomePropertiesHelloWorldController/返回 "Hello,World!"。

二、Spring Boot Profile 是什么

Profile 是 Spring 提供的「按环境隔离配置」的机制。核心约定:

  • 主配置文件:application.properties
  • 环境专属文件:application-{profile}.properties(如application-dev.propertiesapplication-prod.properties
  • 通过spring.profiles.active指定激活哪个环境

三、本项目的多环境配置

application.properties(主,指定激活环境)

# Spring Profiles Active spring.profiles.active=prod

application-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=prodDocker / K8s
主配置文件spring.profiles.active=prod随代码固定
默认值最低兜底
提示:高优先级的配置会「覆盖」低优先级,所以命令行/环境变量设了 prod,就算文件里写 dev 也会生效 prod。

六、如何验证当前环境生效

启动应用后看两处:

  1. 控制台打印的HomePropertiesdesc字段 —— 带dev:还是prod:前缀。
  2. 或浏览器访问http://localhost:8080/,确认接口正常返回。
HomeProperties{province='ZheJiang', city='WenLing', desc='prod: I'm living in ZheJiang WenLing.'}

七、附:运行测试时的两个隐藏坑

坑 A:mvn test测试被悄悄跳过

pom 里maven-surefire-plugin写死了<skipTests>true</skipTests>。这个值是写在<configuration>里的字面量,命令行-DskipTests=false根本覆盖不了,导致测试一直被跳过。

解决:把 pom 中skipTests改为false

坑 B:运行 @SpringBootTest 报 NoSuchMethodError

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写死、没引冲突的老版本依赖。