2016-07-12 56 views
9

我有一個Spring Boot應用程序,它可以在各種環境中運行,並且基於它運行的環境,它將連接到不同的數據庫。我有幾個application.properties文件,一個爲每個環境看起來像這樣:基於環境變量設置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文件?由於這個軟件包被部署的方式(它不會像jar一樣運行),所以我不想做整個-Dspring.profiles.active=someserver

回答

12

如何獲得spring boot來讀取這個環境變量,並且 自動選擇正確的.properties文件?

告訴春季啓動從MYENV財產或環境變量選擇活動檔案。這樣做的一個方法是添加以下到您的application.properties

spring.profiles.active=${MYENV} 

這樣春天啓動將設置spring.profiles.activeMYENV環境變量的值。

我不有做全-Dspring.profiles.active = someserver 的,因爲這個包是部署方式(它不會被運行的 一個罐子)

如果您不想通過-D參數傳遞系統屬性,則可以使用相應的環境變量spring.profiles.active。相應的環境變量是SPRING_PROFILES_ACTIVE。例如,如果您將SPRING_PROFILES_ACTIVE設置爲local,則local配置文件將被激活。如果您堅持使用MYENV環境變量,則第一個解決方案就是要走的路。

+0

是否有可能使在環境變量不匹配任何文件,選擇標準有一個「默認」的配置? –

+7

'spring.profiles.active = $ {MYENV:defaultValue}' –

+0

另外,將默認配置和通用配置放入'application.properties'中。它總是會被使用,但在配置文件特定配置的優先級較低 –

0

如果您將該應用程序部署到某個容器(tomcat,weblogic,...),則可以指定環境變量。例如,讓我們指定環境變量application1.spring.profiles.active=someserver,然後在你的application.properties中設置屬性spring.profiles.active=${application1.spring.profiles.active}

0

使用Spring上下文5。0我已經成功地實現通過以下標註

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

這裏MYENV值從系統環境看,如果系統環境不存在,那麼默認的測試環境屬性文件將被加載,如果加載基於系統環境的正確的屬性文件我給出了錯誤的MYENV值 - 它將無法啓動應用程序。

注:每個配置文件,你要保持你需要的應用程序 - [資料] .property文件,雖然我使用Spring上下文5.0 &不是Spring啓動 - 我相信這也將在春季4.1工作

這是我相信我的AWS LAMBDA的最佳解決方案 - 用最小的相關