Posted on 2006-06-04 00:28
sound 閱讀(1707)
評(píng)論(2) 編輯 收藏
本文主要介紹 Ant 在多用戶(hù)開(kāi)發(fā)的情況下,如何用 Eclipse,并且根據(jù)不同的目標(biāo)環(huán)境編譯不同的部署包。文中首先介紹一個(gè)場(chǎng)景,給出在開(kāi)發(fā)、編譯、部署過(guò)程中遇到的問(wèn)題;然后介紹如何用 Eclipse 來(lái)簡(jiǎn)化你的 Ant 開(kāi)發(fā)過(guò)程;文章的最后解釋如何通過(guò)編寫(xiě)有效的 Ant 腳本來(lái)提高你的工作效率。
讀者定位為具有 Java 和 Ant 使用經(jīng)驗(yàn)的開(kāi)發(fā)人員。
讀者可以學(xué)習(xí)到如何使用 Ant 解決一些多用戶(hù)開(kāi)發(fā)環(huán)境中,根據(jù)不同的目標(biāo)環(huán)境編譯成不同部署包的問(wèn)題。
工作場(chǎng)景
現(xiàn)在有一個(gè) web 項(xiàng)目,是多人進(jìn)行開(kāi)發(fā)的,通過(guò) CVS 來(lái)管理。另外該項(xiàng)目還有一些測(cè)試人員,他們測(cè)試部署在測(cè)試服務(wù)器上的應(yīng)用程序,發(fā)現(xiàn) bug 后通過(guò) bug 管理系統(tǒng)通知開(kāi)發(fā)人員,在開(kāi)發(fā)人員修復(fù) bug 并經(jīng)過(guò)本地測(cè)試后,由專(zhuān)門(mén)的人負(fù)責(zé)檢出(check out)代碼,編譯打包后部署到測(cè)試服務(wù)器上。
該項(xiàng)目的成員小A就是負(fù)責(zé)檢出代碼、編譯打包,并部署到服務(wù)器上的人。除了這個(gè)任務(wù)之外,他還是該項(xiàng)目的編程人員。在項(xiàng)目進(jìn)入測(cè)試階段后,小A在得到組中別的成員修復(fù)了 bug 并且檢入(check in)了代碼的消息后(也有可能是小A自己檢入了代碼),小A首先更新本地的代碼,先在本地做測(cè)試,確認(rèn)修復(fù)了 bug 后打成 WAR 包部署到測(cè)試服務(wù)器上,并通知測(cè)試人員已經(jīng)修復(fù)了 bug,讓測(cè)試人員繼續(xù)進(jìn)行測(cè)試。
小A的煩惱
在該項(xiàng)目中,有一些為測(cè)試方便開(kāi)發(fā)而寫(xiě)的代碼和頁(yè)面,比如跳過(guò)用戶(hù)認(rèn)證,但是在部署到測(cè)試機(jī)環(huán)境的時(shí)候,需要?jiǎng)h除這些代碼和頁(yè)面;另外作為一個(gè)具有靈活性和擴(kuò)展性的應(yīng)用程序,又有一些配置文件,配置文件中的值會(huì)根據(jù)環(huán)境的改變而變動(dòng)。例如,在項(xiàng)目中使用了 Log4j 記錄日志,需要給 Log4j 指定日志文件的保存路徑,本地程序員開(kāi)發(fā)的時(shí)候用的是 Windows 系統(tǒng),給 Log4j 指定的也是 Windows 的文件系統(tǒng),在測(cè)試階段的時(shí)候,需要部署到 Linux 系統(tǒng)中,那么日志的保存路徑也需要做相應(yīng)的改動(dòng)。部署到測(cè)試服務(wù)器上的時(shí)候,除了 Log4j 需要改之外,還有很多別的配置項(xiàng)目也需要變動(dòng),并且分散在各個(gè) package 中。小A的煩惱也隨之而來(lái),每次他在做完本地測(cè)之后,就根據(jù)測(cè)試機(jī)的需要逐個(gè)找配置文件,更改相應(yīng)的值,并刪除那些為測(cè)試方便寫(xiě)的代碼和頁(yè)面,每天可能根據(jù)需要做好幾次這樣的事情,最煩的是他在快做完對(duì)測(cè)試機(jī)環(huán)境更改的時(shí)候,某開(kāi)發(fā)人員突然通知小A說(shuō):“我又改了一點(diǎn)代碼,剛檢入,你再重打一個(gè)包吧。”,小A又不得不從頭開(kāi)始做新一輪的檢出代碼、本地測(cè)試、更改配置文件、刪除不需要的文件、打包部署的工作。另外小A在測(cè)試階段的后期被通知要求除了每次生成一個(gè)測(cè)試環(huán)境的 WAR 包外還必須生成一個(gè)在產(chǎn)品環(huán)境下的 WAR 包,他做的事情就更多了。
從上面的場(chǎng)景可以看出,小A的工作效率低而且容易出錯(cuò),甚至有可能導(dǎo)致整個(gè)項(xiàng)目的工作效率低下。其實(shí)可以通過(guò) Ant 來(lái)幫助小A快速而且有效地完成這個(gè)工作。在 Ant 中,根據(jù)目標(biāo)環(huán)境的需要,可以把所有要更改的配置文件的項(xiàng)目集中寫(xiě)到某個(gè)配置文件中。這樣根據(jù)不同的目標(biāo)環(huán)境得到不同的配置文件,Ant 在編譯包時(shí)根據(jù)不同的目標(biāo)環(huán)境切換不同的配置文件即可。比如小A現(xiàn)在碰到的有 3 中環(huán)境:開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境以及產(chǎn)品環(huán)境,根據(jù)這三種環(huán)境可以生成三個(gè)不同的配置文件:develop_deploy.property、test_deploy. property和product_deploy. property,當(dāng)小A想生成不同的包時(shí)只需在這三個(gè)配置文件之間切換就可以了。
在正式開(kāi)始編寫(xiě)腳本之前,我們需要下載安裝相應(yīng)的軟件。
Eclipse:為了使 Ant 的開(kāi)發(fā)更加簡(jiǎn)單,我們選擇了 Eclipse3.1 作為開(kāi)發(fā)環(huán)境。當(dāng)然你可以使用任何你喜歡的文本編輯工具來(lái)開(kāi)發(fā)你的 Ant。Eclipse 的最新版本可以在 http://eclipse.org/ 上下載。
Ant:Ant 是基于 Java 的編譯工具,它就像 C/C++ 中的 make,但是沒(méi)有 make 那樣難用。Ant 的最新版本可以在 http://ant.apache.org/bindownload.cgi 上下載。如果你用 Eclipse 來(lái)開(kāi)發(fā) Ant,則不用去單獨(dú)下載 Ant,因?yàn)樵?Eclipse 中已經(jīng)集成了 Ant。
CVS 客戶(hù)端(cvs.exe):CVS 可以在 http://www.nongnu.org/cvs/ 下載。
用 Eclipse3.1 來(lái)創(chuàng)建 Ant 腳本
如果你使用 Eclipse 來(lái)編寫(xiě) Ant,建議使用 Eclipse 3.1 以后的版本。除了以前 Ant 編輯器提供的語(yǔ)法高亮,提示語(yǔ)法錯(cuò)誤等功能外,Eclipse3.1 版本增加了許多新的功能。比如:腳本代碼的折疊;快速定位某屬性或者目標(biāo)(target)段的定義;在同一 builder 文件中重構(gòu)屬性名和目標(biāo)名(快捷方式Alt + Shift +R);調(diào)試 Ant 腳本等。
下面我們就來(lái)看看 Eclipse 3.1 中對(duì) Ant 的支持
打開(kāi)“File”-“New”-“Project”-“Simple”-“Project”,點(diǎn)擊“Next”,輸入工程名“Ant”,然后點(diǎn)擊直到“Finish”
在新建的 Ant 工程中,新建 Test.xml,并且拷貝下面的腳本。該段腳本的內(nèi)容就不做介紹了,我們主要看 Eclipse 提供了哪些功能。注意這時(shí)候打開(kāi)的并不是 Ant 編輯器,將內(nèi)容拷貝進(jìn)去之后,關(guān)掉打開(kāi)的“Test.xml”,然后再重新打開(kāi)它,這樣 Eclipse 就會(huì)用 Ant 編輯器打開(kāi)它,并且也語(yǔ)法高亮了。
${test}
自動(dòng)提示和代碼折疊功能。如果是 Ant 內(nèi)置的命令或者前面已經(jīng)定義的變量,編輯器會(huì)自動(dòng)提示;編輯器右邊的加/減號(hào)可以代碼折疊。如下所示:
快速定位目標(biāo)(target)或者定義變量處。在上圖中,將鼠標(biāo)移至 default=”init” 中的 init 上之后,按下 ctrl 鍵,鼠標(biāo)變成手狀,單擊就可以定位到定義該目標(biāo)的地方
快速重構(gòu)目標(biāo)名或者屬性名。選中目標(biāo)/屬性名,按下 Alt + Shift + R,然后鍵入你要修改后的值,所有引用到的地方都會(huì)隨之改動(dòng)。如下圖所示,選中 init 后,按下快捷鍵,改成 initial:
調(diào)試 Ant 腳本。在標(biāo)簽“
Build into c:/temp/dest/testProj, successfully.
在上面的例子中,所有的路徑信息都是寫(xiě)在 build.xml 中。但是 Ant 腳本可能在不同的機(jī)器或者不同的系統(tǒng)上運(yùn)行,也有可能一些值需要根據(jù)環(huán)境的不同而變化,在 Ant 中可以把所有這些可能變化的地方都放到一個(gè)配置文件中,然后在 Ant 腳本中引用這個(gè)配置文件就可以了,針對(duì)上面的例子,如下所示:
Build into ${dest.dir}, successfully.
build.properties的內(nèi)容:
dest.dir=c:/temp/dest/testProj
src.dir=c:/temp/src/testProj
如果想在 Ant 腳本中引用值的話(huà),只需用$符號(hào)開(kāi)頭,在一對(duì)"{}"中寫(xiě)入要引用的鍵值。如上例中,需要引用編譯的目標(biāo)路徑用"${dest.dir}"。
使用 Ant 任務(wù)從 CVS 中檢出(check out)源代碼,并編譯打包
Ant 中提供了 cvs 任務(wù)(Task)可以從 CVS 服務(wù)器中檢出資源(注意:在使用 Ant 的 cvs 任務(wù)之前,請(qǐng)先將 cvs.exe 下載到你的機(jī)器,并且將它添加到你本地的 PATH 環(huán)境變量中,然后重新啟動(dòng) Eclipse。否則在執(zhí)行下面腳本的時(shí)候就會(huì)得到 error=2 的錯(cuò)誤)。cvs 的可選用屬性很多,在這里介紹經(jīng)常使用到的幾個(gè)屬性。從 CVS 中檢出資源一般需要指定:
CVS 所在的服務(wù)器地址:目標(biāo) CVS 服務(wù)器地址
用戶(hù)名:登錄該 CVS 服務(wù)器你指定的用戶(hù)名
密碼:登錄該 CVS 服務(wù)器需要的密碼
庫(kù)路徑(Repository Path):服務(wù)器中的庫(kù)路徑
模塊名:當(dāng)前需要檢出的模塊名,一般都是以工程的名字作為模塊名
標(biāo)簽名:需要從 CVS 中檢出哪個(gè)標(biāo)簽
在介紹使用 Ant 的 cvs 之前,先說(shuō)一下本地的目錄結(jié)構(gòu)。在 C 盤(pán)的 temp 目錄下,分別有四個(gè)目錄,如下所示:
build 目錄:放編譯后的類(lèi)以及資源文件
dist 目錄:放生成的 jar 文件或者 war 文件
lib 目錄:放在編譯過(guò)程中需要用到的 jar 文件
src 目錄:放從 cvs 中檢出的源文件(包括 JSP 等)
在 Ant 中這樣寫(xiě)就可以從中檢出資源:
這段腳本片斷的意思就是從叫"cvs.server"的服務(wù)器中,用用戶(hù)名是 username、密碼為 pwd 的用戶(hù)檢出在庫(kù)路徑是 /home/testPath 下的 TestProj 模塊(項(xiàng)目),檢出后的資源放入本地目錄 c:/temp/src/testProj 中。在上面這段腳本中,可以看到有很多值可能會(huì)根據(jù)不同的環(huán)境或者用戶(hù)隨之改變的,比如用戶(hù)名和密碼等;而且從腳本的重復(fù)可利用性來(lái)說(shuō),需要把有些值抽出來(lái)放到配置文件中,如服務(wù)器的地址和庫(kù)路徑等。因此把這些可能需要更改的地方放到 property 文件中,效果會(huì)更好。改完后的完整 Ant 腳本如下所示:
對(duì)應(yīng)的 TestWeb.properties 文件內(nèi)容如下所示:
base.dir=c:/temp/
src.dir=${base.dir}/src
cvs.server=cvs.server
cvs.user=username
cvs.pw=pwd
cvs.repositoryPath=/home/testPath
cvs.projectName=TestProj
cvs.root=:pserver:${cvs.user}:${cvs.pw}@${cvs.server}:${cvs.repositoryPath}
cvs.tag=
在檢出了資源后,需要對(duì)其進(jìn)行編譯打包。為了使 Ant 腳本更加具有可讀性和靈活性,我們需要對(duì)上面的 Ant 腳本進(jìn)行一些改動(dòng)。首先將 Ant 腳本中進(jìn)行分段,如下所示:
上面的腳本中,總共分成了5個(gè)目標(biāo)(target),腳本的入口點(diǎn)是"all",all 按順序調(diào)用 init,clean,checkout,build。其中:
init 是用來(lái)做初始化屬性文件和設(shè)置 classpath 等設(shè)置初始條件的事情
clean 用來(lái)刪除上一次留下的沒(méi)用的目錄和文件
checkout 已經(jīng)介紹過(guò)了,是用來(lái)從 CVS 中檢出資源
build 用來(lái)編譯源文件并打 WAR 包到指定的目錄
詳細(xì)的 Ant 腳本可以參見(jiàn)隨本文所附的 TestWeb.xml 和 TestWeb.properties。
編譯過(guò)程與產(chǎn)生不同目標(biāo)環(huán)境的腳本分開(kāi)執(zhí)行
在前面介紹的 Ant 腳本中,根據(jù)從 CVS 服務(wù)器中檢出的資源打成了一個(gè)默認(rèn)的 war 包,并沒(méi)有考慮根據(jù)不同的目標(biāo)環(huán)境來(lái)生成不同的包,從下一節(jié)開(kāi)始介紹如何根據(jù)不同的環(huán)境來(lái)生成不同的部署包。
還有一個(gè)問(wèn)題是:為什么需要把從 CVS 中檢出資源、編譯的過(guò)程跟根據(jù)目標(biāo)環(huán)境打包的過(guò)程分開(kāi)?
這是因?yàn)楸旧?CVS 檢出資源是需要花一定的時(shí)間,如果資源比較多這個(gè)過(guò)程就會(huì)花費(fèi)挺長(zhǎng)時(shí)間;另外,在多人開(kāi)發(fā)的情況下必須保證在生成不同的部署包的時(shí)候是用的是同一套代碼生成的,否則會(huì)出現(xiàn)各個(gè)服務(wù)器上運(yùn)行的版本不一致,如果檢出資源、編譯的過(guò)程跟生成包的腳本一起執(zhí)行的話(huà)就會(huì)出現(xiàn)這個(gè)問(wèn)題(比如小A在測(cè)試服務(wù)器測(cè)試通過(guò)的時(shí)候之后,再生成一個(gè)在產(chǎn)品環(huán)境下的部署包,如果分兩次從 CVS 服務(wù)器中檢出資源的話(huà),在此期間可能會(huì)有開(kāi)發(fā)人員往 CVS 服務(wù)器中檢入代碼,導(dǎo)致生成的版本不一致),因此,必須將這兩個(gè)過(guò)程分開(kāi)執(zhí)行。現(xiàn)在我們開(kāi)始建立另外一個(gè) Ant 腳本文件,叫 deploy.xml,專(zhuān)門(mén)用來(lái)生成包;另外與 deploy.xml 相對(duì)應(yīng)的還有一個(gè) deploy.properties 文件。在 deploy.xml 中會(huì)引用 deploy.properties 文件。另外根據(jù)在前面的場(chǎng)景中碰到的環(huán)境,創(chuàng)建三個(gè)不同的屬性文件, develop_deploy.property、test_deploy. property 和 product_deploy. Property,在打包的時(shí)候,根據(jù)不同的目標(biāo)環(huán)境,將相應(yīng)屬性文件中的內(nèi)容拷貝至 deploy.properties 文件中(或者也可以直接在 deploy.xml 中直接切換不同的屬性文件),然后在 Eclipse 中直接執(zhí)行 deploy.xml;如果在命令行中,可以用下面的命令來(lái)執(zhí)行:
ant –f deploy.xml
解開(kāi) WAR 包
我們首先得建立一個(gè)目錄(這里是 unpack)用來(lái)存放解壓后的文件。Ant 中提供了 unzip 命令用來(lái)解壓 ear/war/jar 包。除了這個(gè)目錄外,根據(jù)不同的目標(biāo)環(huán)境,在運(yùn)行目錄下建立一個(gè)與目標(biāo)環(huán)境相對(duì)應(yīng)的目錄,重新打好的 war 包就放在這個(gè)目錄下,比如針對(duì)場(chǎng)景中的情況,如果需要?jiǎng)?chuàng)建一個(gè)產(chǎn)品環(huán)境下的部署包,我們可以建立一個(gè) TestWebProduct 目錄,目錄名寫(xiě)在配置文件中(${pack.base.dir})。
init in deploy
unpack the ${war.name}
在 init 段中首先刪除掉上次解壓的目錄和目標(biāo)打包目錄,然后重新建立目錄;在 unpack 中,首先將編譯好的默認(rèn) war 包拷貝至 unpack 定義的目錄,解壓之后把 unpack 下的 war 包刪除。下面是這時(shí)候?qū)?yīng)的屬性文件。
projectName=MTSWeb
war.name=MTSWeb.war
#根目錄
base.dir=c:/temp
#默認(rèn)的war包所在的目錄
dest.dir=${base.dir}/dist
#解壓后的目錄
unpack.base.dir=${base.dir}/unpack
#目標(biāo)環(huán)境相對(duì)應(yīng)的目錄
pack.base.dir=${base.dir}/TestWebProduct
利用 Ant 提供的 filter 任務(wù)替換屬性值
現(xiàn)在根據(jù)不同環(huán)境的需要,對(duì)某些配置文件的值做一些替換。在 Ant 中,提供了 filter 任務(wù),使得替換值很方便。當(dāng)然也可以使用下面介紹的正則表達(dá)式來(lái)替換屬性值。filter 主要用來(lái)在同一行內(nèi)容中的替換,而正則表達(dá)式一下子可以替換多行內(nèi)容。filter 的使用例子:
這段腳本的意思就是在 src.dir 目錄下的所有文件中,如果有預(yù)先定義好的"@log4j.logger@"占位符的話(huà),在拷貝到 dest.dir 目錄后,所有的占位符都被替換成了"INFO"。
你也可以將所有被替換的值放到某個(gè)屬性文件中,filter 任務(wù)將屬性文件中的每一個(gè)條目讀出來(lái)并且設(shè)置成一個(gè) Filter。如下所示:
上面的腳本表示所有在 deploy_env 中出現(xiàn)的條目將被作為一個(gè) filter,在拷貝到 dest.dir 目錄后,所有 src.dir 目錄中存在的占位符將被替換成 deploy_env 中的值。具體的例子可以參見(jiàn)隨本文附帶的 deploy.xml, deploy_env.properties 和 Test.properties。
其中 deploy.xml 是 ant 腳本,deploy_env.properties 中包含所有要替換的值,在 Test.properties 中是包含有占位符的資源文件。
利用正則表達(dá)式替換屬性值
Ant 中支持多種正則表達(dá)式,在運(yùn)行 Ant 的時(shí)候用哪種正則表達(dá)式可以通過(guò)設(shè)置 ant.regexp.regexpimpl 的值來(lái)切換,Ant 支持的的正則表達(dá)式有:
java.util.regex package of JDK 1.4
jakarta-regexp
installation dependencies
正則表達(dá)式的例子:
byline 屬性用來(lái)確認(rèn)被替換的時(shí)候是一次替換一行還是多行;pattern 屬性用來(lái)指明正則表達(dá)式;substitution expression 中是替換的值,替換的值都定義在相對(duì)應(yīng)的配置文件中;fileset 屬性中的 dir 用來(lái)指定被替換文件所在的目錄,includes 用來(lái)指定要替換哪個(gè)文件。需要注意的是,如果在正則表達(dá)式或者替換的值中出現(xiàn)"<"的話(huà),需要用轉(zhuǎn)義符"<"。
在 Eclipse3.1 中已經(jīng)內(nèi)置了對(duì)正則表達(dá)式的支持;但是如果你在命令行中運(yùn)行需要正則表達(dá)式支持的腳本的話(huà),則需要自己將正則表達(dá)式的包下載下來(lái)加到 classpath 中。在隨文章的 deploy.xml 中提供了一個(gè)簡(jiǎn)單的替換屬性文件的值的例子。正則表達(dá)式的例子可以在本文所帶的 deploy.xml 中找到。
Ant 使用條件表達(dá)式,根據(jù)屬性值刪除不需要的文件
在生成部署包的時(shí)候,還有可能會(huì)根據(jù)目標(biāo)環(huán)境的不同,刪除一些不同的文件。比如在產(chǎn)品環(huán)境中那些作為測(cè)試需要的代碼往往需要?jiǎng)h除,但是測(cè)試環(huán)境中并不需要。因此就需要條件表達(dá)式來(lái)做判斷。如下所示:
在上面的例子中,先讀出 ${deploy.isTestEnv} 的值(在配置文件 deloy.properties 中),根據(jù)讀出的值對(duì)屬性 isTestEnv 設(shè)值,如果 ${deploy.isTestEnv} 的值是 true,isTestEnv 的值也是 true;否則是 false。然后分別調(diào)用目標(biāo)段 trueCondition 和 falseCondition。在這里,表達(dá)式值的判斷是用"istrue",在 Ant 中還提供了很多別的表達(dá)式,比如 not/and/or,equals 等等,具體關(guān)于條件表達(dá)式的信息可以參考:http://ant.apache.org/manual/CoreTasks/condition.html ,該頁(yè)也可以在隨下載下來(lái)的文檔中找到。
在段 trueCondition 中,判斷 isTestEnv,如果是真的話(huà)就運(yùn)行,否則不運(yùn)行;在段 falseCondition 中,也判斷 isTestEnv,如果是假就運(yùn)行,否則不運(yùn)行,在段中可以根據(jù)情況做相應(yīng)的事情。條件判斷式的例子可以在本文的 deploy.xml 中找到。
重新打包,并拷貝到不同的目錄
在上面的替換過(guò)程完成后,調(diào)用 war 將 unpack 目錄下的內(nèi)容重新打包。
詳細(xì)的例子可以參見(jiàn)隨本文的附件 deploy.xml 和 deploy.properties。
結(jié)論
通過(guò)本文可以看出編寫(xiě)好有效的 Ant 腳本能很好的解決在編譯部署包的時(shí)候出現(xiàn)的問(wèn)題,將那些變化的內(nèi)容放到配置文件中,在部署的時(shí)候切換不同的配置文件就可以實(shí)現(xiàn)生成不同的部署包。文中也介紹了如何使用 Eclipse 來(lái)提高你編寫(xiě)/調(diào)試 Ant 腳本的效率。
Ant:更多的關(guān)于 Ant 的信息可以在它的主頁(yè) http://ant.apache.org/ 上得到;
Eclipse:Eclipse是一個(gè)開(kāi)源社區(qū)的軟件,它提供了一個(gè)可擴(kuò)展軟件開(kāi)發(fā)平臺(tái)。Eclipse 提供了可擴(kuò)展性的工具和框架,它跨越了整個(gè)軟件開(kāi)發(fā)的生命周期,包括對(duì)建模的支持、對(duì) Java,C/C++ 和別的語(yǔ)言開(kāi)發(fā)環(huán)境、測(cè)試和性能等等。更多關(guān)于 Eclipse 的信息可以在它的官方主頁(yè) http://www.eclipse.org/ 上得到;
CVS:CVS是Concurrent Versioning System 的縮寫(xiě),可以翻譯成并行版本管理系統(tǒng)。它是一個(gè)開(kāi)源的版本控制和合作系統(tǒng),它在多人團(tuán)隊(duì)合作的開(kāi)發(fā)模式中用得很好。關(guān)于它的更多的信息可以在 http://www.cvshome.org/ 上得到;
正則表達(dá)式:正則表達(dá)式(Regular Expression,縮寫(xiě)為 regexp,regex 或 regxp),又稱(chēng)正規(guī)表達(dá)式或常規(guī)表達(dá)式,是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。JDK1.4 之后類(lèi)庫(kù)中就提供了正則表達(dá)式;但是 Ant 的說(shuō)明書(shū)中強(qiáng)烈推薦使用 Jakarta Oro,它的主頁(yè)是 http://jakarta.apache.org/regexp/;