【发布时间】:2017-01-24 01:22:17
【问题描述】:
我们有一个基础项目example-platform 和一个扩展客户项目example-customer1,它使用平台作为依赖项。平台的 application.properties 定义了默认属性,客户项目将覆盖这些属性。例如,平台可以独立运行,因此它使用的数据库有一个spring.datasource.url,而客户项目使用另一个。
最初,我希望这可以通过在客户项目中使用更改必要属性的 application.properties 来完成,但相反,只使用该文件中的属性而不是平台的 application.properties 中的任何内容.起初我只是复制了 application.properties 文件并更改了一些属性,但我不喜欢在平台需要新属性时必须更新客户项目的想法。为了解决这个问题,我将客户项目的 application.properties 放入 config/application.properties。这样我就可以拥有来自平台的属性,并且只覆盖我在客户项目中需要的那些。
现在我需要能够在将其部署为与 Tomcat 的战争时覆盖这些属性。也就是说,我需要 example-platform / application.properties 中的属性被 example-customer1 / config / application.properties 覆盖,以便被 Tomcat 的某些 application.properties 覆盖。
在我将 application.properties 放入客户项目的 config 文件夹之前,我能够在 Tomcat 上的 props/config 下拥有一个 application.properties,并从中加载属性。现在客户插件的 application.properties 位于 /config 下,但是,我认为正在使用它而不是 Tomcat 上的属性。
完成这种属性层次结构的最优雅的“Spring”方式是什么?
编辑:为了澄清我想要什么,假设我们有一个属性appName。在 example-platform/application.properties 中,我将拥有 appName=platform-app,在 example-customer1/application.properties 的 application.properties 中,appName=customer-app。然后在 Tomcat 中,我希望有一个 application.properties 能够再次覆盖它,因此对于一个部署,它可能是appName=cusomter-app-deployment1。
【问题讨论】:
-
这个问题有点不清楚,但听起来像是“使用环境变量或系统属性”。
-
@chrylis,这是一种选择,但将它放在 application.properties 文件中会更好。我会更新问题以使其更清楚
-
你看过 Spring 的关于属性覆盖优先级的文档吗?这可能就是您正在寻找的。span>
标签: java spring spring-mvc tomcat spring-boot