Eclipse:如何将资源文件一起导出成.jar文件(使用ANT)

7

我们在Eclipse中的项目大致显示以下文件夹:

application
    - src
    - JRE System Library [1.6]
    - Referenced Libraries
    - lib
    - rsc

在我们的项目中,我们想使用“文件”>“导出”...>“可执行的JAR”。 这很好用,但有一个例外:如果我们想运行application.jar应用程序,仍然需要将rsc/文件夹复制到与application.jar相同的位置。 在rsc/中,我们有其他文件夹来分隔不同的部分。 基本上,我们使用以下代码加载这些片段(稍微修改了一下,但路径样式是正确的)。
strUrl = "file:rsc/properties/Constants.properties";
url = new URL(strUrl);
ImageIcon icon = new ImageIcon(url);

我可以右键单击rsc/ > Build Path > Use as Source Folder。但这也行不通,因为Eclipse不会自动将rsc文件夹复制到bin/-文件夹中。然后我们就无法从终端运行它(未打包成jar)。
编辑:为什么Eclipse无法正确处理此问题?为什么它在处理“嵌套”输出文件夹时会出现问题?在Build Path对话框的Source选项卡中,我可以轻松地添加带有输出文件夹设置为bin/rsc/的rsc/-文件夹,但似乎无法放置嵌套文件夹...
编辑2:现在我已经能够创建一个xml文件来使用ant构建东西,并成功将rsc文件夹包含在jar文件中。但由于相同的错误,它仍无法运行。我真的需要检查资源路径是否在JAR中吗?JAR的内容现在如下:
META-INF/
META-INF/MANIFEST.MF
configurator/
controller/
editor/
gui/
logic/
networking/
rsc/
rsc/gamesettings/
rsc/levels/
rsc/pics/
rsc/properties/
util/

但是Java仍然不喜欢我,抛出了一个大约100行的堆栈跟踪错误:java.io.FileNotFoundException: rsc/properties/Constants.properties


有人知道如何解决吗?谢谢和问候。

5个回答

15
如果你将rsc标记为源文件夹,Eclipse将把它的内容复制到输出目录。或者,如果你想将资源分组到输出中,你也可以将rsc移动到src下面。
然后,你可以使用Class.getResource("/properties/Constants.properties")Class.getResource("/rsc/properties/Constants.properties")来访问资源,无论你的应用程序是打包成jar文件还是从源代码运行都能正常工作。
另外要注意的是,file:协议只适用于普通文件,要访问jar包内部的文件,你需要使用类似new URL("jar:file:app.jar!/rsc/properties/Constants.properties")的方式。

是的,这就是解决方案,但在Eclipse中将rsc/标记为src文件夹并不能解决问题。另一位学生指导我找到了同样的解决方案。问题在于我们必须使用Class.getResource("..."),路径前面加上“/”。谢谢和问候。 - Atmocreations
抱歉,您说的 Class#getResource() 是什么意思?在 Class 类中并没有这样的静态方法。 - m0skit0
@m0skit0 这个方法不是静态的,抱歉造成困惑。 - Dan Berindei
@Dan Berindei,你能回答我的问题吗? http://stackoverflow.com/questions/38685537/including-source-files-in-runnable-jar-file - Talib
@Talib,这里有一个非静态方法getResource(String) - Dan Berindei

4
您可以尝试以下步骤:在Java Build Path对话框中,转到“Libraries”选项卡,然后选择“添加类文件夹...”。从“Class Folder Selection”对话框中选择rsc。现在,rsc目录的内容将包含在可执行jar文件中。
(请注意,rsc本身不会被包含在内,因此您可能需要在rsc下添加一个新的子目录,以使jar文件中的目录结构正确。)

谢谢您的回复。是的,那样做可以解决问题。但问题在于我不能把这些对象移动到rsc/rsc/中,因为本地运行(没有创建jar文件)将不再起作用... - Atmocreations

2

对于这种情况,我建议使用Maven,它在创建jar包时会自动完成这个过程。甚至还有Eclipse插件

你也可以使用Ant


谢谢,我知道这种工具的存在。但是我没有使用过它们,我的观点是,如果Eclipse提供了一个创建可执行jar文件的工具,那么我想应该可以简单地添加另一个文件夹到jar文件中而不需要修改它。 - Atmocreations

1

正如您在编辑2中所说,如果您有一个“all-in-one jar”,那么这应该可以工作:

String path = "rsc/img/img.gif";
URL url = this.getClass().getResource(path);
ImageIcon icon = new ImageIcon(url);

谢谢您的回复。我必须说,“this.getClass()”位于src/util/中。我会尝试它。 - Atmocreations

1

通常我会手动执行这个操作,在你的情况下 jar -uf foo.jar rsc 这将包含所有你的资源。 你可以编写一个脚本或在ant中执行此操作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接