首页 > 解决方案 > 如何在 Maven 构建模块期间从文件系统中读取文件

问题描述

我有一个 Maven 项目 A(打包为 pom),其中包含 Maven 模块项目 B(打包为 jar)。项目 B 在物理上也位于项目 A 的根目录中。

在构建 B 时,插件间接使用我的代码(在 B 内部)来访问其 src/main/resources 位置中的属性文件。

当我直接构建项目B(mvn clean install)时,代码可以通过使用轻松找到该文件new File("src/main/resources/foo.properties");

但是,当我尝试构建项目 A 时,它首先会尝试构建模块 B,在这种情况下它找不到属性文件。

除了“新文件”变体之外,我还尝试过使用 this.getClass().getClassLoader().getResourceAsStream("src/main/resources/foo.properties");

我尝试使用 Spring:

Resource resource = new ClassPathResource("src/main/resources/foo.properties");

两者都带有“/”前缀。但是根本找不到该文件。

这是为什么?它可能在 A 的根目录中寻找文件吗?构建A时是否可以在模块B中找到文件?

谢谢!

标签: javamaven

解决方案


new File("src/main/resources/foo.properties");

这是相对于工作目录的路径。工作目录位于您调用 maven 的任何位置。所以这就是为什么在模块B目录以外的任何地方调用maven时它都不起作用的原因。

this.getClass().getClassLoader().getResourceAsStream("src/main/resources/foo.properties");

这不起作用,因为类路径是 maven 放置类的位置,即target/classes.

您需要做的是将此文件作为资源添加到 maven 构建中,然后使用getResourceAsStream正确路径的想法。由于您使用了标准的 Maven 布局,您可能不需要任何东西,只需使用

this.getClass().getClassLoader().getResourceAsStream("foo.properties");

推荐阅读