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不同配置文件名和配置文件所在路径的优先级