使用maven profile實現多環境可移植構建

源自:http://blog.csdn.net/mhmyqn/article/details/24501281

在開發過程中,我們的軟件會面對不同的運行環境,比如開發環境、測試環境、生產環境,而我們的軟件在不同的環境中,有的配置可能會不一樣,比如數據源配置、日誌文件配置、以及一些軟件運行過程中的基本配置,那每次我們將軟件部署到不同的環境時,都需要修改相應的配置文件,這樣來回修改,是個很麻煩的事情。有沒有一種方法能夠讓我們不用修改配置就能發佈到不同的環境中呢?當然有,這就是接下來要做的事。

當然,這裏的前提是使用maven做爲構建工具。

使用maven來實現多環境的構建可移植性,需要藉助maven提供的profile功能,通過不同的環境激活不同的profile來達到構建的可移植性。

一、配置profile

首先是profile配置,在pom.xml中添加如下profile的配置:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <profiles>  
  2.     <profile>  
  3.         <!-- 本地開發環境 -->  
  4.         <id>development</id>  
  5.         <properties>  
  6.             <profiles.active>development</profiles.active>  
  7.             <deploy.url>http://host:port/manager/text</deploy.url>  
  8.         </properties>  
  9.         <activation>  
  10.             <activeByDefault>true</activeByDefault>  
  11.         </activation>  
  12.     </profile>  
  13.     <profile>  
  14.         <!-- 測試環境 -->  
  15.         <id>test</id>  
  16.         <properties>  
  17.             <profiles.active>test</profiles.active>  
  18.             <deploy.url>http://host:port/manager/text</deploy.url>  
  19.         </properties>  
  20.     </profile>  
  21.     <profile>  
  22.         <!-- 生產環境 -->  
  23.         <id>production</id>  
  24.         <properties>  
  25.             <profiles.active>production</profiles.active>  
  26.             <deploy.url>http://host:port/manager/text</deploy.url>  
  27.         </properties>  
  28.     </profile>  
  29. </profiles>  

這裏定義了三個環境,分別是development(開發環境)、test(測試環境)、production(生產環境),其中開發環境是默認激活的(activeByDefault爲true),這樣如果在不指定profile時默認是開發環境。

同時每個profile還定義了兩個屬性,其中profiles.active表示被激活的profile的名稱,deploy.url表示發佈服務器的地址。我們需要在下面使用到這兩個屬性。

另外host和port分別是發佈服務器的主機地址和端口號。

 

二、配置文件

針對不同的環境,我們定義不同的配置文件,而這些配置文件都做爲資源文件放到maven工程的resources目錄下,即src/main/resources目錄下,且各個環境的配置分別放到相應的目錄下,而所有環境都公用的配置,直接放到src/main/resources目錄下即可。如下圖所示:

如圖所示,開發環境、測試環境、生產環境的配置文件分別放到src/main/resources目錄下的development、test、production三個子目錄中,而所有環境都公用的配置文件spring-applicationContext.xml直接放到src/main/resources目錄下。其中jdbc.properties配置數據源、logback.xml配置日誌。

 

三、maven資源插件配置

在pom中的build節點下,配置資源文件的位置,如下所示:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <build>  
  2.     <resources>  
  3.         <resource>  
  4.             <directory>src/main/resources</directory>  
  5.             <!-- 資源根目錄排除各環境的配置,使用單獨的資源目錄來指定 -->  
  6.             <excludes>  
  7.                 <exclude>test/*</exclude>  
  8.                 <exclude>production/*</exclude>  
  9.                 <exclude>development/*</exclude>  
  10.             </excludes>  
  11.         </resource>  
  12.         <resource>  
  13.             <directory>src/main/resources/${profiles.active}</directory>  
  14.         </resource>  
  15.     </resources>  
  16. </build>  

首先第一個資源文件位置src/main/resources需要排隊提各個環境的配置文件,各個環境的配置我們在第二個<resource>節點中通過前面在profile中配置的profiles.active屬性來指定。即src/main/resources/${profiles.active}。這樣在激活指定的profile時,會加載指定目錄下的配置文件,如當前激活的是production profile,那麼這個資源目錄就是src/main/resources/production。這樣就達到了不同環境加載不同配置的目的。

 

四、配置tomcat-maven-plugin插件

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <plugin>  
  2.     <groupId>org.codehaus.mojo</groupId>  
  3.     <artifactId>tomcat-maven-plugin</artifactId>  
  4.     <version>1.2-SNAPSHOT</version>  
  5.     <configuration>  
  6.         <url>${deploy.url}</url>  
  7.         <server>tomcat</server>  
  8.         <path>/appcontext</path>  
  9.     </configuration>  
  10. </plugin>  

其中發佈的<url>節點就是在前面profile中配置的deploy.url屬性,這樣不同的環境就指定了不同的發佈地址。<server>和<path>節點分別是發佈服務器的用戶配置的id以及應用的context名稱。

 

五、構建或發佈

所有需要的配置就完成了,下面是見證奇蹟的時候了。通過在運行maven命令時指定不同的profile即可構建不同環境需要的war包或發佈到不同的環境了 。如:

mvn clean package -Pproduction即構建出生產環境需要的war包

mvn tomcat:redeploy -Ptest 即發佈到測試環境

 

由於默認的profile是development,所以如果我們不指定profile,那麼加載就是開發環境deployment下的配置文件了。即我們在本地開發測試時,不用關心profile的問題。

而且本地開發時在eclipse中使用tomcat插件來進行熱部署時也不需要額外的配置。真正的做到了根據不同環境來自動切換,即可移植的構建。


另外,在進行持續集成時,使用hudson集成maven同樣是非常非常方便的。



2樓 gonedays 2016-01-20 18:26發表 [回覆]
博主貌似有個錯誤,<resources>這個節點及其內容,應該放在<build>節點裏面、<plugins>節點外面,博文中看上去好像放在了<plugins> 裏,會報錯。
Re: MikanMu 2016-01-20 21:52發表 [回覆]
回覆gonedays:感謝指出,已修改
1樓 lovelyfeng1987 2016-01-07 20:28發表 [回覆] [引用] [舉報]
樓主excludes目錄時要多加個星號
<excludes> 
<exclude>test/**</exclude> 
<exclude>production/**</exclude> 
<exclude>development/**</exclude> 
</excludes>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章