我创建了一个桌面应用程序,我遇到了生成的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:
我在Eclipse中的app结构和生成的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
答案 0 :(得分:9)
对于工具栏图像,您需要添加斜杠,即代替
this.getClass().getResourceAsStream("images/search_folder.png")
你需要
this.getClass().getResourceAsStream("/images/search_folder.png")
这是因为as explained in the JavaDocs,Class.getResourceAsStream
解析了相关类的包的相对路径,因此如果this
是com.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)
正如你在这里看到的那样:
getResourceAsStream()在与调用它的类相同的包中查找该文件。因此,它将在JAR中查找名为“com / whatever / more / images / search_folder.png”的文件,当然不会存在,因为“resources”目录的内容直接放在了JAR导出器的JAR文件。
第二部分:加载HTML时将无法正常工作。您尝试查找名为“resources / GoogleMap.html”的文件,但这将在Java程序进程的工作目录中查看JAR之外的文件。您应该再次使用上一个函数来加载HTML:
答案 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
实际使用其他位置的资源。希望这会有所帮助。