我有两个Maven项目 A 和 B 。 I' M封装项目A作为一个罐子,将其添加为项目的依赖关系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,显然没有文件位于 projectA / src /主/资源/文件夹/ 。
如何解决这个问题?
答案 0 :(得分:0)
不要从文件系统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);
答案 1 :(得分:0)
您遇到的问题是您正在使用相对路径,并且您依赖于工作目录(由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);