| 時(shí)間:2007-04-10 作者:Gerald Nunn 瀏覽次數: 211 本文關(guān)鍵字:maven, weblogic portal, pom, repository, ant, build systems, maven 2, dependencies, Dev Toolbox, BEA Workshop Product Family, WebLogic Portal, WebLogic Server, Gerald Nunn, 門(mén)戶(hù), 儲存庫, 構建系統, 依賴(lài)項 |
|

本文旨在說(shuō)明如何使用Apache Maven 2項目來(lái)為BEA WebLogic Portal創(chuàng )建構建系統。Maven是一種廣泛應用于A(yíng)pache項目的開(kāi)源構建系統。它提供了許多Ant所不具備的功能,其中最為引人注目的當屬依賴(lài)項管理功能。關(guān)于Maven和Ant之間的爭論一直以來(lái)都很激烈,本文不會(huì )探討這一問(wèn)題,而是重點(diǎn)介紹WebLogic Portal和Maven 2協(xié)同工作的問(wèn)題。
本文主要針對了解Maven 2以及熟悉其基本功能的用戶(hù)。如果您之前沒(méi)有接觸過(guò)Maven,請首先閱讀免費電子書(shū) Better Builds with Maven 2。
首先,從Maven網(wǎng)站http://maven.apache.org下載并安裝Maven 2。Maven程序可以安裝在任何文件系統中,但是最好不要安裝在特定項目目錄下,因為不同的項目可能都需要調用Maven程序。
安裝好Maven后,接下來(lái)就要創(chuàng )建命令文件以初始化Maven環(huán)境。舉例如下;盡管在Linux或Solaris系統中創(chuàng )建同樣文件也很簡(jiǎn)單,但該文件主要面向Windows系統。
set BEA_HOME=C:\bea92set M2_HOME=C:\java\maven-2.0.4set JAVA_HOME=%BEA_HOME%\jdk150_04set path=%JAVA_HOME%\bin;%path%;%M2_HOME%\binmvn --version
該腳本設置了某些需要應用于構建環(huán)境的環(huán)境變量。很明顯,您應該通過(guò)改變BEA_HOME、JAVA_HOME和M2_HOME的變量值來(lái)反射特定環(huán)境。為了確保腳本的正確性,在結束處運行了Maven 版本命令。這個(gè)命令顯示了當前所使用的Maven的版本。
Maven的一個(gè)關(guān)鍵功能就是依賴(lài)項管理。一個(gè)依賴(lài)于某種資源的構件聲明了一個(gè)在Maven build文件中的依賴(lài)項,同時(shí)定義了依賴(lài)項的組、名稱(chēng)以及版本。在調用構件時(shí),Maven通過(guò)從庫中獲取必要的資源來(lái)處理資源依賴(lài)項。為了簡(jiǎn)化處理過(guò)程,Maven 在http://repo1.maven.org/maven2 保留了一個(gè)大型儲存庫,其中包含了大多數像Spring這樣的流行開(kāi)源框架。
令人遺憾的是,為了避免侵犯版權和許可協(xié)議,該儲存庫不能承載商業(yè)資源,例如WebLogic庫等。因此,接下來(lái)需要把WebLogic庫安裝在本地儲存庫中。開(kāi)發(fā)者很可能在剛開(kāi)始的時(shí)候,會(huì )不假思索去嘗試使用系統級作用域來(lái)訪(fǎng)問(wèn)文件系統中的資源,但是不久就會(huì )意識到在共享庫時(shí),這樣做是徒勞的。另外需要強調的是,這種做法與Maven的理念背道而馳,所以最好不要嘗試這樣做。
安裝單機版JAR
在BEA主目錄下安裝單機版JAR很簡(jiǎn)單。下面是從一段腳本中摘錄的樣本行,它展示了如何通過(guò)使用Maven安裝插件和install-file goal來(lái)進(jìn)行安裝。出于簡(jiǎn)潔期間,這里僅僅顯示了一行;完整的腳本在示例代碼中。這段腳本假定為您正在使用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的資源保存在一個(gè)儲存庫中,這個(gè)儲存庫有組標識符、工件標識符以及版本號。組標識符用于組合類(lèi)似的工件。在上面的例子中,我們用 weblogic-server 來(lái)組合服務(wù)器特定的WebLogic 工件。在下文中我們還會(huì )介紹weblogic-Portal和weblogic-common組。工件標識符專(zhuān)門(mén)用于標識特定的工件。為保證清晰明了,我們建議用JAR的名稱(chēng)來(lái)命名工件標識符。
要注意的是,本文重點(diǎn)討論的是組和工件標識符。開(kāi)發(fā)者可以隨意使用分層和命名約定,但是任何變動(dòng)必須在本文論及到的所有構建工件中反映出來(lái)。
一旦WebLogic 資源放入庫后,在Maven項目目標模型(POM) 中引用資源就變得很簡(jiǎn)單。至于先前在儲存庫中安裝 weblogic.jar 的例子,我們可以在pom.xml中創(chuàng )建一個(gè)依賴(lài)項,如下所示:
<dependency><groupId>weblogic-server</groupId><artifactId>weblogic</artifactId><version>9.2.0</version><scope>provided</scope></dependency>
要注意,組和工件標識符以及版本就是我們在Maven儲存庫中安裝weblogic.jar的內容。而假定作用域僅僅表明資源在運行時(shí)提供,并且僅僅用于編譯目的。
很遺憾,我們現在面臨著(zhù)一個(gè)更為艱難的挑戰,就是要將WebLogic共享庫安裝在儲存庫中。一個(gè)共享庫可以是一份Web或企業(yè)文檔,其在運行時(shí)內與與應用程序歸并。應用程序在EAR 的weblogic-application.xml或WAR的weblogic.xml中聲明基于共享庫的依賴(lài)項。這些共享庫包含了諸如JAR的大量文件資源。
麻煩的是,Java編譯器javac不能從共享庫中提取JAR文件來(lái)完成編譯。在WebLogic Workshop中有一個(gè)插件能夠將所有共享庫擴展到一個(gè)插件目錄下,這樣JAR文件就能被編譯器識別處理。
在Maven中,要訪(fǎng)問(wèn)共享庫,我們需要將每個(gè)共享庫中的工件 安裝到儲存庫中。為了實(shí)現這個(gè)目標,我在本文中編寫(xiě)了一個(gè)命名為maven-weblogic-library-plugin 的maven小插件。除了在儲存庫中安裝一個(gè)或多個(gè)共享庫以外,這個(gè)插件和Maven中安裝的插件功能類(lèi)似。下例說(shuō)明了它的執行方式:
mvn weblogic-maven:maven-shared-library-plugin:install-library-DgroupId=weblogic-portal-Ddirectory=%BEA_HOME%/weblogic92/portal/lib/modules-DdefaultVersion=9.2.0
這個(gè)插件既可以通過(guò)-Dlibrary指令安裝一個(gè)單獨的共享庫,也能將所有的庫安裝在指定的目錄下,就像上面顯示的一樣。以上指定的groupId是一個(gè)根組,共享庫就安裝在里面。插件程序能自動(dòng)為文件庫工件創(chuàng )建一個(gè)二級組,而且庫的工件與庫本身同名。在這個(gè)二級組中,共享庫中的每一個(gè)工件將和庫本身的副本一起安裝。最后,創(chuàng )建一個(gè)母項目目標模型(POM)工件,以便創(chuàng )建庫中所有工件的依賴(lài)項。這樣在配置build時(shí),就減少了為每一個(gè)工件創(chuàng )建依賴(lài)項的工作量。
maven-weblogic-library-plugin插件允許開(kāi)發(fā)人員指定共享文件庫的默認版本。當共享庫名稱(chēng)不包含版本號時(shí),我們就可以用插件來(lái)指定版本。如果安裝了一個(gè)例如beehive-controls-1.0.ear的共享庫,版本號就可以從名稱(chēng)中提?。ㄈ绫纠袨?.0),而不是來(lái)自于默認版本號。
可以進(jìn)入示例代碼中的/maven/maven-weblogic-library-plugin文件夾并執行mvn:install之前的mvn:package命令來(lái)創(chuàng )建新的插件文件。切記一定要先用前文論述的內嵌的maven.bat文件來(lái)初始化Maven環(huán)境。
有了插件文件,下一步就要將所有的共享庫安裝在儲存庫中。示例代碼中有一段腳本install-weblogic-libraries.bat,它向我們說(shuō)明了應該如何實(shí)現這一任務(wù)。
正如先前論述的一樣,一旦共享庫安裝完畢,我們就可以通過(guò)已由插件創(chuàng )建好的母POM將依賴(lài)項添加進(jìn)來(lái)。比方說(shuō)要聲明一個(gè)p13n-app-lib.ear 共享庫中的依賴(lài)項,我們就可以在pom.xml中使用下述依賴(lài)項聲明:
<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 )建POM文件并且應用Maven來(lái)構建我們想要的門(mén)戶(hù)應用程序了。但是首先,關(guān)于WebLogic 工作平臺下門(mén)戶(hù)項目架構還要強調一點(diǎn)是,Maven是一款基于慣例優(yōu)先理念的軟件工具;這意味著(zhù)它認為一切都是按照某種方式而布置。至于門(mén)戶(hù)項目結構,Maven具有一種針對Java 和 Web項目的結構,建議盡可能使用這種結構。
使用Maven的結構很方便;創(chuàng )建WebLogic門(mén)戶(hù)WAR時(shí),只要指定下圖所示的資源路徑和Web內容目錄即可。請注意這是建議結構,如果您現在的項目正在使用默認路徑,您仍然可以配置Maven來(lái)創(chuàng )建該項目。但是,還需要在POM中進(jìn)行額外的配置以傳達Maven路徑的變動(dòng)。

圖1.. Eclipse New Portal Web Project對話(huà)框
至于WebLogic門(mén)戶(hù)EAR,默認結構可以在Maven中正常運行,無(wú)需任何變動(dòng)。
最后,關(guān)于項目結構我們強烈建議創(chuàng )建一個(gè)新的項目并且將該項目的源代碼放在工作空間以外的單獨目錄下。由于無(wú)需檢查多余的工作空間工件,這將使得源代碼控制管理更為容易。下方的樣本結構圖可說(shuō)明這一點(diǎn):

圖2:項目結構示例.
現在我們就可以為應用程序的各個(gè)部分創(chuàng )建POM文件了。POM文件總共有三種,在下文我們會(huì )對之進(jìn)行論述。請記住示例代碼中包含每個(gè)POM的完整版本;這樣我們只需在下文重點(diǎn)講述每個(gè)POM的主要方面,特別是與創(chuàng )建WebLogic 門(mén)戶(hù)應用程序有關(guān)的方面。在Maven站點(diǎn)中有很多關(guān)于如何創(chuàng )建和使用POM的文章,這里就不再贅述了。
第一個(gè)要創(chuàng )建的POM是父POM。有了父POM,我們既可以創(chuàng )建EAR,也可以創(chuàng )建WAR作為一個(gè)單元,同時(shí)允許集中設置。在Maven中,每一個(gè)工件,比如EAR和WAR,是單獨的實(shí)體。您可以將它構建并部署為一個(gè)單元。
在這個(gè)父POM中,我們?yōu)閜ortalEAR和portalWAR項目聲明模塊。如下所示:
<modules><module>portalEAR</module><module>portalWAR</module></modules>
這項聲明使我們能夠同時(shí)創(chuàng )建兩個(gè)項目。這樣做只是為了方便,而并非是必需的,因為portalEAR在POM中也聲明了一個(gè)基于portalWAR的依賴(lài)項。因此,如果之前沒(méi)有創(chuàng )建war文件,Maven會(huì )自動(dòng)創(chuàng )建。
接下來(lái),就要設置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應用程序POM可用來(lái)創(chuàng )建以portalWAR項目為代表的WAR??偟膩?lái)說(shuō),創(chuàng )建WebLogic portal WAR與創(chuàng )建一個(gè)標準的Java EE WAR沒(méi)什么兩樣。但是,假若WebLogic門(mén)戶(hù)應用程序使用頗具代表性的頁(yè)面流和Beehive注釋?zhuān)覀儺斎灰龅街С肿⑨尅?/p>
JDK包含了一個(gè)注釋處理工具(APT),而Maven 2中的maven-apt-plugin插件也配有這樣的工具,可以在 這里 找到它。在撰寫(xiě)本文時(shí),maven-apt-plugin插件中還存在一些小問(wèn)題,導致其不能在WebLogic 門(mén)戶(hù)應用程序中順暢運行。我已經(jīng)將糾正這些缺陷的補丁放進(jìn)了示例代碼中,只需在maven-apt-plugin目錄下運行mvn:package和mvn:install命令既可安裝。為了避免版本沖突,用-BEA給該版本作了標記。
出于本文發(fā)布時(shí)間的原因,maven-apt-plugin 已經(jīng)得到了糾正并且對發(fā)現的缺陷也進(jìn)行了修改。這樣就可以選擇使用本文中的插件或是maven-apt-plugin的快照版本。如果您在使用maven-apt-plugin的快照版本,那就不再需要sourcePath配置選項,可以從portalWAR 項目中的pom.xml中刪除。
用Maven來(lái)處理注釋很簡(jiǎn)單,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>其中最關(guān)鍵的一點(diǎn)就是將web.content.root屬性指向Web內容源目錄,因為Beehive注釋處理器需要調用該參數。另一個(gè)重要參數是sourcePath。因為APT工具需要調用sourcePath,該參數被添加到了打過(guò)補丁的maven-apt-plugin插件。
最后一個(gè)關(guān)鍵點(diǎn)就是各種WebLogic Server和WebLogic Portal庫以及共享庫的依賴(lài)項。它們在POM的最底層,通過(guò)下載示例代碼可以進(jìn)行查看。
portalEAR項目中的POM大致上是一個(gè)標準的POM,可以被任何Java EE應用程序調用。配置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ǎn)是,這里不包含application.xml文件,我們需要讓Maven生成該文件。這樣做很有必要,因為依照Maven的規則,在生成一個(gè)帶附加版本號的portalWAR的同時(shí),Maven還將生成application.xml以確保模塊名稱(chēng)是正確的。
既然現在一切都準備就緒,創(chuàng )建門(mén)戶(hù)應用程序就變得易如反掌,只要在/應用程序目錄下運行mvn:package命令即可。如果您查看portalWAR和portalEAR文件夾下的目標目錄,就可以分別看到WAR和EAR的副本。
本文提供了一份文檔,該文檔包含了一個(gè)示例WebLogic門(mén)戶(hù)應用程序。所有使用Maven 2構建應用程序所需的資源都包含在里面。要使用該示例,只需打開(kāi)該文檔包并確保路徑被保留,然后修改maven/scripts/maven.bat文件使之指向BEA以及Maven主目錄所在的位置即可。
教學(xué)示例代碼(zip)
只需付出一點(diǎn)努力,用戶(hù)就可以使用Maven 2來(lái)創(chuàng )建WebLogic門(mén)戶(hù)應用程序。Maven 2 中大量的功能使之成為眾多機構的選擇。相信本文能夠幫助眾多用戶(hù)來(lái)實(shí)現Maven 2和WebLogic的集成。
資源

| 作者簡(jiǎn)介 | |
| Gerald Nunn 是BEA Systems Professional Services的業(yè)務(wù)首席顧問(wèn)。他已經(jīng)結婚了,有一個(gè)4歲的兒子,生活在加拿大多倫多北部的紐馬基特小鎮。 | |
聯(lián)系客服