Java servlet容器和测试环境中ClassLoader.getSystemClassLoader().getResource()的不同行为
我有一个web应用程序,我的要求是读取一些文件并进行处理,并在应用程序启动时将文件内容保存在数据库中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
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
?谢谢!第一个建议奏效了。把它作为答案。