記java動態加載配置文件不成功的問題

一、問題背景:

在我們之前的項目中,很多數據是配置在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方法,但是調用的是編譯後的路徑下的文件。
而配置文件修改之後,並沒有重新編譯過,因此編譯後的路徑下的文件還是修改之前的那個文件的內容,因此也就出現那種怎麼測試都感覺代碼沒生效的錯覺了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章