使用自定义任务来扩展ant

上传人:第*** 文档编号:32821136 上传时间:2018-02-12 格式:DOCX 页数:11 大小:36.36KB
返回 下载 相关 举报
使用自定义任务来扩展ant_第1页
第1页 / 共11页
使用自定义任务来扩展ant_第2页
第2页 / 共11页
使用自定义任务来扩展ant_第3页
第3页 / 共11页
使用自定义任务来扩展ant_第4页
第4页 / 共11页
使用自定义任务来扩展ant_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《使用自定义任务来扩展ant》由会员分享,可在线阅读,更多相关《使用自定义任务来扩展ant(11页珍藏版)》请在金锄头文库上搜索。

1、使用自定义任务来扩展 Ant简介正如我们从前述几节中所看到的,Ant 非常强大,具有涵盖广泛功能集的许多核心任务。它还有许多这里没有介绍的附加任务,再加上提供广泛附加功能的许多可选任务,以及作为 Ant-Contrib 项目的一部分来提供的其他任务;最后,Apache Ant 主页上还列出了外部可用的更多任务。面对 Ant 提供的所有这些任务,您似乎再也不需要其他任务了,但是 Ant 的真正力量在于它的易于扩展性。事实上,恰恰正是这种可扩展性促使人们开发了如此多的附加任务。可能会存在这样的场合,在那样的场合下创建自定义的任务更为合适。例如,假设您创建了一个命令行工具来执行某个特定操作;这个工具

2、可能是将对 Ant 可用的任务的恰当候选者(当该工具是用 Java 语言编写的时更是这样,虽然该工具不一定是用 Java 语言编写的。)与其让 Ant 使用 exec 任务外部地调用该工具(这样将引入依赖关系,并使得生成文件在跨越不同平台时更难于使用),您可以将它直接合并到生成文件中。还可以使得 Ant 的常规文件集和通配符匹配功能对自定义的任务可用。在本节中,我们将考察一个简单自定义任务的构造过程。这个任务将对文件中的行执行排序操作,并将排序后的行集写到一个新文件中。创建自定义的任务为实现一个简单的自定义任务,我们所需做的就是扩展 org.apache.tools.ant.Task 类,并重

3、写 execute() 方法。因此,作为这个文件排序自定义任务的框架,我们将编写如下代码:import org.apache.tools.ant.BuildException;import org.apache.tools.ant.Task;public class FileSorter extends Task / The method executing the taskpublic void execute() throws BuildException 注意我们声明 execute() 方法抛出一个 BuildException 异常。如果这个任务出了任何错误,我们将抛出这个异常以便向

4、 Ant 指出故障。大多数任务,不管是核心任务还是自定义任务,都利用属性来控制它们的行为。对于这个简单任务,我们需要一个属性来指定要排序的文件,需要另一个属性来指定排序内容的输出。我们把这两个属性分别叫做 file 和 tofile。Ant 使得支持自定义任务中的属性非常容易。为此,我们只需实现一个具有特别格式化的名称的方法,Ant 能够使用生成文件中指定的对应属性的值来调用这个方法。这个方法的名称需要是 set 加上属性的名称,因此在这个例子中,我们需要名为 setFile() 和 setTofile() 的方法。当 Ant 遇到生成文件中的一个属性设置时,它会寻找相关任务中具有适当名称的方

5、法(称为 setter 方法)。生成文件中的属性是作为字符串来指定的,因此我们的 setter 方法的参数可以是一个字符串。在这样的情况下,Ant 将在展开值所引用的任何属性之后,使用该属性的字符串值来调用我们的方法。但有时我们想把属性的值看作是一种不同的类型。这里的示例任务就是这种情况,其中的属性值引用文件系统上的文件,而不只是引用任意的字符串。可以通过将方法参数声明为 java.io.File 类型来容易地做到这点。Ant 将接受属性的字符串值,并把它解释为一个文件,然后传递给我们的方法。如果文件是使用相对路径名称来指定的,则会被转换为相对于项目基目录的绝对路径。Ant 能够对其他类型执行

6、类似的转换,比如 boolean 和 int 类型。如果您提供具有相同名称但是具有不同参数的两个方法,Ant 将使用更明确的那一个方法,因此文件类型将优先于字符串类型。这个自定义任务需要的两个 setter 方法类似如下:/ The setter for the file attributepublic void setFile(File file) / The setter for the tofile attributepublic void setTofile(File tofile) 实现自定义的任务使用前一小节开发的框架,现在我们能够完成这个简单的文件排序任务的实现:import j

7、ava.io.*;import java.util.*;import org.apache.tools.ant.BuildException;import org.apache.tools.ant.Task;/* A simple example task to sort a file*/public class FileSorter extends Task private File file, tofile;/ The method executing the taskpublic void execute() throws BuildException System.out.printl

8、n(Sorting file=+file);try BufferedReader from =new BufferedReader(new FileReader(file);BufferedWriter to =new BufferedWriter(new FileWriter(tofile);List allLines = new ArrayList();/ read in the input file String line = from.readLine();while (line != null) allLines.add(line);line = from.readLine();fr

9、om.close();/ sort the listCollections.sort(allLines);/ write out the sorted listfor (ListIterator i=allLines.listIterator(); i.hasNext(); ) String s = (String)i.next();to.write(s); to.newLine();to.close(); catch (FileNotFoundException e) throw new BuildException(e); catch (IOException e) throw new B

10、uildException(e);/ The setter for the file attributepublic void setFile(File file) this.file = file;/ The setter for the tofile attributepublic void setTofile(File tofile) this.tofile = tofile;两个 setter 方法简单地对属性的值排序,以便这些值能够在 execute() 方法中使用。这里,输入文件被逐行地读入一个列表中,然后被排序并逐行地输出到输出文件。注意,为简单起见,我们很少执行错误检查 例如,

11、我们甚至没有检查生成文件是否设置了必需的属性。不过我们的确至少捕捉了所执行的操作抛出的 I/O 异常,并将这些异常作为 BuildExceptions 重新抛出。现在可以使用 javac 编译器或从某个 IDE 内编译这个自定义的任务。为了解决所使用的 Ant 类的引用问题,您需要把 ant.jar 文件的位置添加到 classpath 中。这个文件应该在 Ant 安装路径下的 lib 目录。使用自定义的任务现在我们已经开发和编译了这个自定义的任务,下面可以从生成文件中利用它了。在能够调用自定义的任务之前,我们需要给它指定一个名称来 定义 它,并告诉 Ant 关于实现这个任务的类文件的信息,以

12、及定位该类文件所必需的任何 classpath 设置。这是使用 taskdef 任务来完成的,如下所示:大功告成!现在可以像使用 Ant 的核心任务一样使用这个自定义的任务了。下面是一个完整的生成文件,它显示了这个自定义任务的定义和用法:现在在当前工作目录中创建一个 input.txt 文件来测试这个自定义的任务。例如:Hello thereThis is a lineAnd here is another one下面是运行上面的生成文件之后产生的控制台输出:Buildfile: build.xmlmain:filesorter Sorting file=E:tutorialcustominp

13、ut.txtBUILD SUCCESSFULTotal time: 0 seconds注意 input.txt 的相对路径名称被转换成了当前目录中的一个绝对路径名称。这是因为我们将 setter 方法的参数指定为 java.io.File 类型而不是 java.lang.String 类型。现在看一下这个任务实际是否能工作。这时应该已经在同一目录中创建了名为 output.txt 的文件,它包含以下内容:And here is another oneHello thereThis is a line您可以尝试指定一个不存在的输入文件,以确定该任务是如何向 Ant 报告 “file not fo

14、und”异常的。ant 自动 jar 包分析以前都是用 maven2 做项目管理,但最近又用回了 ant 脚本执行打包,发现每次改变工程得 jar 依赖后打 war 包很麻烦,还得手工改变 build.xml 中的引用,所以为了偷懒就的相隔一劳永逸的办法,于是产生了如下偷懒的代码(可能技术进步都是因为我们想从无意义的手工劳动中解脱出来 )1.扩展的 ant 类,分析 classpath 文件,替换变量 M2_REPO 以获得依赖 jar 的全路径,并执行 copyjava 代码1. import java.io.FileInputStream; 2. import java.io.FileNo

15、tFoundException; 3. import java.io.IOException; 4. import java.util.ArrayList; 5. import java.util.Iterator; 6. import java.util.List; 7. 8. import org.apache.tools.ant.BuildException; 9. import org.apache.tools.ant.Project; 10.import org.apache.tools.ant.Task; 11.import org.apache.tools.ant.util.Fi

16、leUtils; 12.import org.dom4j.Document; 13.import org.dom4j.Element; 14.import org.dom4j.io.SAXReader; 15. 16. 17./* 18. * 类说明: 分析.classpath 文件的 jar 引用,并 copy 到 war19. * 创建时间: 2007-10-31 下午 02:23:4220. * author Seraph21. * email: 22. */ 23.public class AntPathTask extends Task 24. 25. private static final S

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号