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