Spring Boot 类路径配置文件覆盖外部 application.properties

Posted

技术标签:

【中文标题】Spring Boot 类路径配置文件覆盖外部 application.properties【英文标题】:Spring boot classpath configuration files overrides external application.properties 【发布时间】:2020-11-09 16:20:21 【问题描述】:

我想让 Spring 加载一个外部配置文件(如果存在),否则使用 src/main/resources 中提供的一次。

当前设置:

src/main/resources/application.properties
src/main/resources/application-dev.properties
src/main/resources/application-prod.properties

/this/is/an/external/dir/application-dev.properties

类似于https://***.com/a/27776123/5126654我添加了如下注解:

@EnableFeignClients
@SpringBootApplication
@EnableEncryptableProperties
@PropertySources( //
    @PropertySource("classpath:application.properties"), //
    @PropertySource(value = "file:$external.config", ignoreResourceNotFound = true) //
)
public class Application extends SpringBootServletInitializer 

   // ....

并且在我的 application.properties 中有以下条目:

external.config=/this/is/an/external/dir/application-dev.properties

我还可以看到外部配置文件被拾取。我遇到的问题是类路径属性文件中的每个条目都会覆盖外部条目。 IE。而不是从 /this/is/an/external/dir/application-dev.properties 条目来自 src/main/resources/application-dev.properties 被占用。

如何修改我的代码以使外部文件覆盖类路径文件的条目?

【问题讨论】:

【参考方案1】:

只需更改导入顺序即可。 比如:

<context:property-placeholder file-encoding="UTF-8"
                            location="$YOUR_CUSTOM_PATH/global.properties ,
                                      $YOUR_CUSTOM_PATH/local.properties" ignore-unresolvable="true"/>

@PropertySource(value = "classpath:global.properties" , "local.properties",ignoreResourceNotFound = true)

在这种情况下,local.properties 会覆盖 global.properties 的属性

【讨论】:

不适合我。我认为问题是(对我来说)是分辨率的顺序:docs.spring.io/spring-boot/docs/current/reference/html/… 我在外部文件和 src/main/resource 文件中具有相同的属性.对于开发,我想要 /src/main/resources 文件。但是对于构建应用程序,我希望将 application-dev.properties 放在外部位置。 这可能是区分开发和生产环境的好资源spring.io/blog/2020/04/23/spring-tips-configuration【参考方案2】:

由于您只希望外部配置用于开发,因此您也可以考虑在项目的 IDE 运行配置中将外部属性源设置为命令行参数。

--spring.config.location=/this/is/an/external/dir/application-dev.properties

以上述方式指定的属性源会覆盖类路径中存在的 application.properties。

【讨论】:

【参考方案3】:

我想让 Spring 加载一个外部配置文件(如果存在),否则使用 src/main/resources 中提供的一次。

这是 Spring Boot 的默认行为。所以你只需要正确启用它。

首先,删除下一​​个注释,它们可能会破坏/覆盖默认机制:

@PropertySources( //
    @PropertySource("classpath:application.properties"), //
    @PropertySource(value = "file:$external.config", ignoreResourceNotFound = true) //
)

然后将文件的位置指定为命令行参数:

java -jar myapp.jar --spring.config.additional-location=/this/is/an/external/dir/

更多信息在这里:

Spring Boot Features - Externalized Configuration Common Application properties - Core properties

然后将您的配置重命名为 application.properties 或通过另一个环境变量指定您的 dev 配置文件(文件名中的后缀):

-Dspring-boot.run.profiles=dev

相关问题:Setting active profile and config location from command line in spring boot

【讨论】:

以上是关于Spring Boot 类路径配置文件覆盖外部 application.properties的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot不同配置文件名和配置文件所在路径的优先级

Spring Boot不同配置文件名和配置文件所在路径的优先级

Spring Boot不同配置文件名和配置文件所在路径的优先级

Spring Boot 中的外部化配置

如何将 SpringBoot 配置外部文件覆盖到类路径文件?

单体Spring boot引入外部配置文件yml,properties