下面两则技巧以前没有用过,在某些场合它们还是很有用的,比如开发和正式的产品介质时可以通过它们自动设置不同的LOG级别,所以收录一下,呵呵。

BTW: 原文还介绍了一些其他内容,对于ANT初学者有较好的参考价值,建议看看。

 

利用 Ant 提供的 filter 任务替换属性值

现在根据不同环境的需要,对某些配置文件的值做一些替换。在 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 中找到。