1

我制作了一个项目,其中包含一些 java 文件、一个包含一些图像的图像文件夹和一个包含一些文本文件的数据文件夹。当我编译程序并通过终端运行它时,一切正常。我决定尝试将其转换为 jar 文件,因此经过大量研究后,我设法做到了,包括使用清单文件。这是我在终端中输入的内容:

jar cvfm Program.jar manifest.txt *.class images data  

给出这个输出:

added manifest  
adding: a.class (in = 500) (out = 500) (deflated 50%)  
adding: b.class (in = 500) (out = 500) (deflated 50%)  
adding: images/ (in = 0) (out = 0) (stored 0%)  
adding: images/a.png (in = 500) (out = 500) (deflated 50%)  
adding: images/b.png (in = 500) (out = 500) (deflated 50%)  
adding: data/ (in = 0) (out = 0) (stored 0%)  
adding: data/a.txt (in = 500) (out = 500) (deflated 50%)  

唯一突出的行是图像/和数据/,它们的输入、输出、存储=0。

这有效,它在 jar 文件中正确列出了所有文件。jar 文件在程序的正确目录中甚至可以完美运行,但是如果我从该目录中删除它,它就再也找不到任何资源文件(图像和数据),我不知道为什么。这可能是我在代码中引用它们的一种方式,或者资源文件没有正确附加,但我不太确定。我的清单文件包括:

Manifest-Version: 1.0  
Main-Class: Strike

任何帮助,将不胜感激。

4

2 回答 2

3

如果您的资源文件(图像等...)存储在 jar 文件中,您应该使用

inputstream = getClass()
              .getClassLoader()
              .getResourceAsStream("Path to your file in the jar file");
于 2012-08-23T11:56:14.810 回答
3

你有一个类路径问题。当您在项目目录中启动 JAR 时,实际上您是从文件系统而不是存档中读取资源。

要从类路径中读取资源,请使用Class.getResourceAsStream(String)

InputStream in = getClass().getResourceAsStream("/images/foo.png");

并像你已经做的那样放在最终存档foo.png的目录中。images注意 中的前导斜杠/images/foo.png。引用文档

使用以下算法从给定的资源名称构造绝对资源名称:

  1. 如果名称以“/”开头(“\u002f”),则资源的绝对名称是名称中“/”后面的部分。

  2. 否则,绝对名称采用以下形式:modified_package_name/name 其中modified_package_name是此对象的包名,用 '/' 代替 '.' ('\u002e')。

如果您不想使用 IDE 来构建项目,可以使用AntMaven等工具。

于 2012-08-23T12:00:22.950 回答