Spring Boot应用程序中的环境特定application.properties文件[关闭]
Posted
技术标签:
【中文标题】Spring Boot应用程序中的环境特定application.properties文件[关闭]【英文标题】:Environment Specific application.properties file in Spring Boot application [closed] 【发布时间】:2015-11-18 17:05:08 【问题描述】:在我的 Spring Boot 应用程序中,我想创建特定于环境的属性文件。我的应用程序在战争中的包装类型,我在嵌入式 tomcat 中执行它。我使用 sts 并从 sts 本身执行 main。
-
我可以拥有特定于环境的属性文件,例如 application-$env-value.properties?
在上述情况下,env-value 的值为 local/devl/test/prod
在哪里设置 env-value 文件?对于本地,我可以通过 sts 将其设置为 jvm 参数
谁在 Spring Boot 应用程序中读取 application.properties。
如何加载环境特定的属性文件?例如 - 如果我在环境特定的属性文件中设置数据库 uid、pwd、模式等,在这种情况下,数据源是否能够理解其中的属性?
我可以同时使用 application.properties 和 application-local.properties 文件吗?
【问题讨论】:
你读过this吗?它基本上是开箱即用的。 我做到了,但这不起作用。所以我在同一位置有 application.properties 文件和 application-local.properties 文件。 application-local.properties 文件包含 db 相关属性。 application.properties 中有一个关于 spring mvc 的属性。我还添加了 -Dprofile=local 作为调试配置,但是这个值没有被拾取 因为需要设置spring.active.profiles
所以使用-Dspring.active.profiles=local
。而是。
没有成功,先生。所以我现在使用的是-Dspring.active.profiles=local,而不是-Dprofile。然后在我的配置文件中,我尝试获取值 String driverClassName = env.getProperty("driverClassName"); env 是春天的环境
对不起,我把它弄混了:)。
【参考方案1】:
我的观点,以这种方式要求开发人员一次性创建所有相关的环境,从而导致将生产配置暴露给最终开发人员的风险
根据 12-Factor,不应该是特定于环境的仅驻留在环境中。
CI CD 我们如何做
一次构建 Spring 并提升到另一个环境,在这种情况下,如果我们有 spring jar 具有所有环境,它会存在安全风险,在 GIT 中具有所有环境变量【讨论】:
【参考方案2】:是的,你可以。由于您使用的是spring,请查看@PropertySource
注解。
使用注释您的配置
@PropertySource("application-$spring.profiles.active.properties")
您可以随意调用它,如果您也喜欢,可以添加多个 inn 属性文件。如果您有更多属于所有环境的集合和/或默认值(也可以使用 @PropertySource...,...,... 编写),那就太好了。
@PropertySources(
@PropertySource("application-$spring.profiles.active.properties"),
@PropertySource("my-special-$spring.profiles.active.properties"),
@PropertySource("overridden.properties"))
然后就可以使用环境启动应用了
-Dspring.active.profiles=test
在此示例中,名称将替换为 application-test-properties 等。
【讨论】:
问题是$spring.profiles.active
是一个数组/逗号分隔的字符串。因此,当有多个配置文件处于活动状态时,它可能不会按照您的预期/希望执行。
确实如此,但适用于两种配置文件 - 一种是默认配置,另一种是使用 PropertySource 定义的。对于更高级的属性处理,我认为您将不得不在 Spring 之外寻找。此外,PropertySource 仅在启动期间读取。其他更高级的属性处理库也可以更改属性运行时。
这行得通,但我仍然不明白为什么我必须手动执行此操作。在我的另一个存储库中,我不必这样做。【参考方案3】:
我们可以这样做:
在application.yml中:
spring:
profiles:
active: test //modify here to switch between environments
include: application-$spring.profiles.active.yml
在application-test.yml中:
server:
port: 5000
在application-local.yml中:
server:
address: 0.0.0.0
port: 8080
然后 spring boot 将按照我们的意愿启动我们的应用程序。
【讨论】:
你不是这样硬编码活动配置文件吗? :(【参考方案4】:Spring Boot 已经 has support 用于基于 profile 的属性。
只需添加一个application-[profile].properties
文件并使用spring.profiles.active
属性指定要使用的配置文件。
-Dspring.profiles.active=local
这将加载application.properties
和application-local.properties
,后者覆盖第一个属性。
【讨论】:
我们可以用另一个文件覆盖应用程序属性的使用,而不加载它们吗?例如用于测试或开发? M. Deinum,我也有类似的问题,我有 application.yml 和 application-qa.yml,我给了 -Dspring.profiles.active=qa,这两个文件都在被读取,但是 application-qa.yml 的属性没有覆盖来自的属性application.yml,我总是只看到来自 application.yml 的属性?有没有办法指定优先级? 您好,这可以解决您的问题。 docs.spring.io/spring-boot/docs/current/reference/html/… 示例:mkyong.com/spring-boot/… 我正在为 aws lambda 编写代码,并且可以将此 key=value 作为环境值传递 - 可以使用 System.getenv() 访问 - 它会工作吗? 我有 4 个 application-profile.properties 文件。我想在不同的环境中运行相同的 jar 文件,比如 dev、test、prod。所以我不能使用-Dspring.profiles.active=local。如果我遗漏了什么,请纠正我。以上是关于Spring Boot应用程序中的环境特定application.properties文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
spring boot 外部配置 - profile 特定配置