首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ClassLoader.getResourceAsStream()返回null?

为什么ClassLoader.getResourceAsStream()返回null?
EN

Stack Overflow用户
提问于 2014-04-09 18:31:57
回答 2查看 15.7K关注 0票数 6

为了识别NullPointerException的来源,下面的代码被故意打断了,这些代码本来应该非常简单,但结果却让我发疯:

代码语言:javascript
复制
Properties properties = new Properties();
Thread currentThread = Thread.currentThread();
ClassLoader contextClassLoader = currentThread.getContextClassLoader();
InputStream propertiesStream = contextClassLoader.getResourceAsStream("resource.properties");
if (propertiesStream != null) {
  properties.load(propertiesStream);
  // TODO close the stream
} else {
  // Properties file not found!
}

我得到了“属性文件未找到!”错误,即contextClassLoader.getResourceAsStream("resource.properties");返回空

这是一个基于CXF的客户机,我验证了"resource.properties“文件是客户端jar所在的当前目录中的(并运行)。

我还通过包含以下诊断代码验证了绝对路径:

代码语言:javascript
复制
            File file = new File("resource.properties");
            System.out.println(file.getAbsolutePath());

绝对路径指向客户端jar的位置。

我还尝试找出类加载器的上下文,使用:

代码语言:javascript
复制
  System.out.println(Thread.currentThread().getContextClassLoader());

但是,相反,一些目录结构as demonstrated here,我得到的只是:

com.simontuffs.onejar.JarClassLoader@1decdec

为什么ClassLoader.getResourceAsStream()返回null?

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-10 14:50:52

我解开了谜团。

解决问题的关键是在propertiesStream为null时嵌入一些诊断日志记录:

代码语言:javascript
复制
String classpath = System.getProperty("java.class.path");
LOG.info("CLASSPATH: " + classpath);
ClassLoader loader = MyClientMain.class.getClassLoader();
System.out.println("ClassLoader resource path: " + loader.getResource("resource.properties"));                    

所以当我用原版

代码语言:javascript
复制
contextClassLoader.getResourceAsStream("resource.properties")

我收到空指针条件,打印:

代码语言:javascript
复制
  INFO: CLASSPATH: myproj.one-jar.jar
  ClassLoader resource path: null

然后,我开始怀疑与"jar中的jar“相关的东西,因为这正是com.simontuffs.onejar所做的(即将我的项目的jar封装在一个包含所有其他库jar的jar中),所以我用7-Zip打开myproj.one-jar.jar,并注意到了”resource.properties“的完整(绝对)路径:

代码语言:javascript
复制
myproj.one-jar.jar\main\myproj.jar\webapp\WEB-INF\classes\resource.properties

因此,我将getResource("resource.properties")修改为:

代码语言:javascript
复制
 getResource("/main/myproj.jar/webapp/WEB-INF/classes/resource.properties")

它没有修复问题,但在空指针条件下打印了以下内容:

代码语言:javascript
复制
INFO: CLASSPATH: myproj.one-jar.jar
ClassLoader resource path: jar:file:/myproj.one-jar.jar!/main/myproj.jar!//main/myproj.jar/webapp/WEB-INF/classes/resource.properties

然后..。神圣的干预落在我的头上,我有了洞察力(我发誓,没有读过任何可能暗示这一点的文件!)我应该使用这个路径,而不是:

代码语言:javascript
复制
 getResource("/webapp/WEB-INF/classes/resource.properties")

还有沃拉!它起作用了。

呼。

票数 10
EN

Stack Overflow用户

发布于 2014-04-09 18:54:05

正如EJP所指出的,这意味着资源无法通过这个特定的类加载器的类路径获得(不同的类加载器可以有不同的类路径)。

因为类加载器是一个JarClassLoader,所以它只能加载包含在jar文件中的资源。它不会看到与jar文件位于同一个目录中的文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22971088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档