首先,要写出自己的Ant Task是一件非常简单的事情,有了心里的这层藐视之后,做起事来就容易多了!
说说我做这个Ant Task的背景,随着部门框架的推广,支持国际化是一个严肃的问题,我们选择了utf-8作为UNICODE字符集的编码形式,因此现有项目必须经过一些转换的处理,自然,Ant是首选工具。
可以看一个完整的build.xml:
<?xml version="1.0" encoding="UTF-8"?>

<project default="main" basedir=".">
    
<property name="jsp.dir" value="organtype" />
    
<property name="lib.dir" value="bin" />
    
<path id="classpath">
        
<fileset dir="${lib.dir}">
            
<include name="**/*.jar" />
        
</fileset>
        
<pathelement path="bin" />
    
</path>
    
<!-- 编码关键字替换 -->
    
<target name="replace" description="将GBK,gb2312换成UTF-8">
        
<replace dir="${jsp.dir}" token="GBK" value="UTF-8" />
        
<replace dir="${jsp.dir}" token="gb2312" value="UTF-8" />
    
</target>

    
<!-- 初始化任务 -->
    
<target name="init-tasks" description="==> 生成代码前的初始化工作">
        
<taskdef name="gbk2utf8" classname="org.loushang.bsp.util.GBK2UTF8">
            
<classpath refid="classpath" />
        
</taskdef>
    
</target>

    
<!-- 编码格式转换 -->
    
<target name="convert" description="改变文件的编码格式" depends="init-tasks">
        
<gbk2utf8 destDir="${jsp.dir}" format="java" destEncoding="utf-8" />
    
</target>
    
    
<!-- 主任务 -->
    
<target name="main" description="主任务">
        
<antcall target="replace" />
        
<antcall target="convert" />
    
</target>
</project>

解释一下,首先这个任务进行jsp页编码形式的替换,接着进行内容编码的转换,其中可以指定目标目录,文件格式,目标编码形式。Ant Task主要用到了java的反射技术,我们自己的Task可以继承Task类,然后复写excute()方法,看看GBK2UTF8的源代码:
  1import java.io.BufferedReader;
  2
import java.io.File;
  3
import java.io.FileOutputStream;
  4
import java.io.FileReader;
  5
import java.io.IOException;
  6
import java.io.OutputStreamWriter;
  7
import java.util.ArrayList;
  8
import java.util.List;
  9

 10
import org.apache.tools.ant.BuildException;
 11
import org.apache.tools.ant.Task;
 12

 13public class GBK2UTF8 extends Task 
{
 14    private String format = ""
;
 15

 16    private String destEncoding = ""
;
 17

 18    private String destDir = ""
;
 19

 20    private static List list = new
 ArrayList();
 21

 22    public String getDestDir() 
{
 23        return
 destDir;
 24    }

 25    public void setDestDir(String destDir) {
 26        this.destDir =
 destDir;
 27    }

 28    /*
 29     * 复写execute()方法,实现自己的内容
 30     */

 31    public void execute() throws BuildException {
 32
        super.execute();
 33
        getAllFilesOfDir(getDestDir());
 34        StringBuffer tempSb = new
 StringBuffer();
 35        int hasRead = 0
;
 36        for (int i = 0; i < list.size(); i++
{
 37            System.out.println(list.get
(i));
 38            try 
{
 39                BufferedReader bfr = new BufferedReader(new
 FileReader(
 40                        (File) list.get
(i)));
 41                String temp =
 bfr.readLine();
 42                while (temp != null
{
 43
                    tempSb.append(temp);
 44                    tempSb.append("\n"
);
 45                    temp =
 bfr.readLine();
 46                }

 47                bfr.close();
 48            // 文件内容编码转换

 49                OutputStreamWriter osw = new OutputStreamWriter(
 50                        new FileOutputStream((File) list.get
(i)),
 51
                        getDestEncoding());
 52                osw.write(tempSb.toString(), 0
, tempSb.toString().length());
 53
                osw.flush();
 54
                osw.close();
 55                tempSb = null
;
 56                tempSb = new
 StringBuffer();
 57            }
 catch (IOException e) {
 58
            e.printStackTrace();
 59            }

 60        }

 61    }

 62
 63    
/*
 64     * 判断后缀名是否满足条件
 65     */

 66    private boolean isProperFormat(File file) {
 67        return
 (file.getName().endsWith(getFormat()));
 68    }

 69
 70    
/*
 71     * 取得所有的文件列表
 72     */

 73    private List getAllFilesOfDir(String dir) {
 74        File file = new
 File(dir);
 75        if (!file.exists()) 
{
 76            throw new RuntimeException("给出的目录不存在!"
);
 77        }

 78        File[] files = file.listFiles();
 79        for (int i = 0; i < files.length; i++
{
 80            if (files[i].isFile() && isProperFormat(files[i])) 
{
 81
                list.add(files[i].getAbsoluteFile());
 82            }
 else if (files[i].isDirectory()) {
 83
                getAllFilesOfDir(files[i].getAbsolutePath());
 84            }
 else {
 85        // 那些不符合格式的文件将略去

 86            }

 87        }

 88        return list;
 89    }

 90
 91    public String getDestEncoding() 
{
 92        return
 destEncoding;
 93    }

 94
 95    public void setDestEncoding(String destEncoding) 
{
 96        this.destEncoding =
 destEncoding;
 97    }

 98
 99    public String getFormat() 
{
100        return
 format;
101    }

102
103    public void setFormat(String format) 
{
104        this.format =
 format;
105    }

106}

107

这样,就完成任务了。看看是不是很简单?
参考资料:http://ant.apache.org/manual/tutorial-writing-tasks.html