根据环境变量设置 Spring Boot application.properties

Posted

技术标签:

【中文标题】根据环境变量设置 Spring Boot application.properties【英文标题】:Set Spring Boot application.properties based on Environment Variable 【发布时间】:2016-11-15 03:50:48 【问题描述】:

我有一个 Spring Boot 应用程序,它将在各种环境中运行,并且根据它运行的环境,它将连接到不同的数据库。我有几个application.properties 文件,每个环境一个,看起来像这样:

application-local.properties:

spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=dbuser
spring.datasource.password=123456789

application-someserver.properties:

spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://someserver:5432/myproddb
spring.datasource.username=produser
spring.datasource.password=productionpass

等等。等等

在我的每个环境中,我都有一个名为 MYENV 的环境变量,它设置为它所在的环境类型,例如 localsomeserverapplication-env.properties 文件的名称与环境名称)。

如何让 spring boot 读取此环境变量并自动选择正确的.properties 文件?我不想做整个-Dspring.profiles.active=someserver 因为这个包的部署方式(它不会作为一个jar 运行)。

【问题讨论】:

Using env variable in Spring Boot's application.properties的可能重复 【参考方案1】:

我怎样才能让 spring boot 读取这个环境变量和 自动选择正确的 .properties 文件?

告诉 Spring Boot 从 MYENV 属性或环境变量中选择 Active Profile。一种方法是将以下内容添加到您的application.properties

spring.profiles.active=$MYENV

这样Spring Boot会将spring.profiles.active设置为MYENV环境变量的值。

我不必做整个 -Dspring.profiles.active=someserver 由于这个包的部署方式(它不会以 一个罐子)

如果您不喜欢通过-D 参数传递系统属性,可以使用spring.profiles.active 对应的环境变量。对应的环境变量是SPRING_PROFILES_ACTIVE。例如,如果您将SPRING_PROFILES_ACTIVE 设置为local,则local 配置文件将被激活。如果您坚持使用MYENV 环境变量,第一个解决方案就是要走的路。

【讨论】:

是否可以有一个“默认”配置,以便在 env 变量中不匹配任何文件,选择一个标准? 另外,将默认和常用配置放入application.properties。它总是会被使用,但在配置文件特定配置方面的优先级较低 @AliDehghani 我在我的系统变量中设置了值,但 application.properties 没有选择它。变量名:user 值:pass。在我的 app.properties spring.datasource.username= $user 这是否可能在 Spring 上下文中而不是在 Spring Boot 中......我还需要将属性保留在 application.properties 文件中,然后使用活动配置文件覆盖属性吗? - 或者如果我没有将基于 ebvironment 的属性放在 application.properties 中,而只是放在它的 [profile].properties 文件中 我想要最小的依赖——因为我正在为 AWS Lambda 编码——谢谢【参考方案2】:

如果您将该应用程序部署到某个容器(tomcat、weblogic...),您可以指定环境变量。例如,让我们指定环境变量application1.spring.profiles.active=someserver,然后在您的 application.properties 中设置属性spring.profiles.active=$application1.spring.profiles.active

【讨论】:

【参考方案3】:

使用 Spring context 5.0 我已经通过以下注释成功实现了基于系统环境加载正确的属性文件

@PropertySources(
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-$MYENV:test.properties"))

这里 MYENV 值是从系统环境中读取的,如果系统环境不存在,则将加载默认的测试环境属性文件,如果我提供了错误的 MYENV 值 - 它将无法启动应用程序。

注意:对于每个配置文件,您想要维护您需要创建一个 application-[profile].property 文件,虽然我使用 Spring context 5.0 & 不是 Spring boot - 我相信这也会在 Spring 4.1 上工作

这是我认为对我的 AWS Lambda 来说最好的解决方案 - 依赖最少

【讨论】:

以上是关于根据环境变量设置 Spring Boot application.properties的主要内容,如果未能解决你的问题,请参考以下文章

如何通过环境变量设置名称中带有下划线的 Spring Boot 属性?

Spring Boot application.yaml中多个默认环境变量的语法

Spring-boot 使用环境变量使用破折号/连字符配置属性

通过环境变量在 Spring Boot 中设置日志记录级别

使用 vs 代码在 Spring Boot 中设置 GCP 环境变量

vs code 配置spring boot开发环境