根据环境变量设置 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
的环境变量,它设置为它所在的环境类型,例如 local
或 someserver
(application-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 使用环境变量使用破折号/连字符配置属性