在Maven项目中使用相对路径

jm81lzqq  于 2023-08-03  发布在  Maven
关注(0)|答案(3)|浏览(225)

我有一个maven项目,它有以下标准目录结构:
src/main/java
src/main/java/pdf/Pdf.java
src/test/resources
src/test/resources/files/x.pdf
在我的网站Pdf.java上

File file = new File("../../../test/resources/files/x.pdf");

字符串
为什么报告“没有这样的文件或目录”?相对路径应该有效。对不对?

6pp0gazn

6pp0gazn1#

相对路径相对于当前工作目录起作用。Maven不设置它,所以它继承了它在执行代码的Java进程中的任何值。
唯一可靠的方法是在你自己的代码中找出它。根据你做事的方式,有几种方法可以做到这一点。有关建议,请参见How to get the real path of Java application at runtime?。您很可能会查看this.getClass().getProtectionDomain().getCodeSource().getLocation(),然后您就知道类文件在哪里,并且可以相对于它进行导航。

7jmck4yq

7jmck4yq2#

为什么报告“没有这样的文件或目录”?相对路径应该有效。对不对?
错了
你的类被编译成$PROJECT_ROOT/target/classes,你的资源被复制到同一个文件夹,保持它们的相对路径 * 在 * src/main/resources下面。
该文件将位于与根为$PROJECT_ROOT/target/classesclasspath 相关的位置。因此,您必须在您的www.example.com中写道Pdf.java:

File file = new File("/files/x.pdf");

字符串
您的相对路径将从项目 * 当前工作目录 * 计算,该目录是$PROJECT_ROOT(AFAIR)。
但这并不重要,因为您希望它能在最终应用程序中工作,而不仅仅是在构建环境中工作。因此,您应该使用getClass().getResource("/path/to/file/within/classpath")访问该文件,该文件在 class path 中搜索根为$PROJECT_ROOT/target/classes的文件。

xjreopfe

xjreopfe3#

不,引用文件的方式是根据您的文件系统。Java知道类路径而不是文件系统,如果你想引用类似的东西,你必须使用文件的完全限定名。我也不知道File构造函数是否与类路径一起工作,因为它是管理文件系统的抽象,它将取决于应用程序从哪里运行。假设它是从目标目录运行的,在同一个级别的源目录,在这种情况下,你必须先去一个目录,然后在src上,然后测试资源,文件,最后在x.pdf中。
由于您使用的是一个resources文件夹,我认为您希望该文件位于classpath中,然后您可以加载资源:

InputStream in = this.getClass().getClassLoader()
                            .getResourceAsStream("<path in classpath>");

字符串
然后,您可以创建一个FileInputStream或其他东西来 Package 文件。否则,使用完全限定的名称,并将其设置为/home/{user}/files/x. pdf。

相关问题