我制作了一个由一些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
任何帮助都将不胜感激。
答案 0 :(得分:3)
如果资源文件(图像等)存储在jar文件中,则应使用
访问它们inputstream = getClass()
.getClassLoader()
.getResourceAsStream("Path to your file in the jar file");
答案 1 :(得分:3)
您有类路径问题。当您在项目目录中启动JAR时,实际上您正在从文件系统中读取资源,而不是从存档中读取资源。
要从类路径中读取资源,请使用Class.getResourceAsStream(String)
InputStream in = getClass().getResourceAsStream("/images/foo.png");
并将foo.png
放在最终存档中的images
目录中,就像您已经做的那样。请注意/images/foo.png
中的前导斜杠。引用文档
绝对资源名称是根据给定的资源名称构造的 使用这个算法:
- 之后的名称部分
如果名称以'/'('\ u002f')开头,则绝对名称为 资源是'/'。
- 醇>
否则, 绝对名称的格式如下:
modified_package_name/name
其中modified_package_name
是此对象的包名称 用'/'代替'。' ( '\ u002e')。