以前只是听说过:安装tomcat的时候,最好把默认的空格去掉,但一直不知道他能惹什么祸。今天终于被我撞到了。
我写了一个根据正则表达式加载类路径(web-inf/classes目录)配置文件的方法,如下:
Java代码
public static List getResourceFiles(String regex) {
ClassLoader classLoader = FileUtil.class.getClassLoader();
Enumeration classRootUrls = null;
try {
classRootUrls = classLoader.getResources("");
} catch (IOException e) {
throw new BacteriaException("获取类加载器根目录出错。",e);
}
List files = new ArrayList();
while (classRootUrls.hasMoreElements()) {
URL classRootUrl = (URL) classRootUrls.nextElement();
File classRootFile = new File(classRootUrl.getFile());
SearchFileHandler sfh = new SearchFileHandler(regex);
FileUtil.walkFile(classRootFile, sfh);
files.addAll(sfh.getFiles());
}
return files;
}
原理:首先找到类所在目录,然后遍历这个目录,把指定的配置文件都找出来。
我在eclipse中运行的时候,一切都很正常。但是部署到tomcat下怎么也加载不了我指定的文件。
于是加上log,把classRootUrls都打出来。
在eclipse下运行,找到如下目录:
file:D:/Tomcat 5.0/common/classes/
file:/E:/eclipse/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/webapps/hebmc/WEB-INF/classes/
在tomcat下运行,找到如下目录:
file:D:/Tomcat 5.0/common/classes/
file:D:/Tomcat 5.0/shared/classes/
file:/D:/Tomcat%205.0/webapps/xxxxx/WEB-INF/classes/
结论已经很明了了,在tomcat中运行的时候,获取到的应用程序的类路径中空格被改成了“%20”,这样一来,java就不认为“file:/D:/Tomcat%205.0/webapps/hebmc/WEB-INF/classes/”是一个目录了。所以无法对它进行遍历。把安装目录的空格去掉后,问题得到了解决。
提醒大家如果再有类似的需求,要么把tomcat安装目录的空格去掉,要么得在代码中把“%20”改回空格。