下面兩則技巧以前沒有用過,在某些場合它們還是很有用的,比如開發(fā)和正式的產(chǎn)品介質(zhì)時(shí)可以通過它們自動(dòng)設(shè)置不同的LOG級別,所以收錄一下,呵呵。
BTW: 原文還介紹了一些其他內(nèi)容,對于ANT初學(xué)者有較好的參考價(jià)值,建議看看。
利用 Ant 提供的 filter 任務(wù)替換屬性值
現(xiàn)在根據(jù)不同環(huán)境的需要,對某些配置文件的值做一些替換。在 Ant 中,提供了 filter 任務(wù),使得替換值很方便。當(dāng)然也可以使用下面介紹的正則表達(dá)式來替換屬性值。filter 主要用來在同一行內(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è)條目讀出來并且設(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 中的值。具體的例子可以參見隨本文附帶的 deploy.xml, deploy_env.properties 和 Test.properties。
其中 deploy.xml 是 ant 腳本,deploy_env.properties 中包含所有要替換的值,在 Test.properties 中是包含有占位符的資源文件。
利用正則表達(dá)式替換屬性值
Ant 中支持多種正則表達(dá)式,在運(yùn)行 Ant 的時(shí)候用哪種正則表達(dá)式可以通過設(shè)置 ant.regexp.regexpimpl 的值來切換,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 屬性用來確認(rèn)被替換的時(shí)候是一次替換一行還是多行;pattern 屬性用來指明正則表達(dá)式;substitution expression 中是替換的值,替換的值都定義在相對應(yīng)的配置文件中;fileset 屬性中的 dir 用來指定被替換文件所在的目錄,includes 用來指定要替換哪個(gè)文件。需要注意的是,如果在正則表達(dá)式或者替換的值中出現(xiàn)"<"的話,需要用轉(zhuǎn)義符"<"。
在 Eclipse3.1 中已經(jīng)內(nèi)置了對正則表達(dá)式的支持;但是如果你在命令行中運(yùn)行需要正則表達(dá)式支持的腳本的話,則需要自己將正則表達(dá)式的包下載下來加到 classpath 中。在隨文章的 deploy.xml 中提供了一個(gè)簡單的替換屬性文件的值的例子。正則表達(dá)式的例子可以在本文所帶的 deploy.xml 中找到。