Maven 导入中的路径被主项目覆盖



我有两个Maven项目AB。我正在将项目 A 打包为 jar,并将其添加为项目 B 中的依赖项.项目 A 显示在我的外部库中(使用 IntelliJ(,我可以看到所有源代码和文件。

在项目 A 中,我有一个方法可以检索位于 projectB/src/main/resources/folder/ 的文件夹中的文件,我使用以下代码来检查此文件夹中是否存在任何文件:

File folder = new File("src/main/resources/folder/");
File[] defaultDefinitions = folder.listFiles();

运行项目 A 时,这将正常工作。但是,当项目 B 调用此方法时,它不是将路径附加到项目 A 的工作目录,而是将其附加到项目 B 的工作目录,显然没有位于项目 A/src/main/resources/folder/ 的文件。

如何解决这个问题?

您遇到的问题是您使用的是相对路径,并且依赖于工作目录(由 IDE 自动管理(。您需要以可预测的方式读取文件,即使您在 IDE 外部运行代码也是如此。

您可以使用绝对路径来解决问题,即使您从命令行或 IDE 之外的任何位置运行程序,这也会有所帮助:

String path = "/absolute/path/from/properties/etc/folder/";
              //better use a program argument or properties file for this
File folder = new File(path);

不要从文件系统 API 加载 Maven 资源:

File folder = new File("src/main/resources/folder/");

它仅在开发阶段工作,因为除了正在运行的应用程序之外,您还有源代码。

相反,请使用类加载器:

File folder = getClass().getResource("/folder").toURI().toURL().getFile();

它将工作,因为src/main/resources是Maven的"特殊"目录,因为位于此目录中的所有资源文件在编译时都添加到类路径中,并且在运行时也将在类路径中可用。

请注意,您可以使用 java.nio API 从不太复杂的方式检索文件:

Path folderPath = Paths.get(getClass().getResource("/folder").toURI());
Stream<Path> pathStream = Files.list(folderPath);

最新更新