多环境 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 = 按环境组织的配置组 + 启动时选定。记住「配置留在包里、环境在启动时定」这条原则,多环境切换就清楚了。

笔记加载中…