springboot啟動讀取外部配置檔案
有時候項目打包成一個jar 或者war ,通過java -jar 指令運作springboot 項目,因為springboot 項目有自己的application.properties 配置檔案,但是我們打完包之後,它也會打到包裡邊,倒是也能打開壓縮包修改properties 檔案,但是也是較為麻煩。
現在有如下需求,比如客戶需要在很多個伺服器部署一套項目,但是它們的資料庫連接配接不一樣,我們不能針對于這麼多伺服器,多次打包,很惡心,當然可以打完包,複制一堆,分别修改壓縮包裡邊的配置檔案。
springboot 有讀取外部配置檔案的方法,如下優先級:
第一種是在jar包的同一目錄下建一個config檔案夾,然後把配置檔案放到這個檔案夾下。
第二種是直接把配置檔案放到jar包的同級目錄。
第三種在classpath下建一個config檔案夾,然後把配置檔案放進去。
第四種是在classpath下直接放配置檔案。
看到如上的優先級了嗎?也就是說springboot 預設是優先讀取它本身同級目錄下的一個config/application.properties 檔案的。我們通常在src/main/resources 檔案夾下建立的application.properties 檔案的優先級竟然是最低的!!!。
下邊這個是config/application.properties 檔案放置位置。提前我将它的port 設定為1000 ,另外war 包裡也有一個application.properties 檔案,它的port 是3000 。

直接指令執行:
java -jar cloud-lyzx-project.war
的确發現通路端口是1000 ,而不是裡邊的3000 。
然後我又拿到外邊來,下邊這個是application.properties 檔案放置位置。提前我将它的port 設定為2000
在目前位置直接啟動jar包:
java -jar cloud-lyzx-project.war
你會發現,通路端口是2000 ,還不是裡邊的3000 。
關于讀取配置檔案的問題,如下圖:
總結了一下他發現的:
内外都有配置檔案,配置檔案讀取是有優先級,外配置檔案優于内配置檔案讀取。(這個沒疑問)。
如果内配置檔案裡有外配置檔案沒有的配置,那兩者互補。比如外配置檔案沒有配置資料庫,内配置檔案裡配置了資料庫,那内配置檔案的配置會被使用。
如果内配置檔案裡和外配置檔案裡都有相同的配置,比如兩者都配置了資料庫,但是兩個連接配接的不同,那外配置檔案會覆寫内配置檔案裡的配置。
感謝那位大神了,我沒有詳細研究這個,有興趣的小夥伴自我驗證下吧。