【问题标题】:Text and image files not included when exporting jar导出 jar 时不包含文本和图像文件
【发布时间】:2019-07-06 07:22:50
【问题描述】:

我创建了一个项目,它在执行时使用图像文件和文本文件。在我将项目导出到可运行的 jar 之前,文本和图像文件都在我的项目文件夹中,但是当我从命令行运行 jar 时,由于程序键入从文本文件中读取而导致出现 filenotfound 异常。我解压缩 jar 以仔细检查,图像和文本文件不存在。

package application;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

import javafx.collections.FXCollections;

public class Data {
    private static Data instance=new Data();
    private Map<String,String> saveEntries = new HashMap<>();
    private static String fileName = "ResponseData";

public static Data getInstance() {
    return instance;
}

public void exitSave() throws IOException {
    Path path = Paths.get("ResponseData");
    Iterator<Map.Entry<String, String>> iter = saveEntries.entrySet().iterator();
    BufferedWriter bw = Files.newBufferedWriter(path);
    try {
        while(iter.hasNext()) {
            Map.Entry<String, String> entry = iter.next();
            bw.write(String.format("%s\t%s", entry.getKey(),entry.getValue()));
            bw.newLine();
        }
    } catch (IOException e) {
        new FileNotFoundException("Error when saving data");
    }finally {
        if(bw!=null)
            bw.close();
    }
}



public void updatedSaveEntry(String input, String response) {
    saveEntries.put(input, response);
}

public Map<String,String> getSaveEntries(){
    return this.saveEntries;
}

public void setEntry(Map<String,String> map) {
    Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
    while(iter.hasNext()) {
        Map.Entry<String, String> entry = iter.next();
        saveEntries.put(entry.getKey(), entry.getValue());
    }
}


public void loadEntries() throws IOException{
    saveEntries = FXCollections.observableHashMap();
    Path path = Paths.get(fileName);
    BufferedReader br = Files.newBufferedReader(path);
    String line;
    try {
        while((line=br.readLine())!=null&&!line.trim().isEmpty()) {
            String[] parts = line.split("\t");
            saveEntries.put(parts[0], parts[1]);
        }
    }finally {
        if(br!=null) {
            br.close();
        }
    }

}

}

Eclipse Runnable Jar Export

Project Folder

【问题讨论】:

  • 那么我们怎么知道你为什么没有把丢失的文件打包到jar中呢?你没有提供任何细节,你甚至没有问一个真正的问题。你只是在描述一个事实。
  • 让我修改一下我的陈述。基本上,我创建了一个类似的项目,之前包含一个文本文件并将项目导出到一个 jar 中。该程序从文本文件中保存和检索文本没有问题,因此我假设该文件也包含在 jar 文件中(如果我错了,请原谅,我对 IO 不太熟悉)。我创建的这个新项目也使用了 javafx,但主要区别在于我将 JDK 和 JavaFX 更新到了最新版本。由于 JavaFX 问题,我还在运行配置中添加了一个 VM 参数(openjfx.io/openjfx-docs/#install-javafx)
  • VM 参数:--module-path "\path\to\javafx-sdk-12.0.1\lib" --add-modules javafx.controls,javafx.fxml ,除了这些变化我的两个项目的文件 IO 代码几乎相同,但是当我尝试运行 jar 时,我当前的项目给了我 filenotfound 错误。
  • 你仍然没有抓住重点。 1. 文本文件是否应该在 jar 文件中取决于您在代码中访问文件的方式,但您没有提供任何相关信息。 2.您一直在谈论将某些内容导出到 jar 文件,但您没有提供任何信息,您是如何做到的。手动?通过 Eclipse?通过一些 Maven/Gradle 插件或什么?如果要将文本文件导出到 jar 中,则必须正确配置导出。例如,如果您使用的是 Maven/Gradle,则该文件必须位于正确的资源文件夹中。
  • 哦,好的。我为我的文件访问类添加了代码。错误显示在 'Path path = Paths.get("ResponseData");'其中“ResponseData”是我项目中的文件。我通过 Eclipse 导出了我的项目(底部的屏幕截图链接)。

标签: java eclipse javafx jar export


【解决方案1】:

如果您同时读取和写入文件,那么在应用程序 jar 中定位此文件是不合适的,如另一个答案中所述:您应该将数据保存在外部位置。

但是,通常将只读资源文件(例如图像)保留在 jar 中。如果您想为图像和可能的其他资源保留这种方法,您将面临两个问题:

  1. 让 Eclipse 使用 Export Runnable Jar 功能将文件包含在 jar 中。

  2. 在 jar 中查找文件

包含文件

最简单的可能只是将文件放在源文件夹中。在你的项目中,做New -&gt; Source Folder,给它一个名字(例如,“资源”),然后把你的文件移到那里。通常,如果您重新运行导出,文件应该在 jar 中。

查找文件

jar 中的文件的访问方式不同。请参阅Reading a resource file from within jar 的已接受答案。请注意,您不需要在路径中包含资源文件夹的名称,因为此文件将放置在 jar 的根目录中(您可以通过解压缩来验证这一点)。

【讨论】:

  • 您的答案是把 OP 放在错误的轨道上,因为他不仅从文件中读取,而且根据他的代码示例,还写入文件,如果文件是位于 jar 文件中。因此,OP 实际上应该将文件保留在 jar 之外,并将其放入正确的文件夹中。
  • 感谢您指出这一点,我有点被标题误导了。我会留下我的答案,因为它可能与图像文件相关,但请对其进行编辑以进行区分。
  • 感谢两位的帮助。我通过创建 res 源文件夹并从那里访问图像来解决图像问题。我通过 '.createNewFile()' 方法修复了数据读取问题。
【解决方案2】:

您的程序正在尝试从本地文件系统而不是 jar 文件中读取文件。所以它确实不应该包含在 jar 文件中。该程序期望文件位于您执行程序的当前工作目录中,如果您在 Eclipse 中运行项目或执行导出的 jar 文件,则该文件可能会有所不同。

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2017-07-31
    • 2014-10-20
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2021-09-26
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多