【问题标题】:Not able to get JSON file from resource folder using relative path无法使用相对路径从资源文件夹中获取 JSON 文件
【发布时间】:2018-03-06 06:37:29
【问题描述】:

我正在尝试使用相对路径在主要方法中从我的资源文件夹中获取 JSON 文件。该代码使用绝对路径工作,但是一旦我从我想要的项目中构建了一个 jar 文件,这就会中断。

public static void main(String[] args) throws FileNotFoundException {
// Read in database
db = Database.read(Thread.currentThread().getContextClassLoader().getResource("JSON/inhabitants.json").toExternalForm());
names = db.getAllNames();

Read 调用数据库中的一个方法,该方法使用输入流来读取文件。

  public static Database read(String filename) throws FileNotFoundException {
    InputStream is = new FileInputStream(filename);
    Reader reader = new InputStreamReader(is);

    return gson.fromJson(reader, Database.class);
  }

我得到的错误如下:

java.io.FileNotFoundException: 文件:/Users/timpelser/IdeaProjects/TurfApp/target/classes/JSON/inhabitants.json (没有这样的文件或目录)在 java.io.FileInputStream.open0(Native 方法)在 java.io.FileInputStream.open(FileInputStream.java:195) 在 java.io.FileInputStream.(FileInputStream.java:138) 在 java.io.FileInputStream.(FileInputStream.java:93) 在 Core.Database.read(Database.java:22) 在 Main.main(Main.java:51) ... 还有 11 个

目录/Users/timpelser/IdeaProjects/TurfApp/target/classes/JSON/inhabitants.json中的文件

但是确实存在,所以我不知道出了什么问题。

这是我的文件夹结构(Maven基本结构):

是否有一个解决方案可以让我将其部署为 jar 文件?

编辑(25/09):如果我使用 getResourceAsStream 而不是 getResource,我会收到以下错误:

Caused by: java.io.FileNotFoundException: java.io.BufferedInputStream@4f8e5cde (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at Core.Database.read(Database.java:22)
at Main.main(Main.java:51)
... 11 more

【问题讨论】:

  • 仅供参考,为什么要将json文件放在目标文件夹中?目标是构建文件夹,每次执行都会被删除mvn clean
  • 我不是故意这样做的,我只是将文件添加到资源文件夹中,并在构建工件时将其添加到目标文件夹中

标签: java maven jar resources inputstream


【解决方案1】:

使用这个,

Resource resource = new classpathResource(json);

new ObjectMapper.readValue(resource.getInputStream(),Object.class);

【讨论】:

    【解决方案2】:

    您必须使用getResourceAsStream 从正在运行的 jar 中读取文件(其中包含 src\main\resources 中的文件)!

    【讨论】:

    • 我使用 getResourcAsStream 发现文件未找到异常
    • 不知道你用的是什么开发环境。如果你运行它,例如在 Eclipse 中,那么 Eclipse 应该处理这个调用,就像它从一个罐子里一样,但是罐子里有什么?然后查找进入类路径,src\main\resources 必须在类路径中!请检查您的场景是否属于这种情况。 (在 Eclipse 中右键单击 src\main\resources -> “构建路径” -> “用作源文件夹”)
    • 我使用的是 IntelliJ Ultimate Edition,资源设置为默认资源文件夹
    • 我不知道 IntelliJ 中的确切名称,但您还必须确保 src\main\resources 在类路径/源文件夹中!
    • 呃我不明白,因为类路径是 src/main/resources,还是我不明白什么?
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多