方式一:純 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