場景
在應用部署的時候,往往遇到需要發布到不同環境的情況,而每個環境的數據庫信息、密鑰信息等可能會存在差異。舉個例子,在Spring Boot中我們使用application.properties作為應用環境配置文件,那么不同環境下的配置可能有以下差異:
- ** dev(開發環境)**
spring.datasource.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl
spring.datasource.username=dev
spring.datasource.password=dev
- test(測試環境)
spring.datasource.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl
spring.datasource.username=test
spring.datasource.password=test
- prod(生產環境)
spring.datasource.url=jdbc:oracle:thin:@123.56.5.34:1521:orcl
spring.datasource.username=prod
spring.datasource.password=prod
那么如何在打包的時候較好處理環境信息呢?Maven提供了一種比較優雅的方案處理這類問題。
下面針對Spring Boot框架開發的應用對如何配置多環境信息進行說明。
配置步驟
1.在pom中設置Filters
Spring Boot在它的Parent Pom中使用了以下默認配置:
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.properties</include>
</includes>
</resource>
</resources>
(在Maven的Resource插件中,默認的filtering配置為false,此外Spring Boot默認為true)
上面配置的意思為滿足/application.yml,/application.properties**兩個正則表達式的所有文件都會進行過濾處理,且當filtering為true時過濾處理才生效,什么是過濾處理,請看下面步驟。
在pom文件的build標簽下配置filters如下:
<build>
<filters>
<filter>${basedir}/filters/application-dev.properties</filter>
</filters>
</build>
filter里面內容的意思為:
假如src/main/resources/application.properties的內容為:
spring.datasource.url=@spring.datasource.url@
spring.datasource.username=@spring.datasource.username@
spring.datasource.password=@spring.datasource.password@
maven會在filters/application-dev.properties提取這些參數的值,假如application-${env}.properties的內容為:
spring.datasource.url=jdbc:oracle:thin:@192.168.0.1:1521:orcl
spring.datasource.username=dev
spring.datasource.password=dev
當我們使用mvn package命令打包后,原來位置WEB-INF/classes下的application.properties中的值會被替換成application-dev.properties里面的內容。
2.配置profile(可選)
步驟1中的${env}參數,等價于pom下的profile id
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profiles>
當我們使用mvn package -Ptest
命令打包應用時,系統會將application-test.properties的參數值復制到src/main/resources/application.properties中;
同理當我們使用mvn package -Pdev
命令時,系統會將application-dev.properties的參數值復制到src/main/resources/application.properties中。
其他說明
- 根據網上的資料application.properties中的參數寫法為 ${param}
但在Spring Boot 1.3.0.RELEASE中必須使用格式 @param@才能生效
詳見:
https://github.com/spring-projects/spring-boot/issues/980,
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-use-short-command-line-arguments
2.除了使用${env}環境變量,還可以使用其他方法傳遞參數
- 通過mvn package -Dcustom=dev命令傳入${custom}的參數值
- 通過pom中的
<properties>
屬性定義參數值
3.除了在parent的pom.xml里面根據profile設置運行參數外,maven還支持在parent的pom.xml或 module的pom.xml設置profile,使得在某一種條件下激活一個profile并執行自定義的步驟:
<profile>
<id>webdev</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>deploy.mode</name>
<value>dev</value>
</property>
</activation>
<build>
</build>
</profile>
意思為,當打包的mvn命令中含有deploy.mode參數,且參數值為dev時,激活這個profile。
例:mvn package -Ddeploy.mode=dev