1. 程式人生 > >Maven Profile和Spring Proflie

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中定義環境屬性,如下圖:
"maven-jetty環境變數配置"
如果是使用eclipse jetty外掛啟動,我們需要在伺服器配置中增加環境變數,如下圖:
"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 ProfileSpring Proflie

一個優秀的構建系統必須足夠靈活,它應該能讓專案在不同的環境下都能成功地構建。Maven為了支援構建的靈活性,內建了三大特性,即屬性、Profile和資源過濾。這裡我們只介紹Profile的使用,以及和Spring Profile的整合。 1、Mav

maven profile spring boot profile的區別

maven profile 配置 maven profile 和 spring boot profile的區別 看看哪個適合你的使用場景,這兩個是不一樣的使用場景,具體細節點選上面的連結。 appli

Maven ProfileSpring 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

整合mavenSpring boot的profile功能

原文來自   由於專案的需要, 今天給spirng boot專案添加了profile功能。再網上搜索了一圈,也沒有找到滿意的參考資料,其實配置並不難,就是沒有一個one stop(一站式)講解的地方,所以有了寫這篇部落格的想法。由於本人水平有限,文中任何錯誤和紕漏歡迎大家反饋。希望

集成mavenSpring boot的profile功能

prope dev directory .profile 代碼 cati log build 使用 思路:maven支持profile功能,當使用maven profile打包時,可以打包指定目錄和指定文件,且可以修改文件中的變量。spring boot也支持profile

Redis的基本使用(基於mavenspring)

opera redist scac bottom 合成 創建 ann private public 使用redis基本測試 maven導包 <dependency> <groupId>redis.clients&

MavenSpring 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 ProfileMybatis進行多個數據源(H2Mysql)的切換

sql pda 開箱 https tails val 收集 sqlserver jpetstore 總結: 最近在做WebMagic的後臺,遇到一個問題:後臺用到了數據庫,本來理想情況下是用Mysql,但是為了做到開箱即用,也整合了一個嵌入式數據庫H2。這裏面就有個問題了,

[Maven]Maven中使用profilefiltering進行屬性替換

原文連結 http://www.360doc.com/content/15/0123/10/20466010_443036304.shtml 背景 構建專案時可能會遇到在測試(如單元測試)、開發、模擬、生產等不同環境下需要不同配製(properties、xml)或資源(jpg、p

Spring MvcSpring Boot讀取Profile方式

spring boot java程式碼中獲取spring.profiles.active - u013042707的專欄 - CSDN部落格https://blog.csdn.net/u013042707/article/details/80632057 在Java類中取web.xml中配置的profile

Maven FilteringProfile

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整合Struts2Spring

初學java,在用struts做了幾個專案之後,覺得手動整合業務元件有些麻煩了,是時候上spring了。先把struts和spring整合下,體驗一把spring的IoC看看再說。 從網上找了不少資料,總感覺寫的不是很全面,對於我這個新手來說不是很友好。好在搗鼓了幾個小時之後,順利跑起來了

解決MAVEN用assembly打包spring.handlersspring.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檔案等等 每次部署或者開發都要改配置檔案太麻