下面兩則技巧以前沒(méi)有用過(guò),在某些場(chǎng)合它們還是很有用的,比如開(kāi)發(fā)和正式的產(chǎn)品介質(zhì)時(shí)可以通過(guò)它們自動(dòng)設(shè)置不同的LOG級(jí)別,所以收錄一下,呵呵。

BTW: 原文還介紹了一些其他內(nèi)容,對(duì)于ANT初學(xué)者有較好的參考價(jià)值,建議看看。

 

利用 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 的使用例子:

  <filter token=" log4j.logger" value="INFO"/>
  
<copy todir="${dest.dir}" filtering="true">
    
<fileset dir="${src.dir}"/>
  
</copy>

這段腳本的意思就是在 src.dir 目錄下的所有文件中,如果有預(yù)先定義好的"@log4j.logger@"占位符的話,在拷貝到 dest.dir 目錄后,所有的占位符都被替換成了"INFO"。

你也可以將所有被替換的值放到某個(gè)屬性文件中,filter 任務(wù)將屬性文件中的每一個(gè)條目讀出來(lái)并且設(shè)置成一個(gè) Filter。如下所示:

 <filter filtersfile="deploy_env.properties"/>
  
<copy todir="${dest.dir}" filtering="true">
    
<fileset dir="${src.dir}"/>
  
</copy>

上面的腳本表示所有在 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á)式的例子:

<replaceregexp byline="true">
<regexp pattern="正則表達(dá)式"/>
<substitution expression="將要替換的值"/>
<fileset dir="${unpack.war.dir}/WEB-INF" includes="web.xml"/>
</replaceregexp>

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)"<"的話,需要用轉(zhuǎn)義符"<"。

在 Eclipse3.1 中已經(jīng)內(nèi)置了對(duì)正則表達(dá)式的支持;但是如果你在命令行中運(yùn)行需要正則表達(dá)式支持的腳本的話,則需要自己將正則表達(dá)式的包下載下來(lái)加到 classpath 中。在隨文章的 deploy.xml 中提供了一個(gè)簡(jiǎn)單的替換屬性文件的值的例子。正則表達(dá)式的例子可以在本文所帶的 deploy.xml 中找到。