本地項目
在本地類庫中,我經常使用當前目錄來放置.properties文件,這時調用方只要引用我的jar,並且將我的.properties放在他的classpath里面即可,比如:
- p.load(new FileInputStream("HanLP.properties"));
這樣類似下圖的項目結構就可以跑起來:
JSP/Servlet Web項目
但是到了Web項目時,情況大不相同。在Tomcat下,classpath里只含apache-tomcat-8.0.14\bin目錄下有限的幾個jar,根本沒有目錄,更不用提當前目錄了:
- Using CATALINA_BASE: "\system\tomcat\Tomcat_8_0_14_InteljSearch"
- Using CATALINA_HOME: "\apache-tomcat-8.0.14"
- Using CATALINA_TMPDIR: "\apache-tomcat-8.0.14\temp"
- Using JRE_HOME: "\Java\jdk1.7.0_45"
- Using CLASSPATH: "\apache-tomcat-8.0.14\bin\bootstrap.jar;\apache-tomcat-8.0.14\bin\tomcat-juli.jar"
解決方案
一般而言,有三種方案:
一
通過 ClassLoader#getResourceAsStream()
來加載:
- p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("HanLP.properties"));
此時HanLP.properties可以放在下列目錄:
Webapp/WEB-INF/lib
Webapp/WEB-INF/classes
Appserver/lib
JRE/lib
特別的,如果你正處於開發狀態,可以簡單地將HanLP.properties扔到src目錄里或者resource目錄里。提醒,如果放到src或者resource目錄里,那么每次deploy都會覆寫classes目錄下的配置文件,並且你無法使用Properties#store()來保存配置文件。
二
放到 web
目錄下,通過ServletContext#getResourceAsStream()
讀取。
- Properties properties = new Properties();
- properties.load(getServletContext().getResourceAsStream("/WEB-INF/filename.properties"));
三
用絕對路徑,通過普通的 java.io
方式讀取。
- Properties properties = new Properties();
- properties.load(new FileInputStream("/absolute/path/to/filename.properties");
不過這種方式的可移植性並不好,並不推薦。
Reference
http://stackoverflow.com/questions/2161054/where-to-place-configuration-properties-files-in-a-jsp-servlet-web-application