运行jar文件时出现FileNotFoundException错误

3

I have the following code:

package test;


import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SWTTest {

    public static void main(String[] args) {
        SWTTest test=new SWTTest(new Display());
        test.run();
    }


    private Shell shell;
    private Display display;


    public SWTTest(Display main_display) {
        display=main_display;

        shell=new Shell(display, SWT.DIALOG_TRIM);
        shell.setText("Test window");
        shell.setBackgroundImage(new Image(display,"./image/blue_screen.jpg"));
    }

    public void run() {

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) 
                display.sleep();
        }
    }
}

这段代码可以编译和运行,但是问题在于当我把它导出为jar文件时。
我确认了一遍步骤:
右键点击项目->导出...->Runnable Jar文件->选择正确的启动配置,然后“完成”。
这会创建一个jar文件,但是当我从终端运行它时,会遇到以下错误:

Exception in thread "main" org.eclipse.swt.SWTException: i/o error (java.io.FileNotFoundException: ./image/blue_screen.jpg (No such file or directory))
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.SWT.error(Unknown Source)
    at org.eclipse.swt.graphics.ImageLoader.load(Unknown Source)
    at org.eclipse.swt.graphics.ImageDataLoader.load(Unknown Source)
    at org.eclipse.swt.graphics.ImageData.<init>(Unknown Source)
    at org.eclipse.swt.graphics.Image.<init>(Unknown Source)
    at test.SWTTest.<init>(SWTTest.java:31)
    at test.SWTTest.main(SWTTest.java:13)
Caused by: java.io.FileNotFoundException: ./image/blue_screen.jpg (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at org.eclipse.swt.internal.Compatibility.newFileInputStream(Unknown Source)
    ... 6 more

为什么它在Eclipse上可以运行,但不能作为jar文件运行?为什么突然找不到图片了?
(我也会提到我向项目添加了一个名为“image”的新源文件夹,它现在与“src”文件夹并列 - 我想说的是“image”文件夹是我的Eclipse项目中的一个源文件夹)。那我错过了什么吗?

从路径中删除前导的 ./ - m0skit0
因为你需要使用类加载器来获取你的文件。在Eclipse中,你滥用了代码正在运行的事实。 - Boris the Spider
@BoristheSpider,"the code is running exploded"是什么意思? m0skit0尝试了一下,在eclipse中也无法运行。 - so.very.tired
1个回答

5

当您的图像存储在jar文件中时,您需要将它们作为资源加载。沿着这条路,但是您应该关闭流。

BufferedImage image = ImageIO.read(MyClass.class.getResourceAsStream("something.png"));

当在Eclipse中运行时,图像文件在您的目录中本地存在,因此您可以使用常规的File对象查看它们,但是当它们在jar包中时却无法查看。

我也尝试过,但是getResource()返回的是URL对象,这对于Image构造函数不适用... - so.very.tired
你可能想查看类似的帖子,例如:https://dev59.com/PFHTa4cB1Zd3GeqPOhYc 你很可能会在那里找到答案。 - Alan
使用BufferedImage,BufferedImage image = ImageIO.read(MyClass.class.getResourceAsStream("something.png")); - NESPowerGlove
@so.very.tired 另一个提示,如果你把图片存储在Eclipse的src目录中,它们将自动复制到bin目录中,这将允许您使用相同的代码加载图像,无论是从Eclipse还是从Jar运行,对于开发非常有帮助。如果您有其他棘手的设置,可以搜索如何设置类路径并尝试围绕它组织。 - NESPowerGlove
那也是最好的 @so.very.tired - NESPowerGlove

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接