一致开发和运行配置
现在采用eclipse进行开发,在运行环境在tomcat中,目录结构如下
project
|----src
|----web
|----|----WEB-INF
|----|----|----classes
|----|----|----conf
系统在运行时所有的配置文件在conf目录下,在开发过程中采用junit进行测试,出现问题就是spring的配置文件没有办法进行配置,因为开发查询文件的目录在classes目录下,而在运行时web目录下和classes下都可以,所以没有办法编写配置文件的目录,而且为了防止程序部署的简单性,开发环境和运行环境不需要修改配置文件。
考虑到造成这个问题的原因是ClassLoader的资源查询目录不同,所以从ClassLoader入手,自定义ClassLoader类,定义类如下,因为考虑到只是配置文件不同,采用如下方式:
public class ProjectJunitClassLoader extends ClassLoader { private String dir;
public ProjectJunitClassLoader(ClassLoader parent, String dir) {
super(parent);
this.dir=dir;
}protected URL findResource(String name) {
try{
URLurl=super.findResource(name);
if(url!=null){
returnurl;
}
url=newURL("file:///"+converName(name));
returnurl;
}catch(MalformedURLExceptionmue){
returnnull;
}
}private String converName(String name) {
StringBuffersb=newStringBuffer(dir);
sb.append(File.separator+name);
returnsb.toString();
}}
这样可以通过传入我们的web的目录就可以进行文件的加载操作,还有一个问题就是如何把ClassLoader在eclipse总是用,考虑到junit中添加了@BeforeClass在运行时只运新一次,在里面添加如下代码:
static ClassLoader oldLoader = null;
@BeforeClass
publicstaticvoidsetupClassLoader(){
oldLoader=Thread.currentThread().getContextClassLoader();
//newClassLoader
StringclassPath=oldLoader.getResource(".").getPath();
StringconfPath=classPath.substring(0,classPath.length()-17);
Thread.currentThread().setContextClassLoader(newProjectJunitClassLoader(oldLoader,confPath));
}
@AfterClass
publicvoiduninstallClassLoader(){
Thread.currentThread().setContextClassLoader(oldLoader);
}这样就可以解决此问题,新添加的ClassLoader只是在原来的classLoader没有找到的情况下,进行这个操作,而且只是Junit进行使用,完美解决此问题。