【问题标题】:Images loading in exported JAR, but not when running from eclipse在导出的 JAR 中加载图像,但从 eclipse 运行时不加载
【发布时间】:2021-07-20 05:03:32
【问题描述】:

我看到很多人在 Eclipse 中运行时加载图像时遇到同样的问题,但从导出的 JAR 中运行时却没有。在找到正确的解决方法之前,我一直遇到这个问题。现在我遇到了一个问题,即加载图像并且程序在从新导出的可运行 JAR 运行时运行完美,但在 Eclipse 中却不行!值得注意的是,我事先在我的机器上更新了 Java!

这是我的项目的屏幕截图:

它在 Eclipse 中运行得非常好,直到我弄清楚如何正确导出可运行的 JAR,但现在却不行! Assets 文件夹被设为源文件夹,第 19 行看到的 Image 类使用以下代码:

public Image(String path)
{
    
    try {
        image = ImageIO.read(getClass().getResourceAsStream(path));
    } 
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    w = image.getWidth();
    h = image.getHeight();
    // Reads all the pixel data into a 1D array
    p = image.getRGB(0, 0, w, h, null, 0, w);
}

完整的错误可以在屏幕截图中看到,但例外是:

Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1356)
    at rawGE/com.albionbrown.rawge.gfx.Image.<init>(Image.java:20)
    at coalDrop/com.albionbrown.ld48.MenuSprite.<init>(MenuSprite.java:19)
    at coalDrop/com.albionbrown.ld48.Game.<init>(Game.java:44)
    at coalDrop/com.albionbrown.ld48.Game.main(Game.java:32)

【问题讨论】:

  • 你有什么异常吗?
  • 是 - 线程“main”中的异常 java.lang.IllegalArgumentException: input == null!
  • 我看不到任何 input 变量。为了获得更好的帮助,请尽快发布正确的 minimal reproducible example 来证明您的问题
  • input 变量没问题并在此时填充。我只是好奇是否需要配置某种包含路径才能在 Eclipse 中运行?
  • 不是 Eclipse 方面的专家,但如果没有适当的 MRE,这很难调试

标签: java eclipse image swing executable-jar


【解决方案1】:

看了半天,终于发现问题所在了。

在我导出的 JAR(我正在导入我的游戏项目的一个小游戏库)中,我有一个用于加载图像的类

getClass().getResourceAsStream(path)

给定path 是一个真实图像的字符串。这在我的游戏库项目中实际运行测试类时效果很好,因为我猜 getResourceAsStream() 使用 localized root 作为游戏库项目的根。

所以,我的解决方法是为我的图像加载类(在游戏库中)创建两个构造函数。一种仍然接受文件路径字符串并使用 getClass().getResourceAsStream(path) 的方法,如下所示:

public Image(String path)
{
    loadImageResource(getClass().getResourceAsStream(path));
}

private void loadImageResource(InputStream path)
{
    try {
        image = ImageIO.read(path);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

另一个用于使用游戏库作为导出 JAR 的项目,它接受 InputStream 对象。这意味着调用 Image 构造函数的方法将需要运行 getClass().getResourceAsStream(path) 本身(我猜然后使用该项目作为根,而不是导出的 JAR 的根)。像这样:

public Image(InputStream path)
{
    loadImageResource(path);
}

private void loadImageResource(InputStream path)
{
    try {
        image = ImageIO.read(path);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多