使用外国maven模块的资源?

时间:2012-05-30 14:23:21

标签: java maven

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

但我总是得到一个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(..)

2 个答案:

答案 0 :(得分:1)

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

e.g。

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

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

或至少

aClass.getClassLoader().getResourceAsStream()

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

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

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

另外要注意的事项是:注意需要一个前导“/”,总是仔细检查你正在使用哪种方法的javadoc

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

答案 1 :(得分:0)

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