【问题标题】:ClassLoader.getSystemClassLoader().getResourceAsStream returns null after cloning Project克隆项目后 ClassLoader.getSystemClassLoader().getResourceAsStream 返回 null
【发布时间】:2019-12-23 22:34:18
【问题描述】:

我一直在应用其他类似问题的解决方案。

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

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

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

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

这令人沮丧,因为它在另一个未版本化为 G|it 的项目中完美运行,但仅在我使用 Git 克隆的新目录项目中崩溃。

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

这会发生什么?

【问题讨论】:

  • 您确定您已将所有内容提交给 GIT 并且文件实际上保留在克隆的 repo 中吗?
  • 还要检查res文件夹是否(仅)在源文件夹下 - 它必须在构建文件夹中,还有类文件被搜索
  • omg 问题是我需要类路径上的这一行 "" 和 wtf 我该如何解决这种情况? ,classpath eclipse项目文件在git上应该被忽略了,怎么处理呢?
  • @Ivan 我正在使用常规 Eclipse 启动,所以必须是 ANT,你能给我一个示例 build.xml 文件,其中包含在答案中的类路径中吗?

标签: java eclipse swt classpath classloader


【解决方案1】:

git 与它无关。你没有提供足够的细节来确定发生了什么,但我想到了两个明显的问题:

[1] getResourceAsStream 在 java 查找类文件的同一位置查找命名文件:类路径。您正在从编辑器或在命令行上使用java 运行此代码(在这种情况下,您正在运行一个 jar 文件,如果您使用 @ 987654323@ 开关,或者你不是,在这种情况下你在命令行上指定类路径),或者使用构建工具(在这种情况下它将提供类路径): icon_128.png 需要在类路径上的条目之一的根,现在不是。解决办法是,好吧,解决这个问题。例如,Maven 将 /src/main/resources 中的所有资源复制到它创建的任何 jar 中。你的 icon_128.png 应该在那里。

[2] 这不是正确的做法。正确的方式是ClassThisCodeIsIn.class.getResourceAsStream("/icon_128.png")(注意:斜线开头;这很重要)。你的版本有各种有点奇怪的失败案例,这个版本跳过了。此版本将专门查看生成您的类文件的类路径,并且不能 NPE;在各种情况下,您的版本会失败或抛出 NullPointerExceptions。

注意:当您克隆并重新构建时,“构建”目录已被有效擦除,因为您没有将它们签入源代码控制。这就是为什么它以前有效而现在无效的原因。 git 不是罪魁祸首;您或您的 IDE 将 icon_128.png 复制到构建目录,并且每次克隆 git 存储库时都需要重复该步骤。构建工具会自动执行此步骤,并确保您可以从源代码管理中重新检出,然后调用构建工具,完成后一切都会好起来的。

【讨论】:

  • 问题是我需要类路径上的这一行 "" 和 wtf 我该如何解决这种情况? ,classpath eclipse项目文件在git上应该被忽略了,怎么处理呢?
  • Eclipse 在 src 目录中复制不是 java 文件的文件,因此 eclipse 会自行修复。 “修复”是使用构建工具。流行的选择是 Maven 或 Gradle。
  • 如果你想要你的.classpath 文件在 git 中,没有人会阻止你。是吗?
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2011-07-11
  • 2013-10-02
  • 2013-06-21
  • 1970-01-01
相关资源
最近更新 更多