多环境 profile 与打包切换
同一套代码要跑在开发、测试、生产等不同环境,数据库地址、日志级别等配置各不相同。Spring Boot 用 profile 把配置按环境分组,启动时选定一组生效。
多份配置文件
把公共配置放 application.properties,再按环境放 application-{profile}.properties(yaml 同理)。同名配置项以 profile 文件覆盖公共文件:
application.properties # 公共配置
application-dev.properties # 开发环境
application-prod.properties # 生产环境
激活方式(优先级从高到低,仅列常用):
- 运行时命令行:
java -jar demo.jar --spring.profiles.active=prod - 环境变量:
SPRING_PROFILES_ACTIVE=prod - 公共配置里写死:
spring.profiles.active=dev(仅适合固定环境,如本地开发)
多个环境同时激活用逗号分隔,如 --spring.profiles.active=dev,local。
yml 多文档块
单个 application.yml 里用 --- 分隔成多段,每段用 spring.config.activate.on-profile 声明适用环境:
spring:
application:
name: demo
---
spring:
config:
activate:
on-profile: dev
server:
port: 8081
logging:
level:
com.example.demo: debug
---
spring:
config:
activate:
on-profile: prod
server:
port: 8080
logging:
level:
com.example.demo: warn
注意:Boot 3.x 起多文档块的激活条件统一写 spring.config.activate.on-profile,早期写法已废弃,确切规则以官方文档为准。
打包与切换
- 打包产物与环境无关:
mvn package打出的同一个 jar,靠启动参数切换环境。 - 部署平台一般通过环境变量注入:
SPRING_PROFILES_ACTIVE=prod java -jar demo.jar。 - 不推荐用 Maven profile + 资源过滤把不同环境的内容替换进包:容易把多个环境的配置或密钥打进同一个包,且排查困难。若确需按构建环境替换资源,做法与注意事项以官方文档为准。
- profile 支持分组(
spring.profiles.group),可以把一组子 profile 组合激活,细节以官方文档为准。
在代码里读取当前 profile
注入 Environment 即可:
@Autowired
private Environment environment;
// environment.getActiveProfiles() 返回激活的 profile 数组
小结
profile = 按环境组织的配置组 + 启动时选定。记住「配置留在包里、环境在启动时定」这条原则,多环境切换就清楚了。