12

我创建了一个桌面应用程序,但在生成的可运行 jar 中遇到了问题。在 Eclipse 环境中一切正常,但是当我生成 jar 时,它只显示swt组件(菜单、选项卡等)。其他库的位置是空白区域(生成图库的库)。同样不会出现set ToolBar(包含带有图像的按钮),GoogleMap.html不会出现。

如何正确生成包含这些外部源的可执行 jar?

工具栏图片加载代码:

folderSearchIcon = new Image(display, this.getClass().getResourceAsStream("images/search_folder.png"));

GoogleMap.html 加载代码:

File mapFile = new File("resources/GoogleMap.html");        
if(!mapFile.exists()) {
    System.out.println("File doesn't exist! " + mapFile.getAbsolutePath()); 
    return;
}

生成可运行的jar:

在此处输入图像描述

我在 Eclipse 中的应用程序结构和生成的 jar 结构:

在此处输入图像描述

生成的清单:

Manifest-Version: 1.0
Rsrc-Class-Path: ./ swt.jar commons-imaging-1.0-SNAPSHOT.jar org.eclip
  se.nebula.widgets.gallery_0.5.3.201210262156.jar xmpcore.jar metadata
  -extractor-2.6.3.jar
Class-Path: .
Rsrc-Main-Class: geotagger.AppInit
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
4

4 回答 4

9

对于工具栏图像,您需要添加一个斜杠,即代替

this.getClass().getResourceAsStream("images/search_folder.png")

你需要

this.getClass().getResourceAsStream("/images/search_folder.png")

这是因为,正如 JavaDocs 中所解释的,它根据Class.getResourceAsStream相关类的包解析相对路径,因此 if thisis a com.example.FoothengetResourceAsStream("images/search_folder.png")com/example/images/search_folder.png在您的 JAR 中查找。预先添加斜线会使其查找images/search_folder.png,这是您的屏幕截图表明您需要的。

您将需要使用类似的技巧-GoogleMap.htmljava.io.File无法使用.this.getClass().getResource("/GoogleMap.html")java.net.URL

于 2012-12-21T12:38:57.077 回答
3

正如你在这里看到的:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String)

getResourceAsStream() 在与调用它的类相同的包中查找文件。因此它将在 JAR 中查找名为“com/whatever/more/images/search_folder.png”的文件,该文件当然不会存在,因为“resources”目录的内容直接放在JAR 导出器的 JAR 文件。

请改用http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String)

第二部分:当你加载 HTML 时将永远无法工作。您尝试在您的 java 程序进程的工作目录中查找名为“resources/GoogleMap.html”的文件,但这会在 JAR 之外查找。您应该再次使用前面的函数来加载 HTML:

http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String)

于 2012-12-21T12:44:08.780 回答
3

我在同一个问题上浪费了很多时间。如果您使用 Eclipse 中的“导出”功能中的选项创建了可运行的 jar,那么它将无法正常工作。至少它不适合我。无论我尝试了多少选项,都没有任何效果。尝试读取资源时,resourceUrl 将返回 null。最后,我决定使用 Maven 创建可运行的 jar,而将 Eclipse 的帮助放在一边。我需要将依赖的 jar 放在一个单独的 lib 文件夹中。我按照http://www.mkyong.com/maven/how-to-create-a-manifest-file-with-maven/中的说明创建了可运行的 jar ,该解决方案对我有用。不知何故,当 Eclipse 创建可运行的 jar 包时,无法读取资源,即使它们存在于 jar 文件中。希望这对其他人有帮助。

于 2013-11-12T16:19:57.367 回答
0

由于导出到可运行的 jar 实质上会创建一个文件,因此 FileReader 无法再找到资源文件夹中的文件/图像/资源,因为文件位置现在不存在。

从使用更改为使用FileReader fr = new FileReader(resource_file_path)InputStream 加载,InputStream is = getClass().getResourceAsStream(resource_file_path)然后使用 anInputStreamReader在其他位置实际使用资源。希望这可以帮助。

于 2017-10-22T16:03:55.380 回答