SpringBoot项目如何引用jar包外的配置文件?

643 阅读3分钟

默认加载顺序

SpringApplication 从以下位置的 application.properties 文件加载属性并将其添加到Spring Environment : 配置位置按相反顺序搜索。默认情况下,配置的位置为 classpath:/,classpath:/config/,file:./,file:./config/ 。结果搜索顺序如下:

  1. file:./config/
  2. file:./
  3. classpath:/config/
  4. classpath:/

jar包所在目录下的config目录 -> jar包所在目录 -> jar包内类路径根目录下的config目录 -> jar包内类路径根目录且列表中较高优先级位置定义的属性覆盖较低优先级位置定义的属性

使用环境属性spring.config.location

使用 spring.config.location 环境属性(逗号分隔的目录位置或文件路径列表)来引用显式配置文件位置。如果 spring.config.location 包含目录,则应该以 / 结束。

使用 spring.config.location 配置自定义配置位置时,它们将替换默认位置。

例如,如果用值 classpath:/custom-config/,file:./custom-config/ 配置 spring.config.location ,则搜索顺序如下所示:

  1. file:./custom-config/
  2. classpath:custom-config/

使用环境属性spring.config.additional-location

使用 spring.config.additional-location 配置自定义配置位置时,将包含自定义配置位置和默认位置。在默认位置之前加载自定义位置。

例如,如果配置了 classpath:/custom-config/,file:./custom-config/ 的其他位置,则搜索顺序如下所示:

  1. file:./custom-config/
  2. classpath:custom-config/
  3. file:./config/
  4. file:./
  5. classpath:/config/
  6. classpath:/

这种搜索顺序允许用户在一个配置文件中指定默认属性,然后在另一个配置文件中选择性地覆盖这些属性。即可以在默认位置之一的 application.properties 中为应用程序提供默认属性。然后,在运行时使用位于其中一个自定义位置的不同文件覆盖这些默认属性。

特定配置文件的属性

除 application.properties 文件外,还可以使用以下命名约定定义特定配置文件的属性: application-{profile}.properties 。 Environment 有一组默认配置文件(默认情况下为 [default] ),如果没有设置活动的配置文件,则使用这些配置文件。换句话说,如果没有明确激活配置文件,那么就会加载application-default.properties中的属性。

特定配置文件的属性跟随标准application.properties在相同的位置加载,特定配置文件总是覆盖非特定文件,无论特定配置文件是否在打包的jar中。

如果指定了多个配置文件,则应用最后获胜策略。例如,由 spring.profiles.active 属性指定的配置文件将添加到通过 SpringApplication API配置的配置文件之后,因此优先级更高。

注:文章中默认指代的配置文件为propertiesymlyaml同理。

总结

如果想要在jar引用外部的配置文件,只需将application.propertiesapplication-xxx.properties放在jar包所在目录的config目录或者和jar包同级目录下。这样启动jar包时会默认优先加载这些位置的配置,且jar包外的配置文件属性会覆盖jar包内的同名配置文件的同名属性。

参考资料:docs.spring.io/spring-boot…