【问题标题】:Can't Access resource path, only the target path无法访问资源路径,只能访问目标路径
【发布时间】:2017-02-19 04:50:54
【问题描述】:

我想访问我的项目“\src\main\resources”的资源形式,但出于任何原因,我只能访问目标类。 这是我的代码:

System.out.println(Main.class.getResourceAsStream("/123.txt")); // java.io.BufferedInputStream@66cd51c3
System.out.println(Main.class.getResource("/123.txt")); // file:/C:/Users/Raul/workspace/Serial/target/classes/123.txt
System.out.println(Thread.currentThread().getContextClassLoader().getResource("123.txt").getPath()); // /C:/Users/Raul/workspace/Serial/target/classes/123.txt

这里是我的项目目录:

问题是,即使我删除了目标/类中的所有文件并运行代码,编译器也会将文件从“src/main/ressources”复制到“目标/类”并从那里读取它们。

【问题讨论】:

    标签: java maven jar


    【解决方案1】:

    您正在看到预期的行为。 Java 程序被编译成可执行形式——意思是.class 文件和资源。当其他用户运行您的程序时,他们将无法访问源代码,因此您的代码不应假定您的源代码树可用。

    简单地说,您的代码是正确的。不要尝试读取源代码树。如果您希望目标/类包含最新文件,请重新构建您的项目。

    请注意:切勿使用 URL 的 getPath() 方法将 URL 转换为文件名。 URL 中有许多不允许的字符,这些字符将被“百分比转义”以符合 URL 规范;因此,URL 的路径部分不是有效的文件名!将 URL 转换为文件的唯一正确方法是 Paths.get(url.toURI())。但是,您甚至不应该尝试将资源转换为文件,因为一旦您继续将程序打包到 .jar 文件中,您的资源将根本不会作为常规文件存在,而只会作为 .jar 文件中的条目存在(实际上只是添加了一些 Java 特定条目的 zip 文件)。

    【讨论】:

    • 但是在我将项目导出到 jar 文件并查看后,ressource 文件夹以及我所有的 ressourcesc 都在那里。我需要的是修复资源路径的解决方案。谢谢
    • 如果Main.class.getResource("/123.txt") 已经返回了一个有效的对象,有什么问题?
    • 问题是我不知道如何将目标类导出到我的 jar 中,或者如何获取“src/main/ressources”作为返回值。
    • 您不能将“src/main/resources”作为返回值。你为什么想要?就像我说的,Main.class.getResource("/123.txt") 已经可以使用了。
    • stackoverflow.com/questions/27703508/… 我需要得到那个路径。可运行的 jar 应该从那里或从其他地方读取图像。请帮助我。
    【解决方案2】:

    我想访问我的项目“\src\main\resources”的资源形式,但出于任何原因我只能访问目标类。

    我认为用户@VGR 已经回答了这个问题。换一种说法来澄清一下:

    • 您将资源放在/src/main/resources 文件夹中,这些资源将在您构建项目时按原样复制到/target/classes 文件夹中。

    示例

    src/main/resouces/123.txt -> target/classes/123.txt
    src/main/resources/myresources/145.txt -> target/classes/myresources/145.txt
    ...
    

    现在,如果您在 IDE 中运行该程序,您将观察到以下内容:

    System.out.println(Main.class.getResource("/123.txt"));
    

    输出:file:/C:/Users/Raul/workspace/Serial/target/classes/123.txt

    System.out.println(Main.class.getResource("/myresources/145.txt")); 
    

    输出:file:/C:/Users/Raul/workspace/Serial/target/classes/myresources/145.txt

    但是如果您打开生成的jar 文件,您将看不到target 文件夹,因为文件123.txt 将位于jar 文件和文件的根目录下145.txt 将在文件夹 myresources/145.txt 下。

    文件夹目标只是构建工具的输出目录,不会打包到你的jar文件中。

    现在回答以下问题:

    问题是我不知道如何将目标类导出到我的 jar 中,或者如何将“src/main/ressources”作为返回值。

    要回答这个问题,您必须查看项目根目录中的 pom.xml 文件。其中应该有一个<packaging>jar</packaging> 条目。如果是这样,您可以按如下方式创建 jar 文件:

    选项 1:从命令行

    mvn clean install
    

    jar 文件将被创建并复制到文件夹target

    选项 2:在 Eclipse 中(例如)

    right click on the pom.xml > Run AS > Maven install
    

    jar 文件也应该生成并复制到文件夹target

    注意:在您的屏幕截图中有两个 jar 文件:core-0.0.1-SNAPSHOT.jarSerial-0.0.1-SNAPSHOT.jar;在生成 jar 文件之前删除它们(mvn clean 或右键单击 > Run AS > Maven clean)。原因是 Maven 只能为每个 Maven 模块/项目生成一个 jar 文件,afaik。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多