我正在尝试使用其他模块中的资源来导入文件。我的目标是通过每个自定义类传递文件名,并让另一个模块的基类获取文件。
但我总是得到一个Nullpointer异常。 我做错了什么?
模块A:
src/main/java/foo/bar/MyBaseClass.java
src/main/resources/foo/bar/test.xml
模块B:
src/main/java/other/path/MyCustomClass extends MyBaseClass
类:
abstract class MyBaseClass {
public static String TESTFILE = "foo/bar/test.xml";
getData(String filename) {
InputStream inputStream = MyBaseClass.class.getResourceAsStream(String filename); //NPE
}
}
class MyCustomClass extends MyBaseClass() {
doSomething() {
getData(TESTFILE);
}
}
/编辑: 我应该使用这样的东西吗?
super.getClass().getResourceAsStream(..)
答案 0 :(得分:1)
您很可能应该使用ClassLoader.getResourceAsStream()
e.g。
Thread.currentThread().getContextClassLoader().getResourceAsStream()
(可能更安全,可能更适合在不同的环境中工作,即使用特殊的类加载器,Java EE?)
或至少
aClass.getClassLoader().getResourceAsStream()
这就是你应该如何在类路径上加载资源,这可能在与你调用getResourceXXX的给定类不同的JAR(或类路径条目)中。
如果您正在使用模块B中的类并且想要从模块A加载资源,则需要使用ClassLoader.getResourceXXX。
所以在Java中你通常应该使用这种方法(除非你关心将资源加载限制在一个较小的区域......)
另外要注意的事项是:注意需要一个前导“/”,总是仔细检查你正在使用哪种方法的javadoc
答案 1 :(得分:0)
getResourcesAsStream()需要一个 NOT 名称的名称,因为它是一个资源名称。此外,您似乎正在尝试从其他maven模块访问资源。并且不要忘记您正在尝试通过相对路径访问资源,该路径应该更改为绝对资源路径,如 /foo/bar/test.xml 而不是 foo / bar / test .XML