创建自定义的任务
为实现一个简单的自定义任务,我们所需做的就是扩展
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任务通常通过实现`org.apache.tools.ant.Task`接口或者继承`org.apache.tools.ant.TaskAdapter`类来完成。首先,我们需要创建一个Java类,...
#### 五、使用自定义任务扩展 Ant Ant 允许开发者编写自定义任务,这些任务可以封装复杂的逻辑,从而简化构建文件的编写。 ##### 5.1 创建自定义任务 1. **定义任务类**:创建一个继承自 `org.apache.tools.ant....
在Ant的世界里,自定义任务是扩展其功能的关键方式之一,允许开发者根据特定项目需求创建自己的构建步骤。Ant是Apache软件基金会的一...在实际开发过程中,不断探索和实践自定义任务,将使你的Ant使用技能更上一层楼。
本话题将深入探讨如何利用Ant的可扩展性,自定义一个Task来验证POM(Project Object Model)文件中的版本依赖。 POM是Maven项目的核心配置文件,它包含了项目的元数据,如项目名称、版本、依赖关系等。在大型项目中...
这时,我们可以自定义Ant Task,扩展Ant的功能。本教程将通过一个简单的实例,讲解如何创建和使用自定义Ant Task。 首先,理解Ant Task的基本结构。一个自定义Task通常继承自`org.apache.tools.ant.Task`类,并重写...
通过学习Ant,Java开发者可以更加高效地管理项目构建过程,同时借助Ant提供的丰富任务集,可以扩展自定义任务,实现特定的构建逻辑。Ant的灵活性还体现在它可以通过引入第三方库来实现各种自定义任务,例如进行代码...
这些自定义任务可以扩展Ant的功能,满足特定项目需求。例如,你可以创建一个任务来执行特定的数据库操作、生成报表或是任何其他非标准构建任务。 下面是一个简单的自定义Ant任务的Java代码示例: ```java import ...
3. **可配置性**:用户可以根据自己的需求自定义任务,或者通过引入第三方任务库来扩展功能。 4. **跨平台**:由于其基于Java,Ant可以在任何安装了Java运行环境的平台上运行,这极大地方便了跨平台的开发工作。 在...
Ant内置了大量预定义的任务,同时也允许用户自定义任务以满足特定需求。一些常见的Ant任务包括`<copy>`(复制文件或目录)、`<javac>`(编译Java源代码)、`<mkdir>`(创建目录)和`<jar>`(创建JAR文件)等。 让...
Ant是Apache软件基金会的一个开放源码项目,是一个基于Java的构建工具,它的设计...Ant的简单性和可扩展性使其成为Java开发中的一个强大工具,无论你是初次接触还是希望替换现有的构建系统,Ant都是值得考虑的选择。
### 厂家自定义Ant编译流程源码分析 #### 一、Ant简介与安装配置 Ant(Apache Ant)是一种Java平台上的自动化构建工具,主要用于编译、测试、部署等任务,支持跨平台操作。它通过XML脚本来定义构建过程,能够执行...
- Ant可以通过扩展机制添加自定义任务或类型,这通常通过实现特定接口或继承特定基类来实现。 - Maven和Gradle等现代构建工具也支持Ant任务,使得在这些工具中使用Ant变得可能。 9. **Ant实战应用** - 在实际...
7. **Ant的类加载器**:理解Ant如何加载类,特别是自定义任务和插件,以及如何配置类加载器以处理特定的依赖。 8. **宏定义(Macrodef)**:掌握如何创建可重用的宏定义,以简化构建脚本,提高代码复用性。 9. **...
同时,用户也可以自定义任务来扩展Ant的功能。 3. **Property**:属性是Ant中用来存储值的变量,它们可以在整个构建过程中被引用。例如,`src.dir`可以定义为源代码目录,`dest.dir`可以定义为目标输出目录。 4. *...
Ant使用XML来描述构建过程和依赖关系,因此,它是一个平台无关的构建工具,可以在任何操作系统上运行。Ant Task则是Ant中的基本工作单元,它们是执行特定构建任务的类,比如编译源代码、打包、部署等。 AntTask.jar...
自定义任务打包则允许开发者扩展Ant的功能,创建自己的任务类。这可以通过继承Ant内置的任务类或者实现Task接口来完成。自定义任务可以处理特定的业务逻辑,如生成版本信息、执行特定的脚本或集成第三方工具。例如,...
4. **自定义任务**:Ant允许通过Java类来定义自定义任务,这扩展了Ant的功能,使其能够处理特定项目的需求。 5. **依赖管理**:在Ant中,你可以定义目标间的依赖关系,确保构建顺序正确。例如,编译目标通常依赖于...
Ant使用XML格式编写构建脚本,这种格式使得脚本易于理解和维护。一个基本的Ant脚本包含项目(Project)、目标(Target)和任务(Task)元素。项目定义了整个构建的上下文,目标是一系列任务的集合,任务则是实际执行...