科技新知

為何要有不同的建構 Profile

Profile這一字,很難在IT技術文章中翻譯,它在Spring boot中的語意大概就是一個設定一個固定的運行環境參數合。例如我們做開發時,有些只想在開發環境中出現的設定,諸如測試用的資料庫、細緻一點的LOG層級,都寫在dev profile中。當換成正式環境時,我們也有一套全新的配置,而且會集中寫在prod profile中。把這些參數設定從程式碼邏輯中抽離,可以讓你的程式碼簡潔很多,也方便對比不同環境的設定。

application.properties

Spring Boot (Spring Boot Starter) 就提供了 Profile 管理。我們可以為一個Spring Boot 模組設定多個不同的 application.properties

  • src/main/resources/application.properties 為預設 (default profile)
  • src/main/resources/application-uat.properties 為驗收環境專用
  • src/main/resources/application-prod.properties 為投產環境專用
  • src/main/resources/application-test.properties 為自動測試專用

在執行程式時,我們只要動改變啟動的參數spring.profiles.active,例如

mvn spring-boot:run -Dspring-boot.run.arguments="--spring.profiles.active=uat"
# or
mvn package && java -jar target/YOUR_JAR_NAME --spring.profiles.active=uat
 

Spring Boot 就會指定載入 application-uat.properties 的內容,如果有些值沒有定義,它會再追溯到預設的 application.properties中。

在運行中改變啟動參數的情況可能不多,筆者更常用的情況是在編譯期間產生多個 Jar 檔,不同 Jar 檔指定不同的環境,方便系統管理員取用測試。想做到這個效果,我們需要在 application.properties 中,我們還需要加入一句spring.profiles.active=@active.profile@,並在編譯工具中加入這個變量,例如筆者常用的 maven pom.xml 中,就會有這一串設定

它在 maven clean compile package 時,就已經可以在JAR中填入固定spring.profiles.active。那麼每次執行時,都會是指定的profile。

mvn package -Puat
java -jar target/YOUR_JAR_NAME

在這個例子中,JAR 中的 spring.profiles.active 就會固定是uat,我們不需要在啟動參數中加入字眼。

如果大家不會碰到混合Profile的話,其實上述的資訊已經足夠大家應付很多情境。

但當大家有追求,需要寫自動測試,有機會不同自動測試需要啟用不同的 Profile ,更有可能出現混合Profile的情況,這件事就變得很複雜。我們需要繼續深入了解一下 Spring Boot 的覆蓋機制,下面將會以測試方式導出結論。

如果真的對混合 Profile 沒有太多信心,我們也可以用單一 Profile 重組不同 properties 的方式,自行去模擬混合 Profile ,例如除了dev, uat, test之外,我們可以加入 dev-test, uat-test, default-test 作為驅分。這樣應該可以簡化測試的複雜度,不過 properties 檔案就可能會成幾何級成長。

但在某情特殊情況下,我們不可能簡單地重組 properties 等型式去做測試,例如針對部份uat-test的測試,只有部份可以執行,部份不可以,那麼我們還是需要用到混合 Profile ,限定某些測試需要執個某個 profile ,但其餘部份可以動態切換。

有條件的讀者,也可以先行試玩一下混合 profile 的特性,下期筆者再為不同情況作解紹。

混合Profile Source code

spring boot profile

馬交野


與正念同行
IMAX with Laser 雷霆特攻隊*
向陽·花
獵狐行動
關於我和鬼變成家人的那封利是
劇場版 世界計畫 崩壞的世界與無法歌唱的初音未來 團體CD吊飾特典場
怪獸8號:Mission Recon
送院途中
水餃皇后
4DX  雷霆特攻隊*
雷霆特攻隊*
死亡輪迴
夜校女生
Until Dawn 死亡輪迴
不說話的愛
暗算2
黑箱日誌
Ado SPECIAL LIVE 「心臟」 in Cinema
虎毒不
OMG! 阿媽有喜
LAST MILE:全面引爆
戰役
劇場版忍者亂太郎 毒菇忍者隊最強之軍師
復仇反擊戰
破.地獄 加長版
貓貓的奇幻漂流
英語版  MINECRAFT:我的世界大電影
MINECRAFT:我的世界大電影
劇場版 世界計畫 崩壞的世界與無法歌唱的初音未來
MINECRAFT :我的世界大電影
摘星廚神.巴黎夢
贖夢
哪吒之魔童鬧海
九龍城寨之圍城
與正念同行
IMAX with Laser 雷霆特攻隊*