Maven 可以使用 profile 的功能來設定多個環境,
並對不同環境使用不同的設定,非常方便,
舉個例來說:
通常程式專案可能會有幾個開發階段,
例如開發、測試、正式上線等,
而在不同的階段,我們可能會想使用不同的設定,
例如 Java EE Web 專案的 web.xml 可能在不同的階段會想使用不同的內容設定、
或者是 DB connection pool, Proxool 的 proxool.xml 可能在開發階段想連本地端或測試機的資料庫 (Database),但在正式上線時想連正式機的資料庫等。
這篇文主要是來紀錄使用 Maven 的 profile 功能,來為一個 Jave EE Web 專案使用
不同的 web.xml 和 proxool.xml。
我們希望在使用 maven 產生 war 檔
(命令列指令:
mvn clean install -P{active 的 profile},例如:
mvn clean install -Pdev)
時,能夠依不同的 profile 使用不同的設定。
在這篇文的例子中,先說明幾個比較特別的地方:
- 此篇文的 Java EE Web 專案,是由沒有使用 Maven 的舊 Java EE Web 專案轉成的有使用 Maven 的新專案,故檔案結構跟一開始就使用 Maven + webapp archetype 不一樣。
- 此篇文使用 Maven 的 maven-war-plugin 來處理 war 檔的發佈,其中 web.xml 可以用 <webXml> 參數來設置。
而 proxool.xml 用 <webResource> 參數來設置。
如果舊專案是用 Eclipse 產生出來的,可以對專案按右鍵,選
Configure --> Convert to Maven Project
來將其轉成 Maven 專案,如下圖:
檔案結構如圖所示,其中我們在專案的根目錄下 (也是 pom.xml 所在的位置),建立了一個 config 資料夾,並在其中建立了三個不同環境的資料夾 (dev, demo, production),在各個環境的資料夾中都放置了一份 web.xml 和 proxool.xml,如下圖所示:
首先在 pom.xml 中設定 profile,例如在這我們分三個階段,開發 (dev)、測試 (demo)、正式上線 (production):
<profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> <jdk>11</jdk> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>demo</id> <properties> <profiles.active>demo</profiles.active> <jdk>11</jdk> </properties> </profile> <profile> <id>production</id> <properties> <profiles.active>production</profiles.active> <jdk>11</jdk> </properties> </profile> </profiles>
<plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.1</version> <configuration> <warSourceDirectory>WebContent</warSourceDirectory> <webXml>config/${profiles.active}/web.xml</webXml> <webResources> <webResource> <directory>config/${profiles.active}</directory> <includes> <include>proxool.xml</include> </includes> <targetPath>WEB-INF</targetPath> </webResource> </webResources> </configuration> </plugin>
<activation> <activeByDefault>true</activeByDefault> </activation>
沒有留言 :
張貼留言