我很难尝试用在文件系统上的覆盖文件中声明的另一个值覆盖在类路径中的特定于配置文件的应用程序属性文件中声明的属性。
我有一个自动配置的Spring-boot应用程序(即使用@EnableAutoconfiguration
),该应用程序具有多个配置文件,我使用PropertiesLauncher
而不是JarLauncher
(与部署约束有关的原因)启动了该配置文件-我需要将展开的目录而不是存档部署到只读文件系统。)
在应用程序的根目录中,我具有一些特定于配置文件的应用程序属性,例如:
application-dev.properties
application-qa.properties
application-prd.properties
并说,为了application-dev.properties
包含以下参数:
foo.bar=baz
foo.baz=other
对于任何环境,都可能有必要覆盖现有属性,并提供一个不存在的属性(例如,生产密码),而我看到的问题是覆盖了已在application-${profile}.properties
类路径上的文件中声明的覆盖属性。(提供类路径文件中不存在的属性很好,这不是问题。)
假设我在文件系统位置中有一个覆盖属性文件,例如:
/local/appname/dev/overrides/application.properties
我想覆盖该属性,foo.bar
并声明一个新属性foo.password
。
因此,替代文件的内容为:
foo.bar=overridden-value
foo.password=something
启动应用程序时,我使用如下命令行:
java -Dspring.config.location=file:/local/appname/dev/overrides/
-Dspring.profiles.active=dev
org.springframework.boot.loader.PropertiesLauncher
--debug &
我看到的问题是,虽然foo.password
,该财产不中声明application-dev.properties
文件中回升,的覆盖foo.bar
被忽略-我仍然看不到价值,baz
从application-dev.properties
而不是值,overridden-value
从/local/appname/dev/overrides/application.properties
。
--debug
启用该选项后,我可以看到ConfigFileApplicationListener
它已按顺序加载了覆盖文件(来自文件系统)和特定于配置文件的文件(来自类路径)的日志记录。
我很想得出一个天真的结论,因为覆盖文件首先列出,因此它首先被加载,然后被类路径中特定于配置文件的“默认”文件覆盖,该文件随后列出。但是,我确实很欣赏,日志中的列出顺序不一定与行为相关。而且我尝试过更改spring.config.location
属性上声明的路径的顺序,因此上面classpath:
列出了该顺序,file:...
但这并没有帮助,并且我也不相信这样做,因为Spring-boot文档明确指出了默认属性位置是即使您提供的值,也始终会搜索spring.config.location
。
Spring-boot文档非常详细地说明了按优先级从高到低的顺序解析属性的顺序。
System.getProperties()
)。java:comp/env
RandomValuePropertySource
中仅具有属性的random.*
。application.properties
包括YAML和配置文件变体)。application.properties
包括YAML和配置文件变体)。@PropertySource
@Configuration
类上的注释。SpringApplication.setDefaultProperties
)。注意第6行和第7行- 罐子内部的属性之外的属性。
据我所知,未声明的内容(可能是我的困惑/问题的根源)是当您不使用JAR而是展开目录(因此使用)时发生的情况PropertiesLauncher
。
如果爆炸目录的行为与JAR声明的行为一致,那么我希望在中声明的属性的值/local/appname/dev/overrides/application.properties
将覆盖在中声明的任何同名名称classpath:application-dev.properties
,但事实并非如此。
在Spring-boot文档(附录C.4 PropertiesLauncher
)上还提到了该loader.home
属性,该属性被描述为“ ... [。]其他属性文件的位置,例如 /opt/app
(默认为${user.dir}
)”。
因此,我尝试使用loader.home
代替spring.config.location
,但无济于事。
(更新:我使用也试着loader.config.location
和我有两个注意事项:它似乎是想建立一个文件,而不是一个目录(所以它的行为是不相似的带spring.config.location
),当我做还是提供文件路径,而不是父目录,它没没有帮助。)
谁能发现我做错了什么,或者我做错了什么假设?
谢谢,戴夫,您的建议是100%正确的。
如果我将属性文件重命名为/local/appname/dev/overrides
,application-dev.properties
则该文件中的属性值会覆盖中的属性值classpath:application-dev.properties
。
我确定昨天已经尝试过这种组合,但是我认为必须停止该组合的工作是在我尝试指定spring.config.location
且出现错误时,因此它没有在正确的位置查找替代文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句