背景 在項目的部署過程中,一般是打成 war 或者 jar 包,這樣一般存在兩種問題: 1. 即使是配置文件修改,也還需要整個項目重新打包和部署。 2. 整個項目只有一套環境,不能切換。 針對上面的問題,可以使用外部化配置來解決。 需求 由於伺服器上的應用伺服器存放路徑未知,只知應用伺服器的目錄結構 ...
背景
在項目的部署過程中,一般是打成 war 或者 jar 包,這樣一般存在兩種問題:
- 即使是配置文件修改,也還需要整個項目重新打包和部署。
- 整個項目只有一套環境,不能切換。
針對上面的問題,可以使用外部化配置來解決。
需求
由於伺服器上的應用伺服器存放路徑未知,只知應用伺服器的目錄結構。所以需要通過文件的相對路徑,實現外部化配置。
環境
- JDK6
- Spring 3.2.5
方案
File
不建議使用 File 的相對路徑來獲取,因為以下兩點:
- File 的相對目錄會隨著啟動的目錄變化而變化。
- File 不能夠獲取 jar 包中的配置文件。
Class
可以使用 getClass().getResource
或者 getClass().getResourceAsStream
來獲取,可以獲取到 jar 包中的文件。
- 如果文件路徑以“/”開頭,表示獲取classpath路徑下的文件。
- 不以“/”開頭,獲取和當前類同一目錄下的文件。
ClassLoader
ClassLoader 和 Class 類似,區別是 ClassLoader 以“/”開頭返回null,並且相對路徑是獲取 classpath 下的文件。
實現
最終選擇使用 ClassLoader 來實現較為簡單,部分實現。
InputStream is = getClass().getClassLoader().getResourceAsStream(EXTERNAL_CONFIG_FILE);
if (is == null) {
logger.info("外部配置不存在。");
}
try {
ResourcePropertySource source = new ResourcePropertySource(new InputStreamResource(is));
// 外部配置優先順序最高
beanFactory.getBean(StandardEnvironment.class).getPropertySources().addFirst(source);
} catch (IOException e) {
logger.error("獲取外部配置失敗。", e);
}
拓展
如果使用該種方法,出現錯誤:
xxx has been normalized to [null] which is not valid
則可以參考這裡