Servlet容器和测试环境中ClassLoader.getSystemClassLoader()。getResource()的不同行为

时间:2014-09-16 13:18:31

标签: java servlets junit jvm classloader

我有一个Web应用程序,我的要求是读取一些文件并对其进行处理,并在应用程序启动时将文件内容保存在数据库中。

class MyUtil{
/**
*Read the files
*/
 public static void readFiles(){ 

  File file = new File(ClassLoader.getSystemClassLoader().getResource("MyFile").toURI()); //NullPointerException
  // ClassLoader.getSystemClassLoader().getResource("MyFile") is giving null in servlet.init() method.
  if (file.isDirectory()) {
        //Read all the files and persist.
   }
 }
}
类路径中提供了

MyFile folder / dir 。在JUnit测试用例中调用MyUtil.readFiles()时,它可以正常工作。但是当在servelet.init()方法ClassLoader.getSystemClassLoader().getResource("MyFile")中调用它时,会给出null。

1 个答案:

答案 0 :(得分:3)

您可以使用getClass().getClassLoader().getResource(...)替代ClassLoader.getSystemClassLoader().getResource(...)

替代方案有效,因为在网络服务器中有多个类加载器,并且您无法确定哪个加载了您的类。我猜ClassLoader类在使用默认的java类加载器之前加载,然后MyUtil类加载了与webserver不同的类加载器,因此导致了不同的类路径。