|
使用Maven 2創(chuàng)建WebLogic Portal應用程序
本文旨在說明如何使用Apache Maven 2項目來為BEA WebLogic Portal創(chuàng)建構建系統(tǒng)。Maven是一種廣泛應用于Apache項目的開源構建系統(tǒng)。它提供了許多Ant所不具備的功能,其中最為引人注目的當屬依賴項管理功能。關于Maven和Ant之間的爭論一直以來都很激烈,本文不會探討這一問題,而是重點介紹WebLogic Portal和Maven 2協(xié)同工作的問題。 本文主要針對了解Maven 2以及熟悉其基本功能的用戶。如果您之前沒有接觸過Maven,請首先閱讀免費電子書 Better Builds with Maven 2。 安裝Maven首先,從Maven網(wǎng)站http://maven.下載并安裝Maven 2。Maven程序可以安裝在任何文件系統(tǒng)中,但是最好不要安裝在特定項目目錄下,因為不同的項目可能都需要調(diào)用Maven程序。 安裝好Maven后,接下來就要創(chuàng)建命令文件以初始化Maven環(huán)境。舉例如下;盡管在Linux或Solaris系統(tǒng)中創(chuàng)建同樣文件也很簡單,但該文件主要面向Windows系統(tǒng)。 set BEA_HOME=C:\bea92 set M2_HOME=C:\java\maven-2.0.4 set JAVA_HOME=%BEA_HOME%\jdk150_04 set path=%JAVA_HOME%\bin;%path%;%M2_HOME%\bin mvn --version 該腳本設置了某些需要應用于構建環(huán)境的環(huán)境變量。很明顯,您應該通過改變BEA_HOME、JAVA_HOME和M2_HOME的變量值來反射特定環(huán)境。為了確保腳本的正確性,在結束處運行了Maven 版本命令。這個命令顯示了當前所使用的Maven的版本。 創(chuàng)建Maven儲存庫Maven的一個關鍵功能就是依賴項管理。一個依賴于某種資源的構件聲明了一個在Maven build文件中的依賴項,同時定義了依賴項的組、名稱以及版本。在調(diào)用構件時,Maven通過從庫中獲取必要的資源來處理資源依賴項。為了簡化處理過程,Maven 在http://repo1./maven2 保留了一個大型儲存庫,其中包含了大多數(shù)像Spring這樣的流行開源框架。 令人遺憾的是,為了避免侵犯版權和許可協(xié)議,該儲存庫不能承載商業(yè)資源,例如WebLogic庫等。因此,接下來需要把WebLogic庫安裝在本地儲存庫中。開發(fā)者很可能在剛開始的時候,會不假思索去嘗試使用系統(tǒng)級作用域來訪問文件系統(tǒng)中的資源,但是不久就會意識到在共享庫時,這樣做是徒勞的。另外需要強調(diào)的是,這種做法與Maven的理念背道而馳,所以最好不要嘗試這樣做。 安裝單機版JAR 在BEA主目錄下安裝單機版JAR很簡單。下面是從一段腳本中摘錄的樣本行,它展示了如何通過使用Maven安裝插件和install-file goal來進行安裝。出于簡潔期間,這里僅僅顯示了一行;完整的腳本在示例代碼中。這段腳本假定為您正在使用WebLogic Portal v9.2。如果您已經(jīng)安裝MP1或更新的版本,建議在腳本中更新相應的版本號。 mvn install:install-file -Dfile=%BEA_HOME%\weblogic92\server\lib\weblogic.jar -DgroupId=weblogic-server -DartifactId=weblogic -Dversion=9.2.0 -Dpackaging=jar -DgeneratePom=true Maven的資源保存在一個儲存庫中,這個儲存庫有組標識符、工件標識符以及版本號。組標識符用于組合類似的工件。在上面的例子中,我們用 weblogic-server 來組合服務器特定的WebLogic 工件。在下文中我們還會介紹weblogic-Portal和weblogic-common組。工件標識符專門用于標識特定的工件。為保證清晰明了,我們建議用JAR的名稱來命名工件標識符。 要注意的是,本文重點討論的是組和工件標識符。開發(fā)者可以隨意使用分層和命名約定,但是任何變動必須在本文論及到的所有構建工件中反映出來。 一旦WebLogic 資源放入庫后,在Maven項目目標模型(POM) 中引用資源就變得很簡單。至于先前在儲存庫中安裝 weblogic.jar 的例子,我們可以在pom.xml中創(chuàng)建一個依賴項,如下所示: <dependency> <groupId>weblogic-server</groupId> <artifactId>weblogic</artifactId> <version>9.2.0</version> <scope>provided</scope> </dependency> 要注意,組和工件標識符以及版本就是我們在Maven儲存庫中安裝weblogic.jar的內(nèi)容。而假定作用域僅僅表明資源在運行時提供,并且僅僅用于編譯目的。 使用共享庫很遺憾,我們現(xiàn)在面臨著一個更為艱難的挑戰(zhàn),就是要將WebLogic共享庫安裝在儲存庫中。一個共享庫可以是一份Web或企業(yè)文檔,其在運行時內(nèi)與與應用程序歸并。應用程序在EAR 的weblogic-application.xml或WAR的weblogic.xml中聲明基于共享庫的依賴項。這些共享庫包含了諸如JAR的大量文件資源。 麻煩的是,Java編譯器javac不能從共享庫中提取JAR文件來完成編譯。在WebLogic Workshop中有一個插件能夠?qū)⑺泄蚕韼鞌U展到一個插件目錄下,這樣JAR文件就能被編譯器識別處理。 在Maven中,要訪問共享庫,我們需要將每個共享庫中的工件 安裝到儲存庫中。為了實現(xiàn)這個目標,我在本文中編寫了一個命名為maven-weblogic-library-plugin 的maven小插件。除了在儲存庫中安裝一個或多個共享庫以外,這個插件和Maven中安裝的插件功能類似。下例說明了它的執(zhí)行方式: mvn weblogic-maven:maven-shared-library-plugin:install-library -DgroupId=weblogic-portal -Ddirectory=%BEA_HOME%/weblogic92/portal/lib/modules -DdefaultVersion=9.2.0 這個插件既可以通過-Dlibrary指令安裝一個單獨的共享庫,也能將所有的庫安裝在指定的目錄下,就像上面顯示的一樣。以上指定的groupId是一個根組,共享庫就安裝在里面。插件程序能自動為文件庫工件創(chuàng)建一個二級組,而且?guī)斓墓ぜc庫本身同名。在這個二級組中,共享庫中的每一個工件將和庫本身的副本一起安裝。最后,創(chuàng)建一個母項目目標模型(POM)工件,以便創(chuàng)建庫中所有工件的依賴項。這樣在配置build時,就減少了為每一個工件創(chuàng)建依賴項的工作量。 版本控制maven-weblogic-library-plugin插件允許開發(fā)人員指定共享文件庫的默認版本。當共享庫名稱不包含版本號時,我們就可以用插件來指定版本。如果安裝了一個例如beehive-controls-1.0.ear的共享庫,版本號就可以從名稱中提?。ㄈ绫纠袨?.0),而不是來自于默認版本號。 創(chuàng)建 maven-weblogic-library-plugin 插件可以進入示例代碼中的/maven/maven-weblogic-library-plugin文件夾并執(zhí)行mvn:install之前的mvn:package命令來創(chuàng)建新的插件文件。切記一定要先用前文論述的內(nèi)嵌的maven.bat文件來初始化Maven環(huán)境。 安裝共享庫有了插件文件,下一步就要將所有的共享庫安裝在儲存庫中。示例代碼中有一段腳本install-weblogic-libraries.bat,它向我們說明了應該如何實現(xiàn)這一任務。 正如先前論述的一樣,一旦共享庫安裝完畢,我們就可以通過已由插件創(chuàng)建好的母POM將依賴項添加進來。比方說要聲明一個p13n-app-lib.ear 共享庫中的依賴項,我們就可以在pom.xml中使用下述依賴項聲明: <dependency> <groupId>weblogic-common.p13n-app-lib</groupId> <artifactId>p13n-app-lib-parent</artifactId> <version>9.2.0</version> <type>pom</type> <scope>provided</scope> </dependency> 創(chuàng)建項目目標模型準備工作完成后,就可以創(chuàng)建POM文件并且應用Maven來構建我們想要的門戶應用程序了。但是首先,關于WebLogic 工作平臺下門戶項目架構還要強調(diào)一點是,Maven是一款基于慣例優(yōu)先理念的軟件工具;這意味著它認為一切都是按照某種方式而布置。至于門戶項目結構,Maven具有一種針對Java 和 Web項目的結構,建議盡可能使用這種結構。 使用Maven的結構很方便;創(chuàng)建WebLogic門戶WAR時,只要指定下圖所示的資源路徑和Web內(nèi)容目錄即可。請注意這是建議結構,如果您現(xiàn)在的項目正在使用默認路徑,您仍然可以配置Maven來創(chuàng)建該項目。但是,還需要在POM中進行額外的配置以傳達Maven路徑的變動。
圖1.. Eclipse New Portal Web Project對話框 至于WebLogic門戶EAR,默認結構可以在Maven中正常運行,無需任何變動。 最后,關于項目結構我們強烈建議創(chuàng)建一個新的項目并且將該項目的源代碼放在工作空間以外的單獨目錄下。由于無需檢查多余的工作空間工件,這將使得源代碼控制管理更為容易。下方的樣本結構圖可說明這一點:
圖2:項目結構示例. 現(xiàn)在我們就可以為應用程序的各個部分創(chuàng)建POM文件了。POM文件總共有三種,在下文我們會對之進行論述。請記住示例代碼中包含每個POM的完整版本;這樣我們只需在下文重點講述每個POM的主要方面,特別是與創(chuàng)建WebLogic 門戶應用程序有關的方面。在Maven站點中有很多關于如何創(chuàng)建和使用POM的文章,這里就不再贅述了。 父POM第一個要創(chuàng)建的POM是父POM。有了父POM,我們既可以創(chuàng)建EAR,也可以創(chuàng)建WAR作為一個單元,同時允許集中設置。在Maven中,每一個工件,比如EAR和WAR,是單獨的實體。您可以將它構建并部署為一個單元。 在這個父POM中,我們?yōu)閜ortalEAR和portalWAR項目聲明模塊。如下所示: <modules> <module>portalEAR</module> <module>portalWAR</module> </modules> 這項聲明使我們能夠同時創(chuàng)建兩個項目。這樣做只是為了方便,而并非是必需的,因為portalEAR在POM中也聲明了一個基于portalWAR的依賴項。因此,如果之前沒有創(chuàng)建war文件,Maven會自動創(chuàng)建。 接下來,就要設置maven-compiler-plug-in以使 target JDK 5為編譯做好準備。如下所示: <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> Web應用程序POMWeb應用程序POM可用來創(chuàng)建以portalWAR項目為代表的WAR??偟膩碚f,創(chuàng)建WebLogic portal WAR與創(chuàng)建一個標準的Java EE WAR沒什么兩樣。但是,假若WebLogic門戶應用程序使用頗具代表性的頁面流和Beehive注釋,我們當然要做到支持注釋。 JDK包含了一個注釋處理工具(APT),而Maven 2中的maven-apt-plugin插件也配有這樣的工具,可以在 這里 找到它。在撰寫本文時,maven-apt-plugin插件中還存在一些小問題,導致其不能在WebLogic 門戶應用程序中順暢運行。我已經(jīng)將糾正這些缺陷的補丁放進了示例代碼中,只需在maven-apt-plugin目錄下運行mvn:package和mvn:install命令既可安裝。為了避免版本沖突,用-BEA給該版本作了標記。 出于本文發(fā)布時間的原因,maven-apt-plugin 已經(jīng)得到了糾正并且對發(fā)現(xiàn)的缺陷也進行了修改。這樣就可以選擇使用本文中的插件或是maven-apt-plugin的快照版本。如果您在使用maven-apt-plugin的快照版本,那就不再需要sourcePath配置選項,可以從portalWAR 項目中的pom.xml中刪除。 用Maven來處理注釋很簡單,POM中的該部分功能具體如下: <plugin>
<groupId>org.apache.myfaces.tobago</groupId>
<artifactId>maven-apt-plugin</artifactId>
<version>1.0.10-BEA</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<generated>.apt_generated</generated>
<aptOptions>
x=3,
web.content.root=${basedir}/src/main/webapp
</aptOptions>
<target>1.5</target>
<nocompile>true</nocompile>
<showWarnings>true</showWarnings>
<verbose>false</verbose>
<fork>false</fork>
<sourcePath>${basedir}/src/main/java</sourcePath>
</configuration>
</execution>
</executions>
</plugin>
其中最關鍵的一點就是將web.content.root屬性指向Web內(nèi)容源目錄,因為Beehive注釋處理器需要調(diào)用該參數(shù)。另一個重要參數(shù)是sourcePath。因為APT工具需要調(diào)用sourcePath,該參數(shù)被添加到了打過補丁的maven-apt-plugin插件。 最后一個關鍵點就是各種WebLogic Server和WebLogic Portal庫以及共享庫的依賴項。它們在POM的最底層,通過下載示例代碼可以進行查看。 企業(yè)級應用程序POMportalEAR項目中的POM大致上是一個標準的POM,可以被任何Java EE應用程序調(diào)用。配置maven-ear-plugin如下: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ear-plugin</artifactId> <configuration> <displayName> Portal Maven2 Sample Application </displayName> <description> Portal Maven2 Sample Application </description> <version>1.4</version> <earSourceDirectory>EarContent</earSourceDirectory> <earSourceExcludes>**/application.xml</earSourceExcludes> <modules> <webModule> <groupId>portal-maven2-sample</groupId> <artifactId>portalWAR</artifactId> <contextRoot>/portalWAR</contextRoot> </webModule> </modules> </configuration> </plugin> 這里唯一要強調(diào)的一點是,這里不包含application.xml文件,我們需要讓Maven生成該文件。這樣做很有必要,因為依照Maven的規(guī)則,在生成一個帶附加版本號的portalWAR的同時,Maven還將生成application.xml以確保模塊名稱是正確的。 創(chuàng)建應用程序既然現(xiàn)在一切都準備就緒,創(chuàng)建門戶應用程序就變得易如反掌,只要在/應用程序目錄下運行mvn:package命令即可。如果您查看portalWAR和portalEAR文件夾下的目標目錄,就可以分別看到WAR和EAR的副本。 示例代碼本文提供了一份文檔,該文檔包含了一個示例WebLogic門戶應用程序。所有使用Maven 2構建應用程序所需的資源都包含在里面。要使用該示例,只需打開該文檔包并確保路徑被保留,然后修改maven/scripts/maven.bat文件使之指向BEA以及Maven主目錄所在的位置即可。 教學示例代碼(zip) 概述只需付出一點努力,用戶就可以使用Maven 2來創(chuàng)建WebLogic門戶應用程序。Maven 2 中大量的功能使之成為眾多機構的選擇。相信本文能夠幫助眾多用戶來實現(xiàn)Maven 2和WebLogic的集成。 資源
|
|||||||
|
|