首先,要写出自己的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的源代码:
  1 import 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
 13 public   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