gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:57 24 4
gpt4 key购买 nike

故意破坏以下代码以识别 NullPointerException 的来源,这本来应该非常简单但结果让我抓狂:

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"); 返回 null

这是一个基于 CXF 的客户端,我验证了“resource.properties”文件在客户端的 jar 驻留(和运行)的当前目录中.

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

            File file = new File("resource.properties");
System.out.println(file.getAbsolutePath());

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

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

  System.out.println(Thread.currentThread().getContextClassLoader());

而是一些目录结构as demonstrated here ,我得到的是:

com.simontuffs.onejar.JarClassLoader@1decdec

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

我错过了什么?

最佳答案

我解开了这个谜。

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

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

所以当我用原来的运行时

contextClassLoader.getResourceAsStream("resource.properties")

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

  INFO: CLASSPATH: myproj.one-jar.jar
ClassLoader resource path: null

.

然后我开始怀疑与“jar in a jar” 相关的事情,因为这正是 com.simontuffs.onejar 本质上所做的(即将我的项目的 jar 包装在里面)一个包含所有其他库 jar 的 jar),所以我用 7-Zip 打开 myproj.one-jar.jar 并记下“resource.properties”的完整(绝对)路径:

myproj.one-jar.jar\main\myproj.jar\webapp\WEB-INF\classes\resource.properties

.

所以我将 getResource("resource.properties") 修改为:

 getResource("/main/myproj.jar/webapp/WEB-INF/classes/resource.properties")

这并没有解决问题,但在空指针条件下打印了以下内容:

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

.

然后...神圣的干预降临在我身上,我有了洞察力(我发誓没有阅读任何可能暗示这一点的文档!)我应该改用这条路:

 getResource("/webapp/WEB-INF/classes/resource.properties")

瞧!它有效。

哇哦。

关于java - 为什么 ClassLoader.getResourceAsStream() 会返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com