Java開發學習(三十七)----SpringBoot多環境設定及組態檔分類

2022-10-10 09:00:27

一、多環境設定

在工作中,對於開發環境、測試環境、生產環境的設定肯定都不相同,比如我們開發階段會在自己的電腦上安裝 mysql ,連線自己電腦上的 mysql 即可,但是專案開發完畢後要上線就需要該設定,將環境的設定改為線上環境的。

來回的修改設定會很麻煩,而 SpringBoot 給開發者提供了多環境的快捷設定,需要切換環境時只需要改一個設定即可。不同型別的組態檔多環境開發的設定都不相同,接下來對不同型別的組態檔進行說明

1.1 yaml檔案

application.yml 中使用 --- 來分割不同的設定,內容如下

#開發
spring:
  profiles: dev #給開發環境起的名字
server:
  port: 80
---
#生產
spring:
  profiles: pro #給生產環境起的名字
server:
  port: 81
---
#測試
spring:
  profiles: test #給測試環境起的名字
server:
  port: 82
---

上面設定中 spring.profiles 是用來給不同的設定起名字的。而如何告知 SpringBoot 使用哪段設定呢?可以使用如下設定來啟用都一段設定

#設定啟用的環境
spring:
  profiles:
    active: dev  #表示使用的是開發環境的設定

綜上所述,application.yml 組態檔內容如下

#設定啟用的環境
spring:
  profiles:
    active: dev
​
---
#開發
spring:
  profiles: dev
server:
  port: 80
---
#生產
spring:
  profiles: pro
server:
  port: 81
---
#測試
spring:
  profiles: test
server:
  port: 82
---

注意:在上面設定中給不同設定起名字的 spring.profiles 設定項已經過時。最新用來起名字的設定項是

#開發
spring:
  config:
    activate:
      on-profile: dev

1.2 properties檔案

properties 型別的組態檔設定多環境需要定義不同的組態檔

  • application-dev.properties 檔案是開發環境的組態檔。我們在該檔案中設定埠號為 80

    server.port=80
  • application-test.properties 檔案是測試環境的組態檔。我們在該檔案中設定埠號為 81

    server.port=81
  • application-pro.properties 檔案是生產環境的組態檔。我們在該檔案中設定埠號為 82

    server.port=82

SpringBoot 只會預設載入名為 application.properties 的組態檔,所以需要在 application.properties 組態檔中設定啟用哪個組態檔,設定如下:

spring.profiles.active=pro

1.3 命令列啟動引數設定

使用 SpringBoot 開發的程式以後都是打成 jar 包,通過 java -jar xxx.jar 的方式啟動服務的。那麼就存在一個問題,如何切換環境呢?因為組態檔打到的jar包中了。

我們知道 jar 包其實就是一個壓縮包,可以解壓縮,然後修改設定,最後再打成jar包就可以了。這種方式顯然有點麻煩,而 SpringBoot 提供了在執行 jar 時設定開啟指定的環境的方式,如下

java –jar xxx.jar –-spring.profiles.active=test

那麼這種方式能不能臨時修改埠號呢?也是可以的,可以通過如下方式

java –jar xxx.jar –-server.port=88

當然也可以同時設定多個設定,比如即指定啟用哪個環境設定,又臨時指定埠,如下

java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test

大家進行測試後就會發現命令列設定的埠號優先順序高(也就是使用的是命令列設定的埠號),設定的優先順序其實 SpringBoot 官網已經進行了說明,參見 :

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

進入上面網站後會看到如下頁面

如果使用了多種方式配合同一個設定項,優先順序高的生效。

二、組態檔分類

有這樣的場景,我們開發完畢後需要測試人員進行測試,由於測試環境和開發環境的很多設定都不相同,所以測試人員在執行我們的工程時需要臨時修改很多設定,如下

java –jar springboot.jar –-spring.profiles.active=test --server.port=85 --server.servlet.context-path=/heima --server.tomcat.connection-timeout=-1 …… …… …… …… ……

針對這種情況,SpringBoot 定義了組態檔不同的放置的位置;而放在不同位置的優先順序時不同的。

SpringBoot 中4級組態檔放置位置:

  • 1級:resources/application.yml

  • 2級:resources/config/application.yml

  • 3級:target/application.yml

  • 4級:target/config/application.yml

說明:級別越高優先順序越高

3級與4級留作系統打包後設定通用屬性

1級與2級用於系統開發階段設定通用屬性

2.1 程式碼演示

2.1.1 環境準備

建立一個名為 springboot_06_config_fileSpringBoot 工程,,參考Java開發學習(三十五)----SpringBoot快速入門及起步依賴解析,目錄結構如下

resources 下建立一個名為 config 的目錄,在該目錄中建立 application.yml 組態檔,而在該組態檔中將埠號設定為 81,內容如下

server:
  port: 81

而在 resources 下建立的 application.yml 組態檔中並將埠號設定為 80,內容如下

server:
  port: 80
2.1.2 驗證1級和2級的優先順序

執行啟動引導類,可以在控制檯看到如下紀錄檔資訊

通過這個結果可以得出類路徑下的 config 下的組態檔優先於類路徑下的組態檔。

2.1.3 驗證2級和4級的優先順序

要驗證4級,按照以下步驟完成

  • 將工程打成 jar

    點選工程的 package 來打 jar

  • 在硬碟上找到 jar 包所在位置

  • jar 包所在位置建立 config 資料夾,在該資料夾下建立 application.yml 組態檔,而在該配合檔案中將埠號設定為 82

  • 在命令列使用以下命令執行程式

    java -jar springboot_06_config_file-0.0.1-SNAPSHOT.jar

    執行後紀錄檔資訊如下

    通過這個結果可以得出file: config 下的組態檔優先於類路徑下的組態檔。

注意:

SpringBoot 2.5.0版本存在一個bug,我們在使用這個版本時,需要在 jar 所在位置的 config 目錄下建立一個任意名稱的資料夾