Springboot jar包讀取resources目錄下的配置文件
- 使用環境:
kubernetes集羣、docker容器、springboot項目
- 問題由來:最近在跟AI訓練平臺對接docker接口,通過調用SpringBoot項目提供的docker接口實現對docker的所有日常操作。在做到docker import接口時,由於AI訓練平臺的鏡像文件比較大,不能直接獲取到鏡像文件的文件流,所以考慮到了大文件分段傳輸技術,將AI訓練平臺的文件通過分段傳輸過來,然後本地將分段文件保存,傳輸完畢後再將分段文件整合,實現鏡像文件的傳輸,然後再使用shell腳本進行鏡像文件的加載。我將shell腳本放到了resource/shell/目錄下,在本地調試的時候是可以獲取到shell腳本的,但當我將項目通過CI構建完成發佈到kubernetes集羣后,報錯:
- 問題分析與解決:
-
使用jar vtf 【fileName.jar】查看jar包內的文件,發現文件是存在的,路徑也是正確的,但不知爲何k8s-gpu-api-1.0.0.jar和classes後會有感嘆號(路徑非法)
-
谷歌、百度搜索了相關信息,找到了問題的原因,但按照網上說的文件流、還是ApplicationHome都沒有解決問題。
在本地進行調試時,文件是真實存在於磁盤的某個目錄。此時通過獲取文件路徑,是可以正常讀取的,因爲文件確實存在。而打包成jar以後,實際上文件是存在於jar這個文件裏面的資源文件,在磁盤是沒有真實路徑的。所以通過ResourceUtils.getFile或者this.getClass().getResource("")方法無法正確獲取文件。 [^1]
-
將shell腳本通過DockerFile的COPY命令移動到容器的某個目錄,然後服務的指定容器上shell腳本所在的shell文件。方法成功,順利解決spingboot 打成jar包後找不到文件的問題
- 參考文章
[^1] https://www.cnblogs.com/kaile/p/10193979.html