一致开发和运行配置

现在采用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进行使用,完美解决此问题。

相关推荐