Java getResourceAsStream在新环境下失败?

Java getResourceAsStream在新环境下失败?,java,resources,classloader,Java,Resources,Classloader,你好 我有以下代码行: InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml"); 我知道带有com/thinkplexx/lang/de/general.xml的jar位于类路径中 它在“以前的环境”下工作,即maven2构建 现在,我评估了maven3,但它不起作用!我知道,如果我将代码更改

你好

我有以下代码行:

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("/com/thinkplexx/lang/de/general.xml");
我知道带有com/thinkplexx/lang/de/general.xml的jar位于类路径中

它在“以前的环境”下工作,即maven2构建

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

InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream("com/thinkplexx/lang/de/general.xml");
它工作得很好(我刚刚从资源路径中删除了第一个斜杠)

顺便说一句,我使用Linux。path中的第一个斜杠通常意味着“从根目录”,因此,如果这个逻辑对于java资源加载来说也是合理的,那么第一个示例就永远不会起作用

问题:第一个代码示例(即/com/和非com/)是否有问题?它只是坏代码还是意味着一些不同的东西


谢谢大家!

这取决于您如何获得资源。使用类加载器时,如中所示:

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");
你会有不同的行为。<代码>类.GETRealSudioSturts将考虑没有前导'.'的类,它与包含该类的包相对。用前导“.”指定的资源是绝对的,或相对于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很松懈,允许最后一种形式。

Devons的答案对我很有用。此外,我还发现:“ClassLoader中的方法使用给定的字符串作为资源的名称,而不应用任何绝对/相对转换(请参见类中的方法)。名称不应有前导“/”