启动jar文件,图片丢失

时间:2012-10-30 20:42:18

标签: java jar image

  

可能重复:
  load file within a jar

最后,我几乎正确地使我的jar文件工作了。几乎,因为当我测试它并在创建jar文件后立即启动时,会出现包含在存档中的图片。但是当我将jar文件移动到任何其他目录并尝试启动时 - 我得到一个关于丢失图片的例外(应用程序仍在工作,但不显示该图片)。

这就是它在我的目录中的样子:

[aqv@voland Converter]$ ll
razem 112
-rw-rw-r--. 1 aqv aqv 51673 10-30 20:42 Converter.java
-rw-rw-r--. 1 aqv aqv    23 10-30 20:41 Converter.mf
-rw-rw-r--. 1 aqv aqv  1167 10-30 20:43 GBC.java
-rw-rw-r--. 1 aqv aqv  1023 10-30 20:58 ImagePanel.java
-rw-rw-r--. 1 aqv aqv 44729 10-30 20:35 programHelp.png
-rw-rw-r--. 1 aqv aqv  3713 10-30 20:43 SettingsManager.java
[aqv@voland Converter]$ 
[aqv@voland Converter]$ 

图片文件从 ImagePanel 调用, programHelp 是一个字符串,然后传递给正确的方法:

public ImagePanel() {

    programHelp = "programHelp.png";

    try {
        helpImage = ImageIO.read(new File(programHelp));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

正如你所看到的,没有指定目录,所以我猜主类应该在jar的主目录中查找图像,不应该吗?

我按以下方式创建jar文件(当然,在编译文件之后):

[aqv@voland Converter]$ jar cvfm Converter.jar Converter.mf *.class *.png
[aqv@voland Converter]$ 

图片文件在jar存档中可见,在类文件中。我的问题:在这种情况下图像文件放置有什么问题?

1 个答案:

答案 0 :(得分:4)

您的程序只是巧合 - 它实际上是从外部 JAR加载PNG。您可以通过临时重命名图像来测试它,但如果愿意,可以将JAR保留在目录中。

要从JAR中加载资源,您需要使用其中一个getResource()methods of a Class object,而不是直接加载文件。

例如,您仍然可以使用ImageIOgetResourceAsStream()返回的流中加载数据。如下所示:

InputStream is = this.getClass().getResourceAsStream("my.png");
helpImage = ImageIO.read(is);