主项目

时间:2018-03-21 20:42:54

标签: java maven dependencies filepath

我有两个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 /主/资源/文件夹/

如何解决这个问题?

2 个答案:

答案 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);