方式一:纯 Spring Profile(最常用,官方推荐)
思路:用 application-{profile}.yml
切分配置,运行时指定用哪个 profile。
如何做:
src/main/resources/application.ymlapplication-dev.ymlapplication-test.ymlapplication-prod.yml
在 application.yml
里可以只放公共配置;每个环境放到对应文件。
如何激活(四选一即可):
命令行:
java -jar app.jar --spring.profiles.active=dev
JVM 参数:
-Dspring.profiles.active=dev
环境变量:
SPRING_PROFILES_ACTIVE=dev
在
application.yml
:spring:profiles:active: dev
何时用:绝大多数项目;无需改打包流程,开发/测试/生产切换最灵活。
方式二:同一个 yml 用分段 + on-profile(Boot 2.4+)
思路:一个文件里用 ---
分段,并用 spring.config.activate.on-profile
指定生效条件。
如何做:
# application.yml (一个文件)
server:port: 8080 # 公共---
spring:config:activate:on-profile: dev
datasource:url: jdbc:...---
spring:config:activate:on-profile: prod
datasource:url: jdbc:...
每个块里可以加一个条件:
spring:config:activate:on-profile: dev
一、单文件 + ---
+ spring.config.activate.on-profile
的规则
1. 公共段(最上面没有 on-profile
的部分)
始终加载,不管你激活哪个 profile。
可以放端口号、应用名这种通用配置。
2. 环境段(有 on-profile
的部分)
只有当你激活对应 profile 时才加载。
激活方式就是
spring.profiles.active
。
二、激活 profile 的途径(不仅仅是运行时)
运行时命令行
java -jar app.jar --spring.profiles.active=dev
JVM 参数
java -jar -Dspring.profiles.active=dev app.jar
环境变量
SPRING_PROFILES_ACTIVE=dev
application.yml 的公共部分写死
spring:profiles:active: dev
何时用:不想维护多个文件时;仍是“纯 Spring”的方式。
方式三:Maven/Gradle 构建期切换(资源过滤 + 占位符)
1. 核心思想
Spring Boot 原生的 Profile 切换(方式一、二)是运行时选择环境。
而方式三是让 构建工具(Maven/Gradle)在打包的时候就决定环境,即:
👉 打包出来的 jar 已经带着某个环境的配置,运行时不用再指定。
2. 原理
Maven/Gradle 的 profiles 可以给不同环境定义属性。
资源过滤(resource filtering) 会在打包时,把配置文件里的占位符替换为 Maven/Gradle 的属性值。
Spring Boot 启动时读取配置文件,就已经是对应环境的内容了。
3. 步骤(以 Maven 为例)
1. 定义多环境 Profile
在 pom.xml
里写不同的 profile:
<profiles><!-- 开发环境 --><profile><id>dev_env</id><properties><profile.active>dev</profile.active></properties></profile><!-- 测试环境 --><profile><id>test_env</id><properties><profile.active>test</profile.active></properties></profile><!-- 生产环境 --><profile><id>prod_env</id><properties><profile.active>prod</profile.active></properties></profile>
</profiles>
2. 开启资源过滤
在 pom.xml
的 <build>
里:
<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>
3. 在 Spring 配置里用占位符
application.yml
:
spring:profiles:active: @profile.active@
这里的 @profile.active@
会在打包时被 Maven 替换成对应 profile 的值(比如 dev
)。
4. 打包时选择环境
mvn clean package -Pdev_env # 打包时替换成 dev
mvn clean package -Ptest_env # 打包时替换成 test
mvn clean package -Pprod_env # 打包时替换成 prod
生成的 jar 里 application.yml
已经被替换成:
spring:profiles:active: dev
(或者 test/prod,取决于你打包时选了哪个)
4. 运行时
直接运行 jar 就行,不用再传 --spring.profiles.active
:
java -jar target/demo-1.0.0.jar
因为它在打包时已经确定了环境。
5. 适用场景
CI/CD 构建流水线里,每个环境需要一份独立的 jar(比如
demo-dev.jar
、demo-prod.jar
)。公司要求运维简单:生产只拿固定的包运行,不允许再传启动参数。
6. 总结一句
方式三其实是“打包时定死环境,用 Maven profile 替换 yml 的占位符”。
<activation>
是否必须?不是!
不写
<activation>
:你需要用-Pxxx
手动选择哪个 Maven profile。写了
<activeByDefault>true</activeByDefault>
:在没传-P
时默认用这个。
方式四:外部化配置文件(不改包,部署时挂载)
思路:jar 外面放环境配置,通过路径或目录注入。
怎么做:
指定额外位置:
java -jar app.jar --spring.config.additional-location=/etc/app/
在该目录放application-prod.yml
,配合SPRING_PROFILES_ACTIVE=prod
使用。或直接指定完整路径:
--spring.config.location=/etc/app/application.yml
何时用:Docker/K8s/云上部署;把“敏感/环境差异”留到部署层处理。
方式五:代码层面的 Bean 隔离(@Profile)
思路:按环境注册不同的 Bean。
怎么做:
@Profile("prod")
@Configuration
public class ProdConfig { ... }@Profile("dev")
@Configuration
public class DevConfig { ... }
何时用:某些组件在不同环境需要完全不同的实现(如 Mock vs 实际服务)。
#(可选)增强:Profile 组 & 包含
Profile 组(Boot 2.4+):一个 profile 激活一组子 profile。
spring:profiles:group:prod: [db, redis, messaging]
include(老版本):
spring.profiles.include=db,redis