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.propertiesapplication-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文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Docker 中的 Spring Boot

spring boot开发环境搭建

spring boot 外部配置 - profile 特定配置

dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序

依赖于配置文件特定属性的 Spring Boot 属性

如何在spring boot中实现用户级别的特定授权?