首页 > 解决方案 > 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但我仍然无法理解这种行为。

谢谢

标签: javaspringspring-bootpropertiesconfiguration

解决方案


要继续我的评论,如果这是一个 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 中提供。

更新:

刚刚注意到您提到它是一个弹簧启动应用程序。参考这个。使用配置文件提及资源文件夹的位置。这样就更整洁了。

Spring Boot 基于类路径 arg 读取属性文件


推荐阅读