java動態載入配置檔案不成功的問題
本文為【塗宗勳的技術部落格】原創,若要轉載,請註明出處:http://blog.csdn.net/tuzongxun
一、問題背景:
在我們之前的專案中,很多資料是配置在application.properteis檔案中的,這樣很多時候修改了資料後,只需要重啟應用,而不需要重新打包編譯。
但是近期有一個新的需求,運維希望不僅不用重新打包編譯,即便是重啟,也要省掉。
二、問題描述:
之所有之前修改了資料後需要重啟應用,是因為我們的專案中application.properties檔案只會載入一次,然後就放在記憶體中供程式呼叫。
那麼要實現不重啟的思路,很容易就能想到一個,那就是每次需要呼叫配置檔案裡的類容的時候,就再載入一次配置檔案,程式碼有很多種,其中一個可以是類似下邊這樣的:
public void sayAaa(){ Properties pro = new Properties(); String path = this.class.getClassLoader().getResource("aaa.properties").getPath(); try { InputStream is = new FileInputStream(path); pro.load(is); aaa = pro.getProperty("aaa"); is.close(); pro.clear(); } catch (IOException e) { e.printStackTrace(); } System.out.println(aaa); }
按照正常的想法,這樣應該是可以實現每次修改了配置檔案後,再呼叫sayAaa方法就列印更改後的資料的,我那個負責這個任務的同事也就是這樣做的。
但是當他實際上在eclipse中測試的時候,卻發現怎麼改,再次呼叫sayAaa之後都是原來的值,讓他一度懷疑程式碼有問題。
三、問題分析:
實際上,他的這種程式碼是沒問題的,確實可以實現每次呼叫都再次讀取相應的檔案。
那麼他eclipse中測試卻並不能得到想要的結果,這又是怎麼回事呢?
原因很簡單,那就是他的這個功能實現的過程實際上分了這樣幾個步驟:
1、寫程式碼,開發階段;
2、測試,程式碼編譯階段;
3、測試、程式碼執行階段。
這樣一分,可能問題就比較清晰了:他在eclipse中改配置檔案,實際上改的是開發階段的檔案,在編譯前的路徑中;而測試時,這個檔案會在編譯的時候放到編譯後的路徑中。
程式碼執行之後,修改了配置檔案,然後也重新呼叫了sayAaa方法,但是呼叫的是編譯後的路徑下的檔案。
而配置檔案修改之後,並沒有重新編譯過,因此編譯後的路徑下的檔案還是修改之前的那個檔案的內容,因此也就出現那種怎麼測試都感覺程式碼沒生效的錯覺了。