我想访问我项目的资源形式" \ 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"进入"目标/类"并从那里阅读。
答案 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文件:
mvn clean install
将创建jar文件并将其复制到文件夹target
。
right click on the pom.xml > Run AS > Maven install
还应生成jar文件并将其复制到文件夹target
。
注意:在屏幕截图中有两个jar文件:core-0.0.1-SNAPSHOT.jar
和Serial-0.0.1-SNAPSHOT.jar
;在生成jar文件之前删除它们(mvn clean或右键单击&gt;运行AS&gt; Maven clean)。原因是Maven只能为每个Maven模块/项目生成一个jar文件,afaik。