Runnable Jar找不到资源和其他库

时间:2012-12-21 12:00:06

标签: java eclipse swt executable-jar

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

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

ToolBar图片加载代码:

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:

enter image description here

我在Eclipse中的app结构和生成的jar结构:

enter image description here

生成的清单:

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 个答案:

答案 0 :(得分:9)

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

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

你需要

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

这是因为as explained in the JavaDocsClass.getResourceAsStream解析了相关类的包的相对路径,因此如果thiscom.example.Foo,那么getResourceAsStream("images/search_folder.png")会在你的JAR中寻找com/example/images/search_folder.png。预先设置斜杠会使其显示images/search_folder.png,而这正是您的屏幕截图所示的所需。

您需要对GoogleMap.html使用类似的技巧 - 您无法使用java.io.File从JAR内部加载项目,但您可以使用this.getClass().getResource("/GoogleMap.html")获取java.net.URL 1}}指向JAR中的HTML文件。

答案 1 :(得分: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时将无法正常工作。您尝试查找名为“resources / GoogleMap.html”的文件,但这将在Java程序进程的工作目录中查看JAR之外的文件。您应该再次使用上一个函数来加载HTML:

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

答案 2 :(得分: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文件中,也无法读取资源。希望这会对其他人有所帮助。

答案 3 :(得分:0)

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

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