论坛首页 Java企业应用论坛

一致开发和运行配置

浏览 1433 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-30  

现在采用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 {
   URL url = super.findResource(name);
   if (url != null) {
    return url;
   }
   url = new URL("file:///" + converName(name));
   return url;
  } catch (MalformedURLException mue) {
   return null;
  }
 }

 private String converName(String name) {
  StringBuffer sb = new StringBuffer(dir);
  sb.append(File.separator + name);
  return sb.toString();
 }

}

这样可以通过传入我们的web的目录就可以进行文件的加载操作,还有一个问题就是如何把ClassLoader在eclipse总是用,考虑到junit中添加了@BeforeClass在运行时只运新一次,在里面添加如下代码:

 static ClassLoader oldLoader = null;
 @BeforeClass
 public static void setupClassLoader(){
  oldLoader = Thread.currentThread().getContextClassLoader();
  //new ClassLoader
  String classPath = oldLoader.getResource(".").getPath();
  String confPath = classPath.substring(0, classPath.length()-17);
  Thread.currentThread().setContextClassLoader(new ProjectJunitClassLoader(oldLoader,confPath));
 }
 
 @AfterClass
 public void uninstallClassLoader(){
  Thread.currentThread().setContextClassLoader(oldLoader);
 }

这样就可以解决此问题,新添加的ClassLoader只是在原来的classLoader没有找到的情况下,进行这个操作,而且只是Junit进行使用,完美解决此问题。

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics