1. 程式人生 > >java動態載入配置檔案不成功的問題

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方法,但是呼叫的是編譯後的路徑下的檔案。 
而配置檔案修改之後,並沒有重新編譯過,因此編譯後的路徑下的檔案還是修改之前的那個檔案的內容,因此也就出現那種怎麼測試都感覺程式碼沒生效的錯覺了。