【问题标题】:Java getResource is in wrong pathJava getResource 路径错误
【发布时间】:2020-03-28 03:07:38
【问题描述】:

我希望有人可以在这里帮助我,因为我已经解决了一段时间的问题。在我的主课中,我使用这个命令:

System.out.println(getClass().getClassLoader().getResource("org"));

我遇到的问题是它返回:

file:/E:/Tmp/ExamplePr/PROJEKT/proj/build/classes/java/main/org

代替:

file:/E:/Tmp/ExamplePr/PROJEKT/proj/build/resources/java/main/org

问题是它进入了类目录而不是资源目录。因此,我无法访问我需要的 .fxml 文件。我正在使用 gradle 进行构建,目前正在使用 JavaFX。我尝试过类似的方法:

System.out.println(getClass().getClassLoader().getResource("/resources/java/main/org"));

但我只是得到了 null :(

你知道有什么方法可以强迫他使用绝对路径或在资源文件中寻找资源,甚至使用类似使用“../”之类的东西从 linux 上去。我没有找到任何这些

【问题讨论】:

  • 无论如何你都不能列出带有资源的包的内容。 getResource() 应该与资源的路径一起使用,即文件,而不是目录。
  • 您的resources 目录本质上是一个源代码树。程序在运行时无权访问其源文件。您应该将资源复制到已编译的类文件所在的同一位置。

标签: java getresource


【解决方案1】:

资源树的根由类加载器定义(如JavaDoc 中所述)。您可以通过在类路径中显式设置根来定义根,或者最好使用 maven 之类的构建工具并遵循该工具设置和使用的约定来定义根。对于 maven 项目,根目录通常位于 main/java/resources。

【讨论】:

    【解决方案2】:

    getResource 将始终返回类路径中的第一个匹配项。因此,如果您在类路径中在 E:/Tmp/ExamplePr/PROJEKT/proj/build/classes/java/main 之前指定 E:/Tmp/ExamplePr/PROJEKT/proj/build/resources/java/main,您将得到您想要的。

    也就是说,资源通常是与类一起复制的,有时两者都打包在一个 jar 文件中,所以你不必担心。

    【讨论】:

      【解决方案3】:

      使用 JavaFX 使用 FXMLLoader;

           FXMLLoader.load(new URL(getClass().getResource("/fxml/myfxml.fxml").toExternalForm()));
      

      确保传递平台适当的分隔符并使用相对路径。

      【讨论】:

      • 这基本正确(除了您总是在 getResource 的参数中使用正斜杠,因为参数是相对 URL,而不是文件路径),但是它没有回答问题。
      • 以什么方式不回答问题,这将从资源目录中加载 FXML。
      • 问题是问为什么getResource方法找不到项目的resources目录下的资源文件。
      猜你喜欢
      • 2016-06-30
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 2021-05-31
      • 2018-11-10
      • 2015-01-20
      • 2015-06-21
      相关资源
      最近更新 更多