下面兩則技巧以前沒有用過,在某些場合它們還是很有用的,比如開發和正式的產品介質時可以通過它們自動設置不同的LOG級別,所以收錄一下,呵呵。
BTW: 原文還介紹了一些其他內容,對于ANT初學者有較好的參考價值,建議看看。
現在根據不同環境的需要,對某些配置文件的值做一些替換。在 Ant 中,提供了 filter 任務,使得替換值很方便。當然也可以使用下面介紹的正則表達式來替換屬性值。filter 主要用來在同一行內容中的替換,而正則表達式一下子可以替換多行內容。filter 的使用例子:
<filter token=" log4j.logger" value="INFO"/>
<copy todir="${dest.dir}" filtering="true">
<fileset dir="${src.dir}"/>
</copy>
這段腳本的意思就是在 src.dir 目錄下的所有文件中,如果有預先定義好的"@log4j.logger@"占位符的話,在拷貝到 dest.dir 目錄后,所有的占位符都被替換成了"INFO"。
你也可以將所有被替換的值放到某個屬性文件中,filter 任務將屬性文件中的每一個條目讀出來并且設置成一個 Filter。如下所示:
<filter filtersfile="deploy_env.properties"/>
<copy todir="${dest.dir}" filtering="true">
<fileset dir="${src.dir}"/>
</copy>
上面的腳本表示所有在 deploy_env 中出現的條目將被作為一個 filter,在拷貝到 dest.dir 目錄后,所有 src.dir 目錄中存在的占位符將被替換成 deploy_env 中的值。具體的例子可以參見隨本文附帶的 deploy.xml, deploy_env.properties 和 Test.properties。
其中 deploy.xml 是 ant 腳本,deploy_env.properties 中包含所有要替換的值,在 Test.properties 中是包含有占位符的資源文件。
Ant 中支持多種正則表達式,在運行 Ant 的時候用哪種正則表達式可以通過設置 ant.regexp.regexpimpl 的值來切換,Ant 支持的的正則表達式有:
- java.util.regex package of JDK 1.4
- jakarta-regexp
- installation dependencies
正則表達式的例子:
<replaceregexp byline="true">
<regexp pattern="正則表達式"/>
<substitution expression="將要替換的值"/>
<fileset dir="${unpack.war.dir}/WEB-INF" includes="web.xml"/>
</replaceregexp>
byline 屬性用來確認被替換的時候是一次替換一行還是多行;pattern 屬性用來指明正則表達式;substitution expression 中是替換的值,替換的值都定義在相對應的配置文件中;fileset 屬性中的 dir 用來指定被替換文件所在的目錄,includes 用來指定要替換哪個文件。需要注意的是,如果在正則表達式或者替換的值中出現"<"的話,需要用轉義符"<"。
在 Eclipse3.1 中已經內置了對正則表達式的支持;但是如果你在命令行中運行需要正則表達式支持的腳本的話,則需要自己將正則表達式的包下載下來加到 classpath 中。在隨文章的 deploy.xml 中提供了一個簡單的替換屬性文件的值的例子。正則表達式的例子可以在本文所帶的 deploy.xml 中找到。