Spring Boot 1.X和Spring Boot 2.X没有提供相同的选项和行为 Externalized Configuration
。
M. Deinum的很好回答是指Spring Boot 1的特殊性。
我将在这里为Spring Boot 2更新。
环境属性的来源和顺序
Spring Boot 2使用了一种非常特殊的PropertySource
顺序,该顺序旨在允许合理地覆盖值。按以下顺序考虑属性:
您的主目录上的Devtools全局设置属性(在devtools处于活动状态时,为〜/ .spring-boot-devtools.properties)。
@TestPropertySource
测试中的注释。
@SpringBootTest#properties
测试中的注释属性。命令行参数。
来自的属性SPRING_APPLICATION_JSON
(嵌入在环境变量或系统属性中的嵌入式JSON)。
ServletConfig
初始化参数。
ServletContext
初始化参数。
的JNDI属性java:comp/env
。
Java系统属性(System.getProperties()
)。
操作系统环境变量。
一个RandomValuePropertySource
仅具有随机属性的*。
打包的jar(application-{profile}.properties
和YAML变体)之外的特定于配置文件的应用程序属性。
打包在jar中的特定于配置文件的应用程序属性(application-{profile}.properties
和YAML变体)。
打包的jar(application.properties
和YAML变体)之外的应用程序属性。
打包在jar中的应用程序属性(application.properties
和YAML变体)。
@PropertySource
@Configuration
类上的注释。默认属性(通过设置指定
SpringApplication.setDefaultProperties
)。
要指定外部属性文件,您应该对这些选项感兴趣:
打包的jar(application-{profile}.properties
和YAML变体)之外的特定于配置文件的应用程序属性。
打包的jar(application.properties
和YAML变体)之外的应用程序属性。
@PropertySource
@Configuration
类上的注释。默认属性(通过设置指定
SpringApplication.setDefaultProperties
)。
您只能使用这三个选项之一,也可以根据需要将它们组合在一起。
例如,在非常简单的情况下,仅使用特定于配置文件的属性就足够了,但在其他情况下,您可能要同时使用特定于配置文件的属性,默认属性和@PropertySource
。
application.properties文件的默认位置
关于application.properties
文件(和变体),默认情况下,Spring会按以下顺序加载它们并在环境中添加它们的属性:
当前目录的/ config子目录
当前目录
类路径/ config包
类路径根
从字面上看,更高的优先权是这样的:
classpath:/,classpath:/config/,file:./,file:./config/
。
如何使用具有特定名称的属性文件?
默认位置并不总是足够的:默认位置(例如默认文件名(application.properties
))可能不适合。此外,正如在OP问题中一样,您可能需要指定多个配置文件,而不是application.properties
(和变体)。
所以spring.config.name
还不够。
在这种情况下,您应该使用spring.config.location
环境属性(目录位置或文件路径的逗号分隔列表)来提供显式位置。
要放心使用文件名模式,应优先使用文件路径列表而不是目录列表。
例如这样做:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
这样,最冗长的做法就是只指定文件夹,但也可以很好地指定我们的配置文件并清楚地记录有效使用的属性。
spring.config.location现在替换默认位置,而不是添加到默认位置
对于Spring Boot 1,该spring.config.location
参数在Spring环境中添加指定的位置。
但是从Spring Boot 2开始,spring.config.location
如文档所述,将 Spring使用的默认位置替换为Spring环境中的指定位置。
使用来配置自定义配置位置后
spring.config.location
,它们将替换默认位置。例如,如果spring.config.location
配置了的值
classpath:/custom-config/
,file:./custom-config/
,搜索顺序变为下式:
file:./custom-config/
classpath:custom-config/
spring.config.location
现在是一种确保application.properties
必须明确指定任何文件的方法。
对于不应该打包application.properties
文件的超级JAR ,这非常好。
为了保持spring.config.location
使用Spring Boot 2时的旧行为,您可以使用new spring.config.additional-location
属性,而不是按照文档说明的那样spring.config.location
添加位置:
或者,当使用来配置自定义配置位置时spring.config.additional-location
,除默认位置外,还会使用
它们。
在实践中
因此,假设像在OP问题中那样,您有2个要指定的外部属性文件和uber jar中包含的1个属性文件。
要仅使用您指定的配置文件:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
要将配置文件添加到这些文件的默认位置:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
在最后一个示例中不需要,因为默认位置具有该默认位置,并且此处默认位置不会被覆盖,而是扩展。
application.properties
会永远被载入,与spring.config.location
您可以添加被检查文件的其他配置位置(即当它与一个结束/
),但是如果你把一个逗号分隔的列表中有哪些点对那些将被载入的文件。这也是春节引导参考指南中的说明这里