我有两个Maven项目A和B。我正在将项目 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);