我有一个将在各种环境中运行的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
的名称{1}}文件与环境名称完全匹配)。
如何让spring boot读取此环境变量并自动选择正确的.properties
文件?我不想做整个-Dspring.profiles.active=someserver
,因为这个包的部署方式(它不会作为jar运行)。
答案 0 :(得分:14)
如何让spring boot读取这个环境变量 自动选择正确的.properties文件?
告诉Spring Boot从MYENV
属性或环境变量中选择 Active Profile 。一种方法是将以下内容添加到application.properties
:
spring.profiles.active=${MYENV}
这样Spring Boot会将spring.profiles.active
设置为MYENV
环境变量的值。
我不需要做整个-Dspring.profiles.active = someserver 因为这个包的部署方式(它不会像以前那样运行) 一个罐子)
如果您不想通过spring.profiles.active
参数传递系统属性,则可以将相应的环境变量用于-D
。相应的环境变量是SPRING_PROFILES_ACTIVE
。例如,如果您将SPRING_PROFILES_ACTIVE
设置为local
,则会激活local
个人资料。如果您坚持使用MYENV
环境变量,那么第一个解决方案就是可行的方法。
答案 1 :(得分:0)
如果要将该应用程序部署到某个容器(tomcat,weblogic,...),则可以指定环境变量。例如,让我们指定环境变量application1.spring.profiles.active=someserver
,然后在你的application.properties中设置属性spring.profiles.active=${application1.spring.profiles.active}
答案 2 :(得分: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启动 - 我相信这也适用于Spring 4.1
这是我相信我的AWS Lambda的最佳解决方案 - 具有最小的依赖性