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

Pra*_*hal 4 java junit jvm servlets 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.
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

MyFile 文件夹/目录在类路径中可用。当MyUtil.readFiles()被称为JUnit测试情况下,它工作正常。但是当它在servelet.init()方法中被调用时ClassLoader.getSystemClassLoader().getResource("MyFile")会给出空值。

die*_*end 5

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

另一种方法是有效的,因为在 web 服务器中有不止一个类加载器,你不能确定是哪个加载了你的类。我猜ClassLoader类是在任何带有默认 java 类加载器的东西之前加载的,然后MyUtil用不同的类加载器和 web 服务器加载类,因此它导致了不同的类路径。