首先,要写出自己的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;
2import java.io.File;
3import java.io.FileOutputStream;
4import java.io.FileReader;
5import java.io.IOException;
6import java.io.OutputStreamWriter;
7import java.util.ArrayList;
8import java.util.List;
9
10import org.apache.tools.ant.BuildException;
11import 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