Java 使用国外maven模块的资源?

Java 使用国外maven模块的资源?,java,maven,Java,Maven,我正在尝试使用另一个模块的资源导入文件。我的目标是通过每个自定义类传递文件名,并让另一个模块的基类获取文件 但我总是得到一个空指针异常。 我做错了什么 单元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 MyBaseCla

我正在尝试使用另一个模块的资源导入文件。我的目标是通过每个自定义类传递文件名,并让另一个模块的基类获取文件

但我总是得到一个空指针异常。 我做错了什么

单元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(..)

由于它是资源名,因此需要而不是文件名的名称。此外,看起来您正试图从其他maven模块访问资源。不要忘记,您正试图通过相对路径访问资源,该路径应更改为绝对资源路径,如/foo/bar/test.xml,而不是foo/bar/test.xml。

您很可能应该使用

e、 g

(可能更安全,可以在不同的环境中更正确地工作,例如,在使用特殊类加载器的地方,JavaEE?)

或者至少

aClass.getClassLoader().getResourceAsStream()
这就是在类路径上加载资源的方式,该类路径可能位于与调用getResourceXXX的给定类不同的JAR(或类路径条目)中

如果您正在使用模块B中的类,并且希望从模块a加载资源,则需要使用ClassLoader.getResourceXXX

所以在Java中,您通常应该使用这种方法(除非您关心将资源加载限制在较小的区域…)

另一件需要注意的事情是:注意需要一个前导“/”,无论使用哪种方法,都要仔细检查javadocs


另请参见:

getResourceAsStream
在提供的文件名为空时抛出NPE。你确定你要传递的文件名不是空的吗?啊,你在你的模块中添加了对模块A的依赖项吗?Bsuper.getClass()将返回与getClass()相同的结果。是的,我正在尝试从其他maven模块访问一个文件,这就是我想做的,这就是我的问题!
aClass.getClassLoader().getResourceAsStream()