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

Java servlet容器和测试环境中ClassLoader.getSystemClassLoader().getResource()的不同行为,java,servlets,junit,jvm,classloader,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 // ClassLoad

我有一个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
文件夹/dir在类路径中可用。在JUnit测试用例中调用
MyUtil.readFiles()
时,它工作正常。但是当在
servelet.init()
方法
ClassLoader.getSystemClassLoader().getResource(“MyFile”)
中调用它时,会给出空值。

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


另一种方法之所以有效,是因为在webserver中有多个类装入器,您无法确定是哪个类装入了您的类。我猜
ClassLoader
类在使用默认java类加载器之前加载,然后
MyUtil
类在Web服务器上加载了不同的类加载器,因此导致了不同的类路径。

试着改用
getClass().getClassLoader().getResource
。(不是静态的
ClassLoader.getSystemClassLoader()
)无论如何,如果classpath中存在文件夹,为什么不直接使用
classpath:/path/to/file
?谢谢!第一个建议奏效了。把它作为答案。