getResourceAsStream在新环境下失败了吗?

时间:2010-07-13 15:11:27

标签: java resources classloader

喂,

我有以下代码行:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");

我知道带有com / thinkplexx / lang / de / general.xml的jar在classpath中。

它在“以前的环境”下工作,这是maven2 build。

现在,我评估maven3并且它不起作用!我知道,如果我将代码更改为:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml");

它工作得很好(我刚从资源路径中删除了第一个斜杠)。

顺便说一下,我使用的是Linux。路径中的第一个斜杠通常意味着“从根目录”,所以如果这个逻辑对于java资源加载也是合理的,那么第一个示例应该永远不会有效!

问题:第一个代码示例有问题,即使用 / com / 而不是 com / ?这只是糟糕的代码还是意味着不同的东西?

谢谢你!

1 个答案:

答案 0 :(得分:8)

这取决于您获取资源的方式。当您使用ClassLoader时:

InputStream stream= getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");

领先的'/'毫无意义。因此,正确的形式是“com / thinkplexx / lang / de / general.xml”。

如果您使用“类”,则如下所示:

InputStream stream= getClass().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");

你得到了不同的行为。 Class.getResourceAsStream会考虑没有前导''的课程。相对于包含该类的包。使用前导'。'指定的资源是绝对的,或相对于jar的根来解决。

因此,如果this是对com.example.SomeThing的引用,那么预期的行为是:

getClass().getResourceAsStream("/a/b/c.xml")  ==> a/b/c.xml
getClass().getResourceAsStream("a/b/c.xml")  ==> com/example/a/b/c.xml
getClass().getClassLoader().getResourceAsStream("a/b/c.xml")  ==> a/b/c.xml
getClass().getClassLoader().getResourceAsStream("/a/b/c.xml")  ==> Incorrect

Maven2变得松懈并允许最后一个表格。