Spring Boot 2.2.1中的外部application.properties文件覆盖值

时间:2019-11-28 09:53:18

标签: spring-boot

我已经看到许多有关Spring Boot外部配置的问题,特别是将application.properties文件外部化,但是没有找到关于外部化application.properties文件的属性值是否应为合并或类路径上的整个.properties文件,应使用外部文件覆盖

在最近将应用程序升级到Spring Boot 2.2.1-RELEASE版本之后,需要使用spring.main.allow-bean-definition-overriding=true属性启用bean覆盖,该属性在类路径的application.properties文件中设置。由于我们要使用外部application.properties文件,因此我创建了一个没有上述属性的名称(相同名称),并在IntelliJ中将其加载了以下属性:

java -jar appName.jar --spring.config.location="C:\Users\User\Downloads\application.properties"

出现错误,好像外部props文件完全覆盖了classpath文件,而没有在classpath文件中查找提到的属性,而没有使用classpath application.properties中缺少的属性:

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'userRepository' could not be registered. A bean with that name has already been defined and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

在将bean覆盖属性添加到外部application.properties文件之后,但又从类路径中将其删除了,错误消失了。

在Spring文档中,明确指出:

  

Spring Boot使用一个非常特殊的PropertySource顺序,该顺序旨在允许合理的值覆盖。按以下顺序考虑属性:

     
    

...

         
      
          
  1. 打包的jar之外的应用程序属性(application.properties和YAML变体)。
  2.       
  3. 打包在jar中的应用程序属性(application.properties和YAML变体)。
  4.       
    
  

在使用IntelliJ和打包的jar对其进行测试之后,这两种方法都表现出相同的效果:似乎整个文件都被覆盖并且值没有合并,而仅从外部属性文件中加载。我的问题是,这是预期的行为还是我错过了某些东西?

编辑:使用jar测试了行为

0 个答案:

没有答案