java - 如何在 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中找到文件?
谢谢!
解决方案
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");
推荐阅读
- php - 如何在 octobercms 中使用 twig 删除数字
- android - Android Studio 项目同步失败
- react-native - 反应导航导入问题
- python - 使用热门词/关键字开始录制语音识别
- python - 如何分析应用程序的cpu利用率
- node.js - Microsoft Graph API beta 不适用于节点
- node.js - 仅当密钥不存在时如何插入到 DynamoDb
- sql - SQL Presto 查询 - 检索所有可能的行组合?
- python - Azure loganalytics python SDK 总是抛出 MissingApiVersionParameter 异常
- c - 创建 Netfilter 内核模块时出现编译错误