2

这是一个非常常见的错误,因为有很多关于它的线程,但我不确定是否因为我的情况与所有这些都略有不同,所以解决方案不起作用?

基本上,我在日食。我有一个名为 src 的源文件夹,然后我有一个包含三个文件夹的包,然后是有问题的类。该类使用代码:

BufferedImage im = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(filenames[x].concat(extension)));

被try/catch包围。filenames 是我正在加载的所有文件名的数组(此代码在 for 循环中多次运行),扩展名为".PNG". 图片位于另一个名为 EngineTextures 的源文件夹中。

在 Eclipse 中运行这个程序可以正常工作!所有纹理都已加载,我的所有其他代码都将运行!但是,我将它导出为可运行的 jar 并在命令提示符下运行它以接收input == null所有错误,指向其中包含的行ImageIO.read(Thread.currentThread()

关键是这整个事情以前在一个单独的项目中工作过,当我什至尝试重新导出该项目时,我在完全未更改的代码上收到相同的错误。这让我相信我错误地更改了一些晦涩的 Eclipse 设置。

打开罐子,我的 MANIFEST.MF 有一个版本1.0和一个简单的类路径.,我认为这对于这种事情是正确的?Main-Class 指向正确的位置,我所有的图片都在 META-INF 文件夹旁边。

我看过失败的解决方案:

getResourceAsStream 在 Eclipse 中工作,但在浏览器中作为小程序运行时不能

为什么 getResourceAsStream() 可以在 IDE 中工作,但不能在 JAR 中工作?

Java IDE - Eclipse,导入资源

Eclipse IDE 制作的 jar 中的音频文件

getResourceAsStream() 在 jar 中返回 null 但在 eclipse 中很好

此外,我完全删除了工作区并将我的图片和代码重新复制到相同的状态,认为可能某些 .metadata 的东西是错误的,但无济于事。

提前感谢您的任何帮助。我讨厌像这样重复,但到目前为止还没有解决方案。如果我没有提供任何重要信息,请告诉我。

4

1 回答 1

1

打开罐子,我的 MANIFEST.MF 有一个 1.0 版本和一个简单的类路径 .,我认为这对这种事情是正确的?

否。JAR 文件中的 Class-Path 条目相对于该 jar 文件的位置命名其他 JAR文件。它没有命名目录:

“此属性的值指定此应用程序或扩展所需的扩展或库的相对 URL。”

这反过来意味着要加载的资源getResourceAsStream()必须在 JAR 文件中。

于 2013-08-06T03:16:27.610 回答