`
topzhujia
  • 浏览: 54281 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

使用自定义任务扩展Ant

阅读更多

创建定义的任务

为实现一个简单的自定义任务,我们所需做的就是扩展 org.apache.tools.ant.Task 类,并重写execute() 方法。因此,作为这个文件排序自定义任务的框架,我们将编写如下代码:

import org.apache.tools.ant.BuildException;

import org.apache.tools.ant.Task;

public class FileSorter extends Task {

// The method executing the task

public void execute() throws BuildException {}

}

注意我们声明 execute() 方法抛出一个 BuildException 异常。如果这个任务出了任何错误,我们将抛出这个异常以便向 Ant 指出故障。

大多数任务,不管是核心任务还是自定义任务,都利用属性来控制它们的行为。对于这个简单任务,我们需要一个属性来指定要排序的文件,需要另一个属性来指定排序内容的输出。我们把这两个属性分别叫做 file tofile

Ant 使得支持自定义任务中的属性非常容易。为此,我们只需实现一个具有特别格式化的名称的方法,Ant 能够使用生成文件中指定的对应属性的值来调用这个方法。这个方法的名称需要是 set 属性的名称,因此在这个例子中,我们需要名为 setFile() setTofile() 的方法。Ant 到生成文件中的一个属性设置时,它会寻找相关任务中具有适当名称的方法(称为 setter 方法)。

生成文件中的属性是作为字符串来指定的,因此我们的 setter 方法的参数可以是一个字符串。在这样的情况下,Ant 将在展开值所引用的任何属性之后,使用该属性的字符串值来调用我们的方法。

但有时我们想把属性的值看作是一种不同的类型。这里的示例任务就是这种情况,其中的属性值引用文件系统上的文件,而不只是引用任意的字符串。可以通过将方法参数声明为 java.io.File 类型来容易地做到这点。Ant 将接受属性的字符串值,并把它解释为一个文件,然后传递给我们的方法。如果文件是使用相对路径名称来指定的,则会被转换为相对于项目基目录的绝对路径。Ant 能够对其他类型执行类似的转换,比如 boolean int 类型。如果您提供具有相同名称但是具有不同参数的两个方法,Ant 将使用更明确的那一个方法,因此文件类型将优先于字符串类型。

这个自定义任务需要的两个 setter 方法类似如下:

// The setter for the "file" attribute

public void setFile(File file) {}

// The setter for the "tofile" attribute

public void setTofile(File tofile) {}

实现自定义的任务

使用前一小节开发的框架,现在我们能够完成这个简单的文件排序任务的实现:

import java.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 task

public void execute() throws BuildException {

System.out.println("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();

}

from.close();

// sort the list

Collections.sort(allLines);

// write out the sorted list

for (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 BuildException(e);

}

}

// The setter for the "file" attribute

public void setFile(File file) {

this.file = file;

}

// The setter for the "tofile" attribute

public void setTofile(File tofile) {

this.tofile = tofile;

}

}

两个 setter 方法简单地对属性的值排序,以便这些值能够在 execute() 方法中使用。这里,输入文件被逐行地读入一个列表中,然后被排序并逐行地输出到输出文件。注意,为简单起见,我们很执行错误检查 —— 例如,我们甚至没有检查生成文件是否设了必需的属性。不过我们的确至少捕捉了所执行的操作抛出的 I/O 异常,并将这些异常作为 BuildExceptions 重新抛出。

现在可以使用 javac 编译器或从某个 IDE 内编译这个自定义的任务。为了解决所使用的 Ant 类的引用问题,您需要把 ant.jar 文件的位置添加到 classpath 中。这个文件应该在 Ant 安装路径下的 lib 目录。

使用自定义的任务

现在我们已经开发和编译了这个自定义的任务,下面可以从生成文件中利用它了。

在能够调用自定义的任务之前,我们需要给它指定一个名称来 定义 它,并告诉 Ant 关于实现这个任务的类文件的信息,以及定位该类文件所必需的任何 classpath 设置。这是使用 taskdef 任务来完成的,如下所示:

<taskdef name="filesorter"

classname="FileSorter"

classpath="."/>

大功告成!现在可以像使用 Ant 的核心任务一样使用这个自定义的任务了。下面是一个完整的生成文件,它显示了这个自定义任务的定义和用法:

<?xml version="1.0"?>

<project name="CustomTaskExample" default="main" basedir=".">

<taskdef name="filesorter"

classname="FileSorter

classpath="."/>

<target name="main">

<filesorter file="input.txt" tofile="output.txt"/>

</target>

</project>

现在在当前工作目录中创建一个 input.txt 文件来测试这个自定义的任务。例如:

Hello there

This is a line

And here is another one

下面是运行上面的生成文件之后产生的控制台输出:

Buildfile: build.xml

main:

[filesorter] Sorting file=E:\tutorial\custom\input.txt

BUILD SUCCESSFUL

Total time: 0 seconds

注意 input.txt 的相对路径名称被转换成了当前目录中的一个绝对路径名称。这是因为我们将setter 方法的参数指定为 java.io.File 类型而不是 java.lang.String 类型。

现在看一下这个任务实际是否能工作。这时应该已经在同一目录中创建了名为 output.txt 的文件,

它包含以下内容:

And here is another one

Hello there

This is a line

您可以尝试指定一个不存在的输入文件,以确定该任务是如何向 Ant 报告 “file not found”异常的。

祝贺您:您现在已经开发和使用了一个自定义的 Ant 任务!创建更复杂的任务还会涉及其他许多方面,参考资料包含了指向此主题的进一步信息源的链接。

分享到:
评论

相关推荐

    Ant使用指南-Ant入门手册

    Ant是什么、Ant入门、Ant入门书籍、Ant入门手册、Ant资料、Ant文档、Ant使用指南 包括以下章节: Ant入门 Ant基础 运行Ant 生成一个简单的JAVA项目 文件系统操作 ...使用自定义任务来扩展Ant 结束语和参考资料

    Apache Ant入门教程

    Apache Ant 是一个基于 Java 的生成工具。据最初的创始人 James ...Ant 的其他关键优势包括其突出的简单性和无缝地使用自定义功能来扩展它的能力。但愿您在完成本教程其余内容的学习之后,会欣赏 Ant 的这些优势。

    Ant使用指南

    好东西不想一个人用,分享一下. &lt;br&gt;   本...或者,也许您熟悉 Ant 的基础,但是还想知 道诸如将生成文件链接起来、使用 CVS 知识库或编写自定义任务等高级主题;本教程将会介绍所有 这些主题。

    积分java源码-ydeploy:hybris构建和部署框架

    必要时,可以自定义和扩展该框架,以满足与管理 hybris 软件相关的各种其他操作任务。 为什么要部署? 在最基本的层面上,ydeploy 框架为您提供了一种简单的方法来执行以下任务: 构建并生成“一次构建,随处部署”...

    Spring-Reference_zh_CN(Spring中文参考手册)

    任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9...

    SenchaCmd-5.1.0.26-windows

    1.代码生成工具:代码生成工具生成整个应用程序并且扩展生成mvc的组件框架,如,使用sencha generate app 命令,可以自动帮你生成一个完成的应用程序目录框架。 2.JS编译:框架意识,Javascript 编译器了解Sencha的...

    java开发oa办公系统源码-Loocg-boot:开源的中后台模版项目

    复杂业务流程采用表单自定义,业务流程使用工作流来实现、扩展出任务接口,供开发编写业务逻辑。实现了流程任务节点和任务接口的灵活配置,既保证了公司流程的保密行,又减少了开发人员的工作量。 适用项目 Jeecg-...

    积分管理系统java源码-tzg-boot:tzg-boot

    复杂业务流程采用表单自定义,业务流程使用工作流来实现、扩展出任务接口,供开发编写业务逻辑。实现了流程任务节点和任务接口的灵活配置,既保证了公司流程的保密行,又减少了开发人员的工作量。 适用项目 Jeecg-...

    达内java培训目录

    Servlet/JSP Servlet生命周期及Servlet服务器、Tomcat部署配置、JSP语法、自定义标记、JSTL和EL表达式、JSP 新特性、Java Web 设计模式。 透彻理解Servlet核心原理;熟练掌握Servlet API;透彻理解JSP引擎工作原理;...

    tomcat6、7、8、9, maven3.5

    自定义Ant任务可以直接从build.xml脚本与管理器应用程序交互 的Apache Tomcat 4.0.x的。Apache Tomcat 4.0.6是旧的生产质量版本。4.0 servlet容器(卡塔利娜)已经从地上爬起来的灵活性和性能开发。4.0版实现了...

    Activiti5用户指南(中文版)

    1.4.2 Ant 1.8.1+ ......................................................................................................................................................... 1 1.4.3 Eclipse 3.6.2 .........

Global site tag (gtag.js) - Google Analytics