在.jar文件中找不到图像

时间:2015-05-07 03:58:10

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

编辑此问题以包含所有要求的内容。新的图片链接将在下面添加。

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

无论如何,因为当我尝试将它作为.jar文件时程序永远不会加载,我很关心并查找手动方式来运行jar。我尝试了命令提示符命令 java -jar PhysicsEquations.jar ,我直接复制到我的Users文件夹中,所以我不必担心类路径。

这是我收到的错误消息(下面是第一个链接),一个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还有文件构建和manifest.mf。

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

physicsequations然后有五个文件和一个文件夹'images'。文件是Main,EquationPanel,EquationImage,BadInputException和Variable。

图片包含我的所有图片,包括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);

在罐子里,我打开罐子,有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个代表。

1 个答案:

答案 0 :(得分:0)

通过查看您的first linked image表示您尝试加载资源"fma.jpg"IllegalArgumentException: input == null以及您的last image,这清楚地表明您的项目中包含的文件是名为fma.JPG我认为很明显发生了什么事情(PS:据我所知,你的图片都没有显示名为"physics.jpg""Physics.jpg"或{{1}的文件},但我认为这里的问题是一样的):

使用"physics.JPG"Class.getResource(...)的任何资源查找都区分大小写。它可能在您从文件系统运行时起作用,因为正常的Windows文件系统不区分大小写,并且无论如何都将解析该文件。但是,当在JAR内部时,匹配区分大小写,并且查找将不起作用。

您有两种选择:

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

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

"fma.JPG"

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

t

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

PPS:关于1.8参考:

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 

这只是创建JAR的Created-By: 1.8.0_31-b13 (Oracle Corporation) 命令的版本(通常与包含它的JDK版本相同)。这可能与用于构建项目的(jar)版本或构建所需的JDK库版本不同。