【问题标题】:FileNotFoundException when running jar file运行 jar 文件时出现 FileNotFoundException
【发布时间】:2023-03-27 07:30:01
【问题描述】:

我有以下代码:

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 文件时。
只是为了确保我做得正确:
右键单击项目->导出...->可运行 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 项目中的源文件夹)。
那么我在这里错过了什么?

【问题讨论】:

  • 从路径中删除前导./
  • 因为你需要使用类加载器来获取你的文件。在 Eclipse 中,您正在滥用代码运行爆炸的事实。
  • @BoristheSpider,这是什么意思:“代码运行爆炸”? m0skit0,试过了,在eclipse里也没用。

标签: java filenotfoundexception


【解决方案1】:

当您的图像存储在 jar 中时,您需要将它们作为资源加载。按照这些思路,但您应该关闭流。

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

当您在 Eclipse 中运行时,您的目录中有本地图像,因此您可以使用通常的 File 对象查看它们,但当它们位于 jar 本身中时则看不到。

【讨论】:

  • 我也试过了,但是getResource()返回的是URL对象,不适用于Image构造函数...
  • 您可能想查看类似的帖子,例如:stackoverflow.com/questions/3915725/… 您可能会在那里找到答案。
  • 使用 BufferedImage, BufferedImage image = ImageIO.read(MyClass.class.getResourceAsStream("something.png"));
  • @so.very.tired 作为另一个提示,如果您将图像存储在 Eclipse 的 src 目录中,它们将自动复制到您的 bin 目录,这将允许您拥有图像无论您是从 Eclipse 还是从 Jar 运行,都使用相同的代码加载,这对开发非常有帮助。如果您有其他一些棘手的设置,您可以搜索如何设置您的课程路径并尝试围绕它进行组织。
  • 那也是最好的@so.very.tired
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2017-06-05
  • 2017-09-11
  • 2013-03-05
  • 1970-01-01
相关资源
最近更新 更多