Java getResourceAsStream在EclipseIDE中工作,但不是JAR格式

Java getResourceAsStream在EclipseIDE中工作,但不是JAR格式,java,jar,inputstream,bufferedimage,javax.imageio,Java,Jar,Inputstream,Bufferedimage,Javax.imageio,这是一个非常常见的错误,因为有很多关于它的线程,但我不确定,由于我的情况与所有线程略有不同,解决方案是否不起作用 基本上,我在日食中。我有一个名为src的源文件夹,然后我有一个包,其中包含三个文件夹,然后是有问题的类。该类使用以下代码: BufferedImage im = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(filenames[x].concat(extension)))

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

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

BufferedImage im = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(filenames[x].concat(extension)));
被一个“尝试/捕捉”包围着。filenames是我正在加载的所有文件名的数组(此代码在for循环中运行多次),扩展名为
“.PNG”
。这些图片位于另一个名为EngineTextures的源文件夹中

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

更重要的是,这整件事以前都是在一个单独的项目中进行的,当我甚至尝试重新导出该项目时,我在完全未更改的代码上收到了相同的错误。这让我相信我错误地更改了一些模糊的Eclipse设置

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

我看到的解决方案没有成功:

此外,我完全删除了工作区,并将我的图片和代码重新复制到相同的状态,我认为可能有一些元数据的事情是错误的,没有用

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

打开jar,我的MANIFEST.MF有一个1.0版本和一个普通的类路径,我认为这对于这种事情是正确的

否。JAR文件中的类路径项命名其他JAR文件,相对于此JAR文件的位置。它不命名目录:


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

如何指定文件名?如果放入日志语句,则
文件名[x]的结果会是什么。concat(extension)
?此代码位于方法
loadTextureSet(String[]f)中
扩展是类的静态结尾。因此,我的main使用字符串[]调用它,该字符串设置为:
String s={“Button”,“Background”};“
等等。正如我所说,它是for循环,所以如果我设置
String[]f={“Texture a”,“Texture B”,“Texture C”,“Texture D”}
然后println会输出
纹理a.PNG
纹理B.PNG
纹理C.PNG
纹理D.PNG
。图片位于另一个名为EngineTextures的源文件夹中。图片是否会到达同一jar的根包?如果是,则
getResourceAsStream(“Button.PNG”)
works just fine您的图像应该打包在jar中(相同或不同并不重要,只要它们在使用上述代码的默认包中)。如果您从一个jar运行并试图从一个文件系统加载图像,那么这将永远不会像@EJP的回答中所说的那样起作用。谢谢您的研究。在这种情况下,如果我将图片打包到同一文件夹中的另一个jar文件中,据我所知,这样做会起作用吗?在我刚才的测试中,这样做不会起作用。是否存在问题还有其他更有效的加载图像文件的方法吗?一种既适用于jar格式又适用于eclipse的方法?我更喜欢从运行代码的同一个jar中访问图像。让我感到困惑的是,这种方法以前在另一个项目中工作过……我真的复制了
getResourceAsStream()
和该项目的其余部分,现在即使是导出的项目也不起作用。您需要修复类路径来命名其他JAR文件。正在修复,但类路径中的普通
不应该意味着它从同一JAR文件访问图片吗?不确定为什么不这样做。我已经找到了地址我在回答的第一段中写道:“不。”