【问题标题】:Images cannot be found in .jar file [duplicate]在 .jar 文件中找不到图像 [重复]
【发布时间】:2015-05-08 17:13:02
【问题描述】:

此问题经过编辑以包含所有问题。下面会添加新的图片链接。

我的程序在 NetBeans 中运行良好,从 NetBeans 编译的 jar 文件运行时无法加载程序。我在 Java 1.6_45 上编译,这只是为了兼容性,因为这是一个面向学校的程序,适用于几乎没有收到任何升级或更新的旧机器。

无论如何,因为当我尝试将程序作为 .jar 文件时从未加载过,所以我很担心并查找了手动方法来使 jar 运行。我尝试了命令提示符命令 java -jar PhysicsEquations.jar ,我将其直接复制到了我的用户文件夹中,因此我不必担心类路径。

这是我收到的错误消息(下面是第一个链接),一个 IllegalArgumentException。我不知道该怎么做,我已经研究了几天,现在尝试不同的东西。如果可以更好地解释,我愿意重试任何事情。

这是整个 EquationImage 类(只有几行,请耐心等待)。在其他代码中,我所做的只是调用构造函数,例如 EquationImage fma = new EquationImage("fma.jpg");,然后使用 setBounds(x,y,width,height); 将其添加到面板中,该面板已添加到包含所有方程式的 CardLayout 中。

package physicsequations;
...
public class EquationImage extends JPanel {
    public EquationImage() {
    }

    public EquationImage(String filename) {
        try {
            System.out.println(filename);
            imageBuffer = ImageIO.read(getClass().getResourceAsStream("images/" + filename));
        }
        catch(IOException e) {
            JOptionPane.showMessageDialog(null, "EquationImage could not find/load the file \n" + filename, "Error Message", JOptionPane.PLAIN_MESSAGE);
        }
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        graphics.drawImage(imageBuffer, 0, 0, null);
    }

    private BufferedImage imageBuffer = null;
}

正如代码和错误消息中所指出的,构造函数确实收到了一个文件名。在 NetBeans 中,编译器能够正确找到所有图像。但是,在我使用“清理和构建”获得的 jar 中,我是否真的看到带有错误的 JOptionPane 可能会有所不同。

我被要求提供我的代码的文件路径。

在项目中,我有文件夹 PhysicsEquations。 PhysicsEquations 有文件夹 dist、build、nbproject 和 src。 PhysicsEquations 也有文件 build 和 manifest.mf。

src有文件夹physicsequations,就是EquationImage所在的包。

physicsequations 然后有五个文件和一个文件夹“图像”。这些文件是 Main、EquationPanel、EquationImage、BadInputException 和 Variable。

images 包含我所有的图片,包括 Physics.jpg,这是我在 Main 中使用的图标:

String imagePath = "physics.jpg";
InputStream imgStream = Main.class.getResourceAsStream("images/" + imagePath);
BufferedImage myImg = null;
try {
    myImg = ImageIO.read(imgStream);
}
catch(IOException e) {
    JOptionPane.showMessageDialog(null, "The program has failed to load file physics.jpg from the source package.", "Error Message", JOptionPane.ERROR_MESSAGE);
}
setIconImage(myImg);

在 jar 本身中,我打开 jar 并有 2 个文件夹:META-INF 和physicsequations。在physicsequations 文件夹中,有101 个类文件和一个名为images 的文件夹。该文件夹包含我在项目中使用的所有 17 张图片。下面是 jar 中 META-INF 中 manifest.mf 文档的文本。 (谁能向我解释为什么它显示为 1.8?我的项目属性中有 1.6...

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.8.0_31-b13 (Oracle Corporation)
Class-Path: 
X-COMMENT: Main-Class will be added automatically by build
Main-Class: physicsequations.Main

http://i.stack.imgur.com/IqgzE.jpg
http://i.stack.imgur.com/rHaDa.jpg
http://i.stack.imgur.com/j5Npw.jpg
http://i.stack.imgur.com/Yt2O3.jpg

我希望所有链接都能提交,因为它说我有 10 个代表的限制。

【问题讨论】:

  • 您是否检查过图像是否包含在 jar 中?
  • 图片的路径是什么?当使用getClass().getResource(...) 时,如果使用相对路径,则类的包名将作为路径的前缀。您可以将getClass().getResource("/...") 用于绝对路径,它将路径附加到classpath 搜索路径
  • jar 文件只是一个 zip 文件。打开 jar 文件(将扩展名重命名为 zip)。您的图像在 jar 文件中吗?
  • 我打开了jar文件。我有两个文件夹,其中一个是物理方程,我可以在文件夹中看到我的所有图像。
  • 我不太明白你这个疯狂程序员,对不起。类路径的东西让我很困惑。

标签: java jar embedded-resource javax.imageio illegalargumentexception


【解决方案1】:

通过查看您的first linked image 表明您正在尝试加载资源"fma.jpg"IllegalArgumentException: input == null 以及您的last image 这清楚地表明您的项目中包含的文件名为fma.JPG 我认为它很漂亮清除发生了什么(PS:据我所知,您的所有图像都没有显示名为 "physics.jpg""Physics.jpg""physics.JPG" 的文件,但我认为这里的问题是相同的):

使用Class.getResource(...)Class.getResourceAsStream(...) 的任何资源查找区分大小写。当您从文件系统运行时,它可能会起作用,因为普通的 Windows 文件系统不区分大小写,并且无论如何都会解析文件。但是,当在 JAR 中时,匹配区分大小写并且无法进行查找。

你有两个选择:

  • 要么将文件重命名为更常见的小写扩展标准(即将"fma.JPG" 重命名为"fma.jpg")。
  • 或者更改代码以实际查找 JAR 中的资源(即,将代码从 "fma.jpg" 更改为 "fma.JPG")。

要验证一切是否正确,您可以运行命令:

jar tf yourjar.jar 

t 选项列出文件的目录)。它将产生类似于the following example的输出:

META-INF/
META-INF/MANIFEST.MF
TicTacToe.class
TicTacToe.class
TicTacToe.java
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
example1.html
images/
images/cross.gif
images/not.gif 

验证列表中的名称和代码是否完全相同,并且拼写匹配。


PPS:关于 1.8 参考:

Created-By: 1.8.0_31-b13 (Oracle Corporation)

这只是创建 JAR 的 jar 命令的版本(通常与包含它的 JDK 相同)。这可能与用于构建项目的 (javac) 版本或构建所需的 JDK 库版本不同。

【讨论】:

  • 谢谢,我会试试这个并回复你。这是有道理的,但我不知道我的文件扩展名是大写的......当我使用截图工具时,我只是将它们保存为 JPEG。我绝对会试试这个。我有一个与此类似的项目,但从未遇到过问题……我使用的是 png,而不是 JPG。谢谢。
  • 谢谢。这是区分大小写的问题。我不知道 JPEG 有不同的大小写敏感性,我认为它们都是相同的 .jpg。我已经解决了这个问题,非常感谢。
猜你喜欢
  • 2016-11-21
  • 2013-03-06
  • 2021-08-13
  • 2013-07-10
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2021-08-24
相关资源
最近更新 更多