java - getResourceAsStream 在新环境下失败?

标签 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");

效果很好(我刚刚从资源路径中删除了第一个斜杠)。

顺便说一句,我使用 Linux。路径中的第一个斜线通常表示“从根目录”,所以如果这个逻辑对于 java 资源加载也是合理的,那么第一个例子应该永远不会起作用!?

问题:第一个代码示例有问题吗,即 /com/ 而不是 com/?它只是错误的代码还是意味着不同的东西?

谢谢!

最佳答案

这取决于您获取资源的方式。当您使用 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 松懈并允许使用最后一种形式。

关于java - getResourceAsStream 在新环境下失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238562/

相关文章:

java - 如何在 FreeMarker 中显示日历类型数据

java - 在 JPA 中使用 oneToMany 关系时,Postgresql 在列中抛出空值违反了非空约束

c# - 使用 xamarin 和 c# 在 android 上更改 cultureinfo

java - java类在内存中驻留的时间是多少

java - Maven 故障保护 : NoClassDefFoundError for integration tests

Java 泛型 - 为什么 new Money<Dollar>(4.0) === new Money<Franc>(4.0) 相等?

wpf - 根据PresentationFramework.Aero重写WPF TextBox中的默认样式。

javascript - 如何在我的应用程序中发出 POST 请求

maven - 如何设置java类加载器PARENT_LAST

java - getResourceAsStream() 为属性文件返回 null