2020年10月27日 星期二

Maven - 使用 profile 功能為不同環境設置不同內容的檔案 - 以 web.xml, proxool.xml 為例

 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 使用不同的設定。


在這篇文的例子中,先說明幾個比較特別的地方:

  1. 此篇文的 Java EE Web 專案,是由沒有使用 Maven 的舊 Java EE Web 專案轉成的有使用 Maven 的新專案,故檔案結構跟一開始就使用 Maven + webapp archetype 不一樣。
  2. 此篇文使用 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>

接著來設定 web.xml 和 proxool.xml,我們使用了 maven-war-plugin (詳細參數) 來處理,
首先設定 warSourceDirectory 到 WebContent 資料夾 (平常預設是 ${basedir}/src/main/webapp),
然後用 webXml 設定 web.xml 所在的位置 (相對 pom.xml 所在的路徑),
最後用 webResource 設定 proxool.xml :
<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>
在這邊,${profiles.active} 代表要發佈時所要使用的 profile,即 dev, demo 或 production,
profile 可以在
mvn clean install -P{要的 profile} 
指令中指定,例如如要使用 demo,指令就為:
mvn clean install -Pdemo,
如果沒有在命令中指定 profile (即 -P 參數),就會使用 profile 裡有設定 activeByDefault = true 的 profile (例如此篇文就是設定 dev)
<activation>
	<activeByDefault>true</activeByDefault>
</activation>

在 webResource 設定裡, targetPath 的位置是相對於 warSourceDirectory 的位置,
在這篇文中,就是 WebContent 資料夾

因為在這篇文中,我們沒有把 web.xml 和 proxool.xml 放在專案的 resource directory 之中 (config 資料夾不在 resource directory 裡),
也沒有放在 warSourceDirectory 的設定資料夾中,
也就是 web.xml 和 proxool.xml 不會被發佈到 war 檔裡面,
所以不需要特別對其做 resource excludes 的動作,
例如 resource 的 exclude 
或 <warSourceExcludes> (值為相對於 warSourceDirectory 設定的位置)


參考資料:

沒有留言 :

張貼留言