Maven Profile和Spring Proflie
一個優秀的構建系統必須足夠靈活,它應該能讓專案在不同的環境下都能成功地構建。Maven為了支援構建的靈活性,內建了三大特性,即屬性、Profile和資源過濾。這裡我們只介紹Profile的使用,以及和Spring Profile的整合。
1、Maven Profile
典型的專案一般都會有開發環境、測試環境以及生產環境,在不同的環境中,專案的原始碼應該使用不同的方式進行構建,這就要求專案構建的時候需要識別所在環境並使用正確的配置。為了能讓構建在各個環境下方便的移植,Maven引入了profile的概念,profile可以讓我們定義一系列的配置資訊,然後指定其啟用條件。這樣我們就可以定義多個profile,然後每個profile對應不同的啟用條件和配置資訊,從而達到不同環境使用不同配置資訊的效果。
1.1 profile的種類
根據具體需要,可以在以下位置宣告profile:
- pom.xml: 很顯然,pom.xml中宣告的profile只對當前專案有效。
- 使用者settings.xml: 使用者目錄下 .m2/settings.xml中的profile對本機上該使用者所有的Maven專案有效。
- 全域性settings.xml: Maven安裝目錄下conf/setting.xml中的profile對本機中上所有的Maven專案有效。
- profiles.xml(Maven2): 還可以在專案根目錄下使用一個額外的profiles.xml檔案來宣告profile,不過該特性已經在Maven3中被移除。建議使用者將這類profile移到settings.xml中。
使用最多的兩種方式是使用者settings.xml和pom.xml方式,下面簡要說明下不同位置的profile可使用的元素種類:
POM中的profile可使用的元素,
<project> <repositories></repositories> <pluginRepositories></pluginRepositories> <distributionManagement></distributionManagement> <dependencies></dependencies> <dependencyManagement></dependencyManagement> <modules></modules> <properties></properties> <reporting></reporting> <build> <plugins></plugins> <defaultGoal></defaultGoal> <resources></resources> <testResources></testResources> <finalName></finalName> </build> </project>
POM外部的profile可使用元素,
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<properties></properties>
</project>
1.2 啟用方式
1.2.1 預設啟用方式
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
...
</profile>
</profiles>
如果POM中任何一個profile通過其他方式啟用誒激活了,這個預設配置就會失效。
1.2.2 命令列啟用
可以使用mvn命令列引數-P加上profile的id來啟用profile,多個id之間以逗號分隔。
$mvn clean install -Pdev
1.2.3 settings檔案顯示啟用
如果希望某個profile一直處於啟用狀態,就可以配置settings.xml檔案的activeProfiles元素。
<settings>
...
<activeProfiles>
<actvieProfile>dev</activeProfile>
</activeProfiles>
...
</settings>
1.2.4 系統屬性啟用
使用者可以配置當某系統屬性存在的時候,自動啟用profile。然後在命令列宣告系統屬性:$mvn clean install -Dtest
,這種方式和第2種很像,而且多個profile可以使用同一個系統屬性來啟用。
<profiles>
<profile>
<activation>
<property>
<name>test</name>
</property>
</activation>
...
</profile>
</profiles>
1.2.5 作業系統環境啟用
Profile可以自動根據作業系統環境啟用。這裡的family的值包括Windows、UNIX和Mac等,而其他幾項name、arch、version,使用者可以通過檢視環境中的系統屬性os.name、os.arch、os.version獲得。
<profiles>
<proflie>
<activation>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
...
</activation>
</profile>
</profiles>
1.2.6 檔案存在與否啟用
Maven能夠根據專案中某個檔案存在與否來決定是否啟用profile.
<profiles>
<profile>
<activation>
<file>
<missing>x.properties</missing>
<exists>y.properties</exists>
</file>
</activation>
...
</profile>
</profiles>
1.3 示例
在開發的過程中,我們一般會正在src/main/resource目錄下放置配置檔案xxx.xml或者xxx.properties。下面以資料庫的配置為例來說明profile的使用方式,假設配置檔案中有如下資料庫配置:
database.jdbc.driverclass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://localhost:3306/test
database.jdbc.username=dev
database.jdbc.passowrd=dev-pwd
如果只是在一個環境中使用就沒有什麼問題,但是當測試人員想要構建專案進行測試,或者部署上線到生產環境,往往這些環境的資訊是不同的,這就需要修改這個配置檔案了。將這些配置引數提取到profile中:
database.jdbc.driverclass=${db.driver}
database.jdbc.connectionURL=${db.url}
database.jdbc.username=${db.username}
database.jdbc.passowrd=${db.password}
pom.xml檔案中新增prfile:
<profiles>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://localhost:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
</properties>
</profile>
<profile>
<id>deploy</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://localhost:3306/deploy</db.url>
<db.username>deploy</db.username>
<db.password>deploy-pwd</db.password>
</properties>
</profile>
</profiles>
有了屬性定義,配置檔案中也有了這些屬性。但是Maven屬性預設只有在POM中才會被解析,放在src/main/resources/
下並不會被解析。因此需要藉助maven-resource-plugin
外掛來為資源目錄開啟過濾,這樣Maven就能解析資原始檔中的Maven屬性了。
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
Maven允許使用者宣告多個資源目錄,並且為每個資源目錄提供不同的過濾配置。最後,只需要在命令列啟用profile,Maven就能夠在構建專案的的時候使用profile中屬性值替換資料庫配置檔案中的屬性引用。執行命令列如下:
$mvn clean install -Pdev
2、Spring Profile
Spring profile是Spring 3.1引入的概念,通過定義profile
來將若干不同的bean
定義組織起來,從而實現不同環境自動啟用不同的profile
來切換配置引數的功能。
在實際專案的開發過程中,開發環境一般使用專案中自帶檔案,而在部署生產環境的時候使用指定目錄下的配置檔案,下面就以配置檔案切換為例來說明profile的使用方法:
2.1 在applicationContext.xml裡定義profile
<!-- dev環境 -->
<beans profile="dev">
<context:property-placeholder ignore-resource-not-found="true" location="classpath:config/xxxx.properties" />
....
</beans>
<!-- deploy環境 -->
<beans profile="deploy">
<context:property-placeholder ignore-resource-not-found="true" location="file:D:\xx\xxx\xxxx.properties"/>
....
</beans>
或者:
<context:property-placeholder system-properties-mode="OVERRIDE" file-encoding="UTF-8" properties-ref="configProperties" />
<beans profile="dev">
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:config/xxxx.properties</value>
</list>
</property>
</bean>
</beans>
<beans profile="deploy">
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>file:D:\xx\xxx\xxxx.properties</value>
</list>
</property>
</bean>
</beans>
2.2 在web.xml定義預設profile
預設profile
是指在沒有任何profile
被啟用的情況下,預設profile
內定義的內容將被使用。
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
2.3 啟用profile
spring為我們提供了大量的啟用profile
的方法,可以通過程式碼來啟用,也可以通過系統環境變數、JVM引數、servlet上下文引數來定義spring.profiles.active
引數啟用profile
,這裡我們通過定義servlet上下文引數引數實現。
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>${profiles.activation}</param-value>
</context-param>
其中,${profiles.activation}
需要在實際執行專案的時候指定環境變數,這樣既可以做到不同的環境下切換不同的配置檔案,也可以直接設定具體值,這樣可以省去2.4節的環境屬性設定。
2.4 執行專案
這裡以jetty伺服器做介紹,如果使用maven內建jetty外掛啟動,我們需要在pom中定義環境屬性,如下圖:
如果是使用eclipse jetty外掛啟動,我們需要在伺服器配置中增加環境變數,如下圖:
3、Maven整合Spring profile
實際專案中我們大多以Maven來管理專案,所以這一部分來介紹如何在Maven中整合Spring profile。
1.3節的示例已經介紹了在maven的pom檔案中如何增加profile,並且指定了預設的啟用profile,現在我們將其改為
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profiles.activation>dev</profiles.activation>
</properties>
</profile>
<profile>
<id>deploy</id>
<properties>
<profiles.activation>deploy</profiles.activation>
</properties>
</profile>
</profiles>
注意這裡的<profiles.actviation>
屬性名稱要和2.3 啟用profile裡配置的屬性值${profiles.activation}
對應,用於在打包的時候指定啟用的profile
3.1 配置Maven外掛,進行資源過濾
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<warName>${profiles.activation}</warName>
<!-- 啟用spring profile -->
<webResources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/webapp</directory>
<includes>
<include>**/web.xml</include>
</includes>
</resource>
</webResources>
<warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory>
<webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml>
<warName>實際打包名稱或者用${profiles.activation}替代,否則會找不到war包</warName>
</configuration>
</plugin>
這一部很關鍵: 配置的目的是為了打包的時候,替換web.xml中配置的servlet上下文引數值${profiles.activation}
,如果不配置,會發現打包後的web.xml中${profiles.activation}
並沒有被替換。
3.2 打包
打包到部署環境
$mvn clean install -Pdeploy
打包到體驗環境
$mvn clean install -Pdev
參考書籍:
1. Maven實戰 許曉斌著
2. spring proflie參考網上資料以及實際使用
相關推薦
Maven Profile和Spring Proflie
一個優秀的構建系統必須足夠靈活,它應該能讓專案在不同的環境下都能成功地構建。Maven為了支援構建的靈活性,內建了三大特性,即屬性、Profile和資源過濾。這裡我們只介紹Profile的使用,以及和Spring Profile的整合。 1、Mav
maven profile 和 spring boot profile的區別
maven profile 配置 maven profile 和 spring boot profile的區別 看看哪個適合你的使用場景,這兩個是不一樣的使用場景,具體細節點選上面的連結。 appli
Maven Profile 與 Spring Profile 管理多環境打包
一般開發團隊會有多個部署環境,如 dev 環境用於開發自測,QA 環境讓測試團隊測試, Production 環境作為線上環境。通常不同環境的配置不同,我們希望打包時的人力消耗最少。 #Spring Boot Profile Spring Boot Profile 有許多的功能,這裡只說管理配置的內容。Spr
Maven 教程(17)— Maven Profile 和 Filtering 簡介
每個專案都會有多套執行環境(開發,測試,正式等等),不同的環境配置也不盡相同(如jdbc.url),藉助Jenkins和自動部署提供的便利,我們可以把不同環境的配置檔案單獨抽離出來,打完包後用對應環境的配置檔案替換打包後的檔案,其實maven已經給我們提供
使用 Maven Profile 和 Filtering 打各種環境的包
每個專案都會有多套執行環境(開發,測試,正式等等),不同的環境配置也不盡相同(如jdbc.url),藉助Jenkins和自動部署提供的便利,我們可以把不同環境的配置檔案單獨抽離出來,打完包後用對應環境的配置檔案替換打包後的檔案,其實maven已經給我們提供了替換方案:profile + filtering
Maven profile整合Spring profile
在Maven的pom.xml和spring框架中,都有profile這個概念。profile是用於區分各種環境的,例如開發環境、測試環境、正式環境等。 Maven的profile經常用於在打包時根據指定環境打入不同的配置檔案配置,如資料庫配置。 Spring的Profile
整合maven和Spring boot的profile功能
原文來自 由於專案的需要, 今天給spirng boot專案添加了profile功能。再網上搜索了一圈,也沒有找到滿意的參考資料,其實配置並不難,就是沒有一個one stop(一站式)講解的地方,所以有了寫這篇部落格的想法。由於本人水平有限,文中任何錯誤和紕漏歡迎大家反饋。希望
集成maven和Spring boot的profile功能
prope dev directory .profile 代碼 cati log build 使用 思路:maven支持profile功能,當使用maven profile打包時,可以打包指定目錄和指定文件,且可以修改文件中的變量。spring boot也支持profile
Redis的基本使用(基於maven和spring)
opera redist scac bottom 合成 創建 ann private public 使用redis基本測試 maven導包 <dependency> <groupId>redis.clients&
Maven和Spring mvc下的頁面的跳轉與取值
servle 提交 輸入 接收 -m title style ofo pri (此處tomcat的端口設置為80) 例如:在testForm.jsp裏提交表單,在ok.jsp裏取值 testForm.jsp頁面代碼如下: <%@ page contentType="
spring 使用 maven profile
備註 ive con 打包 1.8 指定jdk efault rop BYD 先看看 maven 定義 profile 的寫法 <!-- profiles --> <profiles> <profile> <a
Spring Profile和Mybatis進行多個數據源(H2和Mysql)的切換
sql pda 開箱 https tails val 收集 sqlserver jpetstore 總結: 最近在做WebMagic的後臺,遇到一個問題:後臺用到了數據庫,本來理想情況下是用Mysql,但是為了做到開箱即用,也整合了一個嵌入式數據庫H2。這裏面就有個問題了,
[Maven]Maven中使用profile和filtering進行屬性替換
原文連結 http://www.360doc.com/content/15/0123/10/20466010_443036304.shtml 背景 構建專案時可能會遇到在測試(如單元測試)、開發、模擬、生產等不同環境下需要不同配製(properties、xml)或資源(jpg、p
Spring Mvc和Spring Boot讀取Profile方式
spring boot java程式碼中獲取spring.profiles.active - u013042707的專欄 - CSDN部落格https://blog.csdn.net/u013042707/article/details/80632057 在Java類中取web.xml中配置的profile
Maven Filtering和Profile
Filtering Filtering是resource外掛的功能,作用是將資原始檔中的佔位符替換成對應的值,如下圖所示: 使用注意 啟用resource外掛的filtering功能; 設定資原始檔
xxx.jar或者xxx.war中沒有主清單屬性和spring-boot-maven-plugin的作用
因為springboot本身集成了tomcat外掛,所以我們可以直接使用mvn clean package命令打成jar包或者war包,然後使java -jar xxx.jar 或者 java -jar xxx.war命令非常方便的去部署執行專案。 但是在執行命令時提示: PS F:\wkh_co
IDEA下使用maven整合Struts2和Spring
初學java,在用struts做了幾個專案之後,覺得手動整合業務元件有些麻煩了,是時候上spring了。先把struts和spring整合下,體驗一把spring的IoC看看再說。 從網上找了不少資料,總感覺寫的不是很全面,對於我這個新手來說不是很友好。好在搗鼓了幾個小時之後,順利跑起來了
解決MAVEN用assembly打包spring.handlers和spring.schemas出錯的問題
專案不打包執行正常,打包後報出異常Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace 發現是有些spring的jar包包含spring.handle
Spring Boot maven profile 替換不成功原因?
配置logback.xml替換的時候,發現替換不成功 <property name="LOG_FILE_HOME" value="${log.root.path}" /> 期望
maven profile切換正式環境和測試環境 maven profile切換正式環境和測試環境
maven profile切換正式環境和測試環境 討論QQ群:313032825 有時候,我們在開發和部署的時候,有很多配置檔案資料是不一樣的,比如連線mysql,連線redis,一些properties檔案等等 每次部署或者開發都要改配置檔案太麻