基于环境变量设置Spring Boot应用程序属性文件

15

我有一个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:

应用程序-someserver配置文件。
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文件?由于这个软件包的部署方式(它不会作为jar运行),我不想做整个-Dspring.profiles.active=someserver的操作。


3个回答

17

如何让Spring Boot读取环境变量并自动选择正确的.properties文件?

告诉Spring Boot从MYENV属性或环境变量中选择活动配置文件的方式之一是将以下内容添加到您的application.properties文件中:

spring.profiles.active=${MYENV}

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

由于此软件包的部署方式(不作为jar运行),我不想执行整个-Dspring.profiles.active=someserver的操作。

如果您不想通过-D参数传递系统属性,可以使用相应的环境变量来代替spring.profiles.active。该相应的环境变量是SPRING_PROFILES_ACTIVE。例如,如果您将SPRING_PROFILES_ACTIVE设置为local,则会激活local配置文件。如果您坚持使用MYENV环境变量,则应使用第一种解决方案。


2
是否有可能设置“默认”配置,以便当环境变量不匹配任何文件时,选择一个标准的配置? - Tanishq dubey
另外,将默认配置和常规配置放入 application.properties 文件中。它们始终会被使用,但是相对于特定配置文件而言,优先级较低。 - Ali Dehghani
@AliDehghani 我在系统变量中设置了值,但是application.properties没有捕获到它。变量名称:user 值:pass。在我的app.properties中,spring.datasource.username= ${user}。 - JayC
在Spring上下文中是否可能实现,而不是在Spring Boot中...还需要将属性保留在application.properties文件中,然后使用活跃的配置文件覆盖属性吗?-还是如果我不将基于环境的属性放入application.properties文件中,而只是放在其[profile].properties文件中? - Abdeali Chandanwala
我想要最小的依赖关系 - 因为我正在为 AWS Lambda 编码 - 谢谢 - Abdeali Chandanwala

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

0

使用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的最佳解决方案 - 最小依赖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接