java - Spring Boot 读取属性文件返回 null
问题描述
您好我有以下项目结构。
我想将我的属性文件存储在我的 jar 之外,这样如果我更改任何属性,它将自动反映。我的属性文件包含其他服务器的 ip,它可能会改变,所以这就是为什么我想将我的属性文件保留在我的 jar 之外。
我的resources
文件夹包含我的所有属性文件,包括 application.propeties。
我正在使用以下代码段从我的属性文件中读取。
server_1 = 新属性();
server_1.load(PropertyReader.class.getClassLoader().getResourceAsStream("resources/server_1.properties"));
server_2 = new Properties();
server_2.load(PropertyReader.class.getClassLoader().getResourceAsStream("resources/server_2.properties"));
我也试过
server_2.load(PropertyReader.class.getClassLoader().getResourceAsStream("server_2.properties"));
server_2.load(PropertyReader.class.getClassLoader().getResourceAsStream("/server_2.properties"));
但它给了我以下错误:
Caused by: java.lang.NullPointerException: null
我已经浏览了这个链接,所以这就是为什么我resources
在级别上创建了文件夹,src
但我仍然无法理解这种行为。
谢谢
解决方案
要继续我的评论,如果这是一个 jar,您将在 jar/bundle 之外分离资源,则需要 jar 的类路径中的资源文件夹。
对于我项目中的可执行 jar,我通过 maven-jar 插件在 jar 的清单条目中添加了一个类路径条目(相对于 jar 的位置):
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>....</mainClass>
</manifest>
<manifestEntries>
<Class-Path>../resources/</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
检查 MANIFEST.MF 文件中添加的条目。然后你可以直接在你的代码中使用(没有资源文件夹):
PropertyReader.class.getClassLoader().getResourceAsStream("server_1.properties");
对于您的单元测试,您可以直接在 src/resources 中提供。
更新:
刚刚注意到您提到它是一个弹簧启动应用程序。参考这个。使用配置文件提及资源文件夹的位置。这样就更整洁了。
推荐阅读
- flutter - 如何通过其他小部件 Flutter 设置状态小部件,下面的简单代码
- html - 多层 :nth-of-type 选择器不起作用
- python - 如何创建列表的随机大小的子列表?
- java - Android:为什么在 SeekBar 上调用 viewToFront() 不会将其带到 UI 顶部?
- swiftui - SwiftUI NavigationView 意外弹出到根目录
- java - 关于列表添加方法的问题,不适用
- docker - 使用 docker cp 时 json 文件中的回车符 ^M
- webview - 在 andriod studio webview 相机中没有上传
- python - 我如何在 Flask 中获取相同表单中的两个按钮中的哪一个被单击以执行不同的操作?
- python - 本地安装的 googledrive Colab - MessageError:RangeError:超出最大调用堆栈大小