我正在尝试使用另一个模块中的资源来导入文件。我的目标是通过每个自定义类传递文件名,并让另一个模块的基类获取文件。
但我总是遇到空指针异常。 我做错了什么?
模块A:
src/main/java/foo/bar/MyBaseClass.java
src/main/resources/foo/bar/test.xml
模块B:
src/main/java/other/path/MyCustomClass extends MyBaseClass
类(class):
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(..)
最佳答案
您很可能应该使用 ClassLoader.getResourceAsStream()
例如
Thread.currentThread().getContextClassLoader().getResourceAsStream()
(可能更安全,可能在不同的环境中更正确地工作,即使用特殊的类加载器,Java EE?)
或者至少
aClass.getClassLoader().getResourceAsStream()
这是您应该在类路径上加载资源的方式,这些资源可能位于与您调用 getResourceXXX 的给定类不同的 JAR(或类路径条目)中。
如果您使用模块 B 中的类,并且想要从模块 A 加载资源,则需要使用 ClassLoader.getResourceXXX。
所以在Java中你通常应该使用这种方法(除非你关心将资源加载限制在较小的区域......)
另一件事要注意:注意需要有一个前导“/”,无论您使用哪种方法,都要仔细检查 javadoc
关于java - 使用国外maven模块的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10818233/