为什么Spring Boot的资源优先级忽略了我的外部属性文件?

时间:2018-03-02 16:09:36

标签: java spring spring-boot properties properties-file

作为Spring Boot项目的一部分,我需要加载某些属性文件,默认情况下,该文件位于de src/main/resources目录下。此外,我需要能够加载外部属性文件(位于项目的根目录)。如果存在此外部文件,则应将文件路径作为命令行属性传递。

文件结构如下:

/app_project
   Net.properties (external file)
   /src
      /main
         /resources
            Net.properties (default file)

事实是,使用这些属性的依赖关系将无效,除非将外部文件的内容复制/覆盖到/resources目录下的文件中。< / p>

已更新

到目前为止,我已经尝试过:

  • 将文件作为外部资源加载并将其加载到Properties对象(https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html
  • 将属性保存为系统属性
  • 通过覆盖addResourceHandlers()来包含位置来修改资源处理程序以查看其他目录
  • 使用-cp argument明确地将文件的位置包含在CLASSPATH中(建议使用@veysiertekin)
  • 将其作为@PropertySource加载(由@Nikolay Shevchenko提供)
  • 使用spring.config.location覆盖 Spring Boot的配置位置(由@gWombat建议)

通过我尝试过的所有这些方法,文件确实已经被读取和加载,但在某些时候,应用程序每次都会转到src/main/resources下的文件。

我怀疑它可能与文件的优先级有关(如https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html所述),但我无法弄清楚发生了什么。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

尝试像

一样的smth
@PropertySources({
        @PropertySource(name = "default", value = "classpath:default.properties"),
        @PropertySource(name = "external", value = "classpath:external.properties", ignoreResourceNotFound = true)
})
public class YourSpringBootApplication {
...
}

答案 1 :(得分:0)

根据official doc,您可以尝试使用属性spring.config.additional-location添加其他配置文件,或spring.config.location覆盖默认文件位置。

您应该将这些属性作为程序参数传递,以便Spring可以在应用程序启动时使用它们。

答案 2 :(得分:0)

当spring-boot项目运行时,它会检查构建的jar文件下的文件。在运行应用程序之前,需要将外部文件添加到类路径中:

java -cp 'path-to/spring-boot-application.jar:Net.properties' test.SpringBootApplicationMain