【问题标题】:program runs fine in Eclipse but not when exported to .jar file程序在 Eclipse 中运行良好,但在导出到 .jar 文件时无法正常运行
【发布时间】:2012-03-06 00:22:51
【问题描述】:

我有一个小的 GUI,其中包括一些 JSlider 和你有什么。我可以将它导出为 .jar,它可以毫无问题地运行。然后我决定添加一些图像,并将它们放在 Eclipse 包中的子文件夹中。现在,当我导出文件并尝试运行它时,出现以下错误(在终端中运行时)

Henry-MAC:desktop 2010imac01$ java -jar trust.jar
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1362)
    at trust.GUI.<init>(GUI.java:75)
    at trust.main.main(main.java:11)

经过大量谷歌搜索后,我认为这与 .jar 未包含在我的清单中(eclipse 生成)有关。如何在清单中查看/添加必要的类路径。

这是我打开图片的部分(我认为是错误)

try {
        n  = ImageIO.read((this.getClass().getResource("smiles/n.png")));
        s5 = ImageIO.read((this.getClass().getResource("smiles/5.png")));
        s4 = ImageIO.read((this.getClass().getResource("smiles/4.png")));
        s3 = ImageIO.read((this.getClass().getResource("smiles/3.png")));
        s2 = ImageIO.read((this.getClass().getResource("smiles/2.png")));
        f5 = ImageIO.read((this.getClass().getResource("smiles/-5.png")));
        f4 = ImageIO.read((this.getClass().getResource("smiles/-4.png")));
        f3 = ImageIO.read((this.getClass().getResource("smiles/-3.png")));
        f2 = ImageIO.read((this.getClass().getResource("smiles/-2.png")));

        smile = new Easel(n);
    } catch (IOException e) {
        System.out.println("error");
    }

【问题讨论】:

  • 图像是否正确嵌入到您的 jar 中?看起来类加载器找不到您的图像,因此返回 null
  • 我认为@GuillaumePolet 是对的,虽然为了以后的参考,当你捕捉到异常时不要只输出error。使用e.printStackTrace()(如果你正在为生产构建一些东西,或者更好的日志框架),这样你的错误消息就可以告诉你一些事情,而不仅仅是告诉你在某处发生了故障。
  • 我认为它们是,它们在名为 trust 的主包中的一个名为 smiles 的包中
  • @ChrisThompson 如何引用 jar 中的图像?
  • 如何创建 .jar?如果您查看 .jar 内部(通过解压缩),是否有图像?

标签: java eclipse jar export manifest


【解决方案1】:

当图像被打包到 JAR 中时,如果你使用类似这样的东西,类加载器可以找到你的图像:

 this.getClass().getResource("/resources/icon.png")

                 OR

 this.getClass().getResourceAsStream("/resources/icon.png")

也就是你的情况,代码应该如下所示:

try {
        n  = ImageIO.read((this.getClass().getResource("/smiles/n.png")));
        s5 = ImageIO.read((this.getClass().getResource("/smiles/5.png")));
        s4 = ImageIO.read((this.getClass().getResource("/smiles/4.png")));
        s3 = ImageIO.read((this.getClass().getResource("/smiles/3.png")));
        s2 = ImageIO.read((this.getClass().getResource("/smiles/2.png")));
        f5 = ImageIO.read((this.getClass().getResource("/smiles/-5.png")));
        f4 = ImageIO.read((this.getClass().getResource("/smiles/-4.png")));
        f3 = ImageIO.read((this.getClass().getResource("/smiles/-3.png")));
        f2 = ImageIO.read((this.getClass().getResource("/smiles/-2.png")));

        smile = new Easel(n);

} catch (IOException e) {
       System.out.println("error");
}

try {
        n  = ImageIO.read((this.getClass().getResourceAsStream("/smiles/n.png")));
        s5 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/5.png")));
        s4 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/4.png")));
        s3 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/3.png")));
        s2 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/2.png")));
        f5 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-5.png")));
        f4 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-4.png")));
        f3 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-3.png")));
        f2 = ImageIO.read((this.getClass().getResourceAsStream("/smiles/-2.png")));

        smile = new Easel(n);

} catch (IOException e) {
       System.out.println("error");
}

希望这能满足您的目的......

谢谢!

【讨论】:

    【解决方案2】:

    试试这个:

    BufferedImage n  = ImageIO.read(new File("./smiles/n.png"));
    

    我假设图像 n.png 位于项目文件夹下的微笑文件夹中。

    【讨论】:

    • 很遗憾,这不起作用..我的链接 db.tt/hOkb74cz 将向您显示相对于项目文件夹的方向。
    • 我接受。当图像打包在 JAR 中时,上面的代码将不起作用。但是,如果您在“微笑”之前添加一个“/”,您的问题会很快得到解决,正如我在我的最新答案中所显示的那样!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2017-04-16
    相关资源
    最近更新 更多