我有多个要从类路径加载的属性文件。在 /src/main/resources
下有一个默认设置,它是 myapp.jar
的一部分。我的 springcontext
希望文件位于类路径中。 IE
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
我还需要使用外部设置覆盖这些属性的选项。我在 cwd
中有一个外部配置文件夹。根据 spring boot 文档配置文件夹应该在类路径上。但是从文档中不清楚它是否只会覆盖 application.properties
从那里或配置中的所有属性。
当我测试它时,只有 application.properties
被拾取,其余属性仍然从 /src/main/resources
拾取。我已经尝试将它们作为逗号分隔列表提供给 spring.config.location
但默认设置仍未被覆盖。
如何使多个外部配置文件覆盖默认配置文件?
作为解决方法,我目前使用 app.config.location
(应用程序特定属性),这是我通过命令行提供的。 IE
java -jar myapp.jar app.config.location=file:./config
我将 applicationcontext
更改为
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
这就是我在加载应用程序时分离文件和类路径的方式。
编辑:
//pseudo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
我真的不想使用上述解决方法,而是让 Spring 覆盖类路径上的所有外部配置文件,就像它对 application.properties
文件所做的那样。
原文由 nir 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新:由于 spring.config.location 的行为现在覆盖默认值而不是添加到默认值。您需要 使用
spring.config.additional-location
来保留默认值。这是从 1.x 到 2.x 的行为变化使用 Spring Boot 时,属性按以下顺序加载(请参阅 Spring Boot 参考指南中的 外部化配置)。
解析属性时(即
@Value("${myprop}")
解析以相反的顺序完成(因此从 9 开始)。要添加不同的文件,您可以使用
spring.config.location
属性,它采用逗号分隔的属性文件列表或文件位置(目录)。上面的将添加一个目录,该目录将被查询
application.properties
文件。这会将 2 个属性文件添加到加载的文件中。
默认配置文件和位置在额外指定的
spring.config.location
之前加载,这意味着后者将始终覆盖早期配置中设置的属性。 (另请参阅《Spring Boot 参考指南》的 这一部分)。