无法访问资源路径,只能访问目标路径

时间:2016-10-10 17:39:01

标签: java maven jar

我想访问我项目的资源形式" \ 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

在这里,我的项目目录:

project dirs

问题是,即使我删除了目标/类中的所有文件并运行代码,编译器也会复制来自" src / main / ressources"进入"目标/类"并从那里阅读。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

  

我想访问项目“\ 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的根目录下{1}}文件和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或右键单击&gt;运行AS&gt; Maven clean)。原因是Maven只能为每个Maven模块/项目生成一个jar文件,afaik。