本地项目
在本地类库中,我经常使用当前目录来放置.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
知识共享署名-非商业性使用-相同方式共享:码农场 » JSP/Servlet Web应用中.properties文件的放置与读取