0

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

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

模块 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(..)
4

2 回答 2

1

您很可能应该使用ClassLoader.getResourceAsStream()

例如

Thread.currentThread().getContextClassLoader().getResourceAsStream()  

(可能更安全,可能更正确地在不同的环境中工作,即使用特殊的类加载器,Java EE?)

或者至少

aClass.getClassLoader().getResourceAsStream()

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

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

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

另一件需要注意的事情:注意需要一个前导“/”,总是仔细检查你正在使用的任何方法的javadocs

另见:http ://www.xyzws.com/servletfaq/what-is-different-between-classloadergetresourceasstream-and-classgetresourceasstream/21

于 2012-05-31T02:42:27.970 回答
0

getResourcesAsStream()需要一个不是文件名的名称,因为它是资源名称。此外,您似乎正在尝试从其他 Maven 模块访问资源。不要忘记您正在尝试通过相对路径访问资源,该路径应更改为绝对资源路径,例如/foo/bar/test.xml而不是foo/bar/test.xml

于 2012-05-30T17:37:17.473 回答