克隆Project后,ClassLoader.getSystemClassLoader()。getResourceAsStream返回null

时间:2018-10-12 15:54:33

标签: java eclipse swt classpath classloader

首先这不是重复的,因为我正在应用其他类似问题的解决方案,但我是唯一有这个特殊问题的人,请阅读完整的问题。< / p>

我正在使用以下行从res文件夹中获取图像:

shell.setImage(new Image(display, ClassLoader.getSystemClassLoader().getResourceAsStream("icon_128.png")));

该文件位于项目的“ res”文件夹中。

在我将项目上传到bitbucket中的GIT存储库之前,它一直运行良好。克隆项目并导入之后,现在我的项目崩溃,因为getResourceAsStream(“ icon_128.png”)返回null。

这非常令人沮丧,因为它可以在未版本化为git的另一个项目中完美运行,而仅在我使用git克隆的新目录项目中崩溃。

在两个版本的项目中,文件都位于“ res”文件夹中。

请,您对此有何了解?

1 个答案:

答案 0 :(得分:0)

git与它无关。您没有提供足够的细节来确定正在发生的事情,但是我想到了两个明显的问题:

[1] getResourceAsStream在与Java查找类文件相同的位置查找命名文件:classpath。您可以从编辑器或在命令行上使用java来运行此代码(在这种情况下,您正在运行jar文件,并且构建工具会在该jar中添加一个Class-Path条目。 -jar开关(或不是),在这种情况下,您需要在命令行上指定类路径),或使用构建工具(在这种情况下,它将提供类路径):icon_128.png需要放在类路径上条目之一的根中,现在不是。解决方法是修复此问题。例如,Maven将/ src / main / resources中找到的所有资源复制到它创建的任何jar中。您的icon_128.png应该在那里。

[2]这不是正确的方法。正确的方法是ClassThisCodeIsIn.class.getResourceAsStream("/icon_128.png")(注意:起始斜杠;这很重要)。您的版本具有各种略有异国情调的失败案例,该版本会跳过这些案例。该版本将特别在生成您的类文件的类路径中显示,并且无法进行NPE;您的版本在各种情况下都会失败或抛出NullPointerExceptions。

NB:克隆并重新构建时,“ build”目录已被有效擦除,因为您没有将其检入源代码管理。这就是为什么它以前曾经起作用,而现在却不起作用。 git不怪;您或您的IDE,将icon_128.png复制到了构建目录,并且每次克隆git repo时都需要重复该步骤。构建工具可自动执行此步骤,并确保您可以从源代码管理中进行全新签出,然后调用构建工具,一切完成后一切都会好起来。