2012-10-30 73 views
1

可能重复:
load file within a jarjar文件推出,图像丢失

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

这是怎么看我的目录:

[[email protected] 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 
[[email protected] Converter]$ 
[[email protected] Converter]$ 

图片文件会从ImagePanelprogramHelp称为是一个字符串,然后传递给适当的方法:

public ImagePanel() { 

    programHelp = "programHelp.png"; 

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

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

创建以下列方式将jar文件(编译过程中的文件后):

[[email protected] Converter]$ jar cvfm Converter.jar Converter.mf *.class *.png 
[[email protected] Converter]$ 

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

+1

'new File(...)'只在文件系统中查找,而不在您的jar中。 –

回答

4

您的程序只能通过巧合工作 - 它实际上是从以外的加载PNG的JAR。如果你喜欢,你可以通过临时重命名镜像来测试,但将JAR保存在目录中。

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

例如,您仍然可以使用ImageIO来加载getResourceAsStream()返回的数据流中的数据。类似以下内容:

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