maven中配置profile節點:
<project> .... <profiles> <profile> <!-- 生產環境 --> <id>prod</id> <properties> <profiles.active>prod</profiles.active> </properties> </profile> <profile> <!-- 本地開發環境 --> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <!-- 測試環境 --> <id>test</id> <properties> <profiles.active>test</profiles.active> </properties> </profile> </profiles> </project>
spring boot application.properties文件中引用maven profile節點的值:
spring.profiles.active=@profiles.active@
http://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/
非spring boot 項目中配置
http://www.itwendao.com/article/detail/85631.html
http://zilongsky-gmail-com.iteye.com/blog/2032001
http://dolszewski.com/spring/spring-boot-properties-per-maven-profile/
1.概述
按照項目開發的流程,項目工程需要經歷開發人員本地測試環境(dev),進入測試階段后有測試環境(test),測試無誤后需要將程序發布到生產環境(production)下,而對於這三個不同的項目環境,應用程序要在該環境下運行,必須有不同的配置項,如開發和生產環境使用不同的數據庫地址,不同的線程池參數,因此需要對不同的項目環境進行不同的配置,為了簡化和規范這些參數配置,需要對其進行統一規范管理。
2.配置項管理
2.1三個環境
按照項目所處階段,分為
開發環境(dev)
該環境下的配置項只影響開發人員本地代碼配置,在項目初期代碼本地編寫調試時啟用,如可以設置更低的Log級別幫助開發人員查看更為詳細的log信息。
測試環境(test)
該環境配置影響整個團隊的測試環境。
正式生產環境(production)
程序最終發布后所需要的參數配置,該環境下的配置項修改將直接影響最終用戶的使用和應用程序的運行。
系統的配置項統一放在src/main/filters/目錄下,三個環境的配置文件分別為
filter-dev.properties
filter-test.properties
filter-production.properties
這三個文件的用法見2.3.2節介紹
2.2識別配置項
開發人員在做日常需求時,需要對程序的配置項進行識別,嚴格禁止將變量寫死代碼的情況出現。下列情況下需要考慮將變量作為系統的配置項
1) 一些系統級參數、
數據庫連接參數,日志級別
2) 外部依賴webservice鏈接地址
對於不同的環境下所依賴的外部webservice也應該根據所處環境不同依賴不同的地址,如開發環境下依賴外部系統開發環境的地址。
3) 一些業務數據
系統可能要使用一些業務數據,如對某一個崗位信息特殊處理,該崗位信息在生產開發環境數據庫中的id不一致,這種情況下也需要將其作為配置項處理。
2.3Maven配置
項目工程統一使用maven的profile插件定義不同的項目構建環境(dev, test, production),通過filter插件為不同環境下的配置項注入對應的參數值來實現動態配置目標。
2.3.1定義profile
在POM.xml中配置3個profile,對應項目所處的3個不同的環境-dev, test, production, profile的id屬性即為每個環境賦予一個唯一的標示,<properties>元素的內容則是以key-value的形式出現的鍵值對,如我們定義了一個變量<env>,其值在不同的環境下(不同id)被賦予了不同的值(dev, production, test),要激活不同的環境打包,我們可以在命令行通過mvn package –P${profileId}來讓其運行,為了開發便利,默認激活的是dev開發環境,即開發人員不需要通過命令行手動輸入-p參數也能運行dev環境的打包。
<!-- 不同的打包環境 -->
<profiles>
<!-- 開發環境,默認激活 -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!--默認啟用的是dev環境配置-->
</activation>
</profile>
<!-- 生產環境 -->
<profile>
<id>production</id>
<properties>
<env>production</env>
</properties>
</profile>
<!-- 測試環境 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>
2.3.2定義filter(由filter插件完成此操作)
可以使用Maven來對項目資源進行變量替換。在資源過濾被激活的時候,Maven會掃描資源,尋找由${}包圍的Maven屬性的引用。
一旦它找到這些引用,它就會使用合適的值去替換它們,當需要根據目標部署平台使用不同的配置來參數化一個構建的時候,這就非常有用。
通常一個在src/main/resources目錄下的.properties文件或者XML文檔會包含對外部資源的引用,如需要根據目標部署平台進行不同配置的數據庫或網絡地址。
例如,一個從數據庫讀取數據的系統有一個XML文檔,其包含了數據庫的JDBC URL以及安全憑證。如果你在開發和產品環境使用不同的數據庫,使用Maven Profile來為不同的部署環境定義不同的配置。
Filter的配置(在<build>元素下添加節點)如下:
首先引入配置文件的地址,2.1節已經介紹過統一放在src/main/filters目錄下,注意這個filter的配置有個filter-${env}.properties,這個${env}變量就是在父pom.xml中定義的profile的id,
當通過命令行mvn package –P${profileId}時,按${env}變量就會用實際傳入的值替換,從而達到針對不同環境采用不同配置文件的目的。
<filters>
<filter>src/main/filters/filter-${env}.properties</filter>
</filters>
配置需要被替換的資源文件地址
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
如在src/main/resources/目錄下的env.properties文件的內容如下
### database connection configuration
jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
當執行完畢打包操作后,位於war包中的env.properties文件中所有被的${}都會被filters下文件中的值所替換。
http://blog.csdn.net/z69183787/article/details/48733331
http://blog.sina.com.cn/s/blog_6c969b4a0102wfks.html
由於項目的需要, 今天給spirng boot項目添加了profile功能。再網上搜索了一圈,也沒有找到滿意的參考資料,其實配置並不難,就是沒有一個one stop(一站式)講解的地方,所以有了寫這篇博客的想法。由於本人水平有限,文中任何錯誤和紕漏歡迎大家反饋。希望本文可以給你帶來幫助。
本文實現的目標:
1 使用了maven的profile功能
2 使用了Spring Boot的profile功能
3 集成了1和2的功能
4 在eclipse中運行mvn工程,使用開發環境的profile。
5 通過mvn在命令行中打包時,可以指定相應的profile。
什么是profile,解決什么問題呢?舉個例子。一般在開發項目的時候要有多個環境,如開發環境、測試環境、生產環境,他們的配置文件一般不同。當我們要向各個環境發布程序時,需要人工處理這些配置文件,這顯然麻煩且易錯。有了profile,一切問題就簡單了。只要在maven打包時使用下面命令即可。
- mvn clean package -Dmaven.test.skip=true -P prod
解釋一下, -P prod 就是告訴maven要使用名字為prod的profile來打包,即所有的配置文件都使用生產環境(prod是自己定義的,在這里自定義為生產環境)。
實現思路簡述:
maven支持profile功能,當使用maven profile打包時,可以打包指定目錄和指定文件,且可以修改文件中的變量。spring boot也支持profile功能,只要在application.properties文件中指定spring.profiles.active=xxx 即可,其中xxx是一個變量,當maven打包時,修改這個變量即可。
具體實現:
A段,介紹coolpro工程的配置。
這個工程只需要修改pom.xml文件即可,需要定義具體maven的profile。定義完畢之后,當我們使用mvn clean package -P dev 時,maven就知道了profileActive=dev這個屬性生效了。其中profileActive可以自己定義,就是一個maven的自定義屬性。
pom.xml文件如下:
B段,介紹coolpro-api工程的配置
這個工程是一個web工程,主要是想根據指定的profile配置相應的spring boot運行環境。如:如果profile是dev,配置web服務器的監聽端口為8010;profile為test,則端口為8020;profile為prod,則端口為8030。
工程中有4個文件:
application.properties, 包含通用配置的文件。文件中有spring.profiles.active=@profileActive@的屬性。spring boot的profile是通過spring.profiles.active屬性來配置的,這里的profileActive和上面coolpro工程中配置的profileActive屬性名要一致。這樣,在運行mvn命令時,maven就會幫我們將@profileActive@替換成指定的profile。
application-dev.properties, 當mvn -P dev時, 需要打包這個文件。
application-test.properties, 當mvn -P test時, 需要打包這個文件。
application-prod.properties, 當mvn -P prod時, 需要打包這個文件。
pom.xml配置:
application.properties文件:
其他3個文件見截圖:
C段,介紹coolpro-core工程的配置
配置完成了。看效果。
1 在Eclipse環境中,直接運行項目。
2 使用maven命令,打包這個應用。
1)以開發環境打包:mvn clean package -Dmaven.test.skip=true -P dev -e
結果如下:
查看api工程:
查看core工程:
以此類推, 可以運行
mvn clean package -Dmaven.test.skip=true -P test -e
mvn clean package -Dmaven.test.skip=true -P prod -e
注意兩點:
1 在屬性文件中替換變量時,使用@符合。
最開始,使用$符號,就是不能替換,在網上搜索一下,原來是maven的maven-resources-plugin可以定義這個替換的符號。通過eclipse提供的Maven Pom editor編輯器打開pom.xml文件,在“Effective POM”選項卡中,可以看到定義的是@這個符號。
2 怎么在啟動spring boot應用時,打印正在使用的profile,避免配置錯誤呢?可以參考如下代碼。
- public static void main(String[] args) {
- ApplicationContext ctx = SpringApplication.run(RestApiApplication.class, args);
- String[] activeProfiles = ctx.getEnvironment().getActiveProfiles();
- for (String profile : activeProfiles) {
- logger.warn("Spring Boot 使用profile為:{}" , profile);
- }
- }
參考:http://docs.spring.io/spring-boot/docs/current/reference/html/
http://www.tuicool.com/articles/NjqAF3
http://blog.csdn.net/jbgtwang/article/details/8642979
http://zilongsky-gmail-com.iteye.com/blog/2032001
http://www.huangyunkun.com/2015/01/01/run-code-after-spring-boot-started/
http://blog.csdn.net/lihe2008125/article/details/50443491