【问题标题】:getResourceAsStream works in Eclipse IDE but not in JAR formatgetResourceAsStream 在 Eclipse IDE 中工作,但不是 JAR 格式
【发布时间】:2013-08-06 18:58:17
【问题描述】:

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

基本上,我处于日食状态。我有一个名为 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 设置。

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

我看过的不成功的解决方案:

getResourceAsStream working in eclipse, but not when run as applet in browser

Why does getResourceAsStream() work in the IDE but not the JAR?

Java IDE - Eclipse, Importing resources

Audio file in jar made by Eclipse IDE

getResourceAsStream() returning null in jar but fine in eclipse

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

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

【问题讨论】:

  • 如何指定文件名?如果你写一个日志语句,filenames[x].concat(extension) 的结果是什么?
  • 这段代码在方法loadTextureSet(String[] f)中,扩展是类的静态final。因此,我的主要使用 String[] 来调用它,其设置类似于:String s = { "Button", "Background" };" 等。
  • 正如我所说,这是一个 for 循环,所以如果我设置 String[] f = { "Texture A", "Texture B", "Texture C", "Texture D" } 然后 println 会输出 Texture A.PNG Texture B.PNG Texture C.PNG Texture D.PNG
  • 图片位于另一个名为 EngineTextures 的源文件夹中 图片是否到达同一个 jar 的根包?如果是,那么 getResourceAsStream("Button.png") 工作正常
  • 您的图片应该打包在jar中(相同或不同,只要它们在使用上述代码的默认包中即可)。如果您从 jar 运行并尝试从文件系统加载图像,那么这将永远不会像 @EJP 的回答中所述的那样工作

标签: java jar inputstream bufferedimage javax.imageio


【解决方案1】:

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

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

"The value of this attribute specifies the relative URLs of the extensions or libraries that this application or extension needs."

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

【讨论】:

  • 感谢您的研究。在那种情况下,如果我将我的图片打包到同一个文件夹中的另一个 jar 文件中,那么我理解这会起作用吗?这样做不会,在我刚才的测试中。还有其他更有效的加载图像文件的方法吗?一种适用于 jar 格式和 eclipse 的方式?我更愿意从运行代码的同一个 jar 中访问图像。
  • 让我难过的是这种方法之前在另一个项目中有效......我从该项目中复制了getResourceAsStream() 和其余部分,现在即使该项目正在导出也不起作用。
  • 您需要修复您的 Class-Path 以命名其他 JAR 文件。
  • 正在解决这个问题,但类路径中的纯 . 不应该意味着它从同一个 jar 文件访问图片吗?不知道为什么它不这样做。
  • 我已经在回答的第一段中解决了这个问题:“不。”
猜你喜欢
  • 2013-04-09
  • 2019-02-03
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2014-03-13
相关资源
最近更新 更多