【问题标题】:How to package a jar file along with reference files?如何将 jar 文件与参考文件一起打包?
【发布时间】:2015-03-10 21:32:00
【问题描述】:

当我只在我的计算机上使用应用程序时,使用 eclipse 导出可运行的 jar 文件非常简单。程序正在使用的任何文件(精灵表、音轨等)都只存在于我的计算机上,因此仅将 jar 发送到另一台机器是行不通的。

打包一个 jar 以及所有必要文件以便我可以在任何机器上运行程序的最简单方法是什么?

【问题讨论】:

    标签: java eclipse file jar reference


    【解决方案1】:

    我从您的标签中看到您在 Eclipse 中工作。我不确定此方法是否适用于其他 IDE,如果您手动执行所有操作,我认为它根本不会起作用(它依赖于编译器自动将资源复制到 bin 文件夹。

    最简单的方法(至少我使用的)是定义另一个源文件夹(我喜欢res)。

    然后您可以将包添加到此源文件夹并转储相关图像。然后重建您的项目。

    最后,您可以使用getClass().getResourceAsStream("package/path/file_name.whatever"); 来获取您的文件。

    导出为jar 后,它应该可以工作,即使在其他机器上也是如此。

    【讨论】:

    • 你应该在这里使用哪个包? res文件夹不是通常在任何包之外创建的吗?
    • 没关系。我通常将它们放在 res 文件夹中的 com.whatever.ui 包中。所以从项目根目录来看,它将是<project root>/res/com/whatever/ui。我不知道普遍接受的方式是什么。您可以将文件转储到res,如果您愿意,可以将它们称为file_name.whatever...
    【解决方案2】:

    如果您不要求其他文件是文件系统上的实际文件(这意味着您不能使用FileFileInputStream),那么您可以使用资源系统。如果将它们放在 JAR 中,则可以像这样访问它们:

    InputStream fileStream = SomeClassInYourJarFile.class
                                                .getResourceAsStream("/path/to/file.png");
    

    此示例将为您提供从 JAR 文件中的 /path/to/file.png 条目读取的 InputStream,即文件夹“路径”中的文件夹“to”中的“file.png”文件。

    这并不要求将文件放在 JAR 文件中 - 它可以从存储 .class 文件的任何位置加载它们,无论 JAR 与否。如果您将它们放在源文件夹中,Eclipse 会自动将它们复制到该位置 - 因此,如果您有一个包 path.to 包含一个名为 file.png 的文件,则上述行也可以工作。

    【讨论】:

    • 我很困惑 InputStream 实际上是什么以及它是如何使用的。它是实际的文件吗?如果不是,如何将其转换为文件?
    • @Dan InputStream 是“您可以从中读取的内容”。这可能是一个实际文件,或者是 JAR 中的一个条目(不可能 转换为 File,因为它不是一个文件 - 除非你的程序将它复制到一个会破坏把东西装进你的 JAR 里)
    • @Dan 有来自文件 (FileInputStream)、JAR 条目、网络连接、字节数组等的 InputStream。基本上是您可能想要从中读取数据的任何内容。
    • 那么通过从 InputStream 中读取来尝试创建 BufferedImage 是什么有效的方法?当我尝试将其创建为“ImageIO.read(stream)”(其中 stream 是 InputStream 的名称)时,我收到一条错误消息,指出输入为空。
    • @Dan 如果你做过很多 Java 编程,你应该知道如果某些东西是空的,那是因为它来自哪里,而不是因为你如何使用它。具体来说,getResourceAsStream 必须返回 null(或者您忘记实际调用它)。如果找不到资源,它将返回 null - 您传递给它的路径是什么,硬盘驱动器上的实际文件在哪里(在它进入 JAR 之前),以及您的 .class 文件和 .java 文件在哪里?
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2013-03-19
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多