Ant
自带了大量的任务
(Task)
,在网上也有大量的任务可用,可是如果你面对的是别人根本不会想到的问题,怎么办呢?其实,只要花一点点功夫就可以编写出自己的任务出来。我开始也没想到会这样简单(做嵌套任务碰到一点问题),由此可见
Ant
的结构设计是相当优秀的。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
假设我们需要显示任务执行各花了多少时间,写一个
TimerTask
起步:覆盖
org.apache.tools.ant.Task
的
execute
方法
import
org.apache.tools.ant.Task;
import
org.apache.tools.ant.BuildException;
public
class
TimerTask
extends
Task
{
public
void
execute()
throws
BuildException
{
System.out.println(
"I am a timer"
);
}
}
注意,编译时
ant.jar
必须在
Classpath
上。
简单起见,假设
Java
源文件
,
类文件在同一目录下,在此目录再写一个
build.XML
文件:
<?xml version="1.0" ?>
<project
name=
"testTimer"
default=
"test"
basedir=
"."
>
<taskdef
name=
"timer"
classname=
"TimerTask"
classpath=
"."
/>
<target
name=
"test"
>
<timer
/>
</target>
</project>
打开
Dos
窗口,到此目录,运行
ant
够简单吧!如果类路径比这复杂或者在
jar
文件中,设置
<taskdef>
的
classpath
属性就行了。
继续:设置属性
假设我们想添加一个
action
属性,在
Java
文件中:
private String action;
….
public void execute() throws BuildException {
if (action.equals(“init”)) {
…
}
…
}
public String getAction() {
return action;
}
public void setAction(String string) {
action = string;
}
在
xml
文件中:
<timer action=”init” />
使用
Project
保存中间结果
对于这个任务来讲,必须把时间值保存起来,比较合适的就是
org.apache.tools.ant.Project
了,
Project
对象生命期是整个
Build
,并且可以通过
setProperty, getProperty
等方法保存
/
获取值。
public
void
execute()
throws
BuildException
{
if
(getOwningTarget()
==
null
)
return
;
Project
proj
=
getOwningTarget().getProject();
…
// can do smt with proj now
}
晋级:嵌套任务
如果我们想要在
Timer
下面再嵌套子任务(好像没有这个必要
:-
):
<timer action=”init” >
<foo />
</timer>
那我们首先只需要写一个简单的
FooTask
,然后在
build.xml
加上
<foo>
的定义
:
<taskdef
name=
"timer"
classname=
"TimerTask"
classpath=
"."
/>
<taskdef
name=
"foo"
classname=
"FooTask"
classpath=
"."
/>
然后给
TimerTask
添加一个方法:
public void addFoo(FooTask foo) {
}
注意:
addXXX
的
XXX
由
<taskdef>
中的
name
决定,
Ant
会利用
Java Reflection
去找;类型必须是具体的类型
FooTask
,不能是
Task
。
结束:全部代码:
(问什么不能带附件?)
TimerTask.Java
:
import
java.util.*;
import
org.apache.tools.ant.Task;
import
org.apache.tools.ant.Project;
import
org.apache.tools.ant.BuildException;
/**
*
TimerTask.java
*
<p>
Copyright:
Copyright
(c)
2003
你可以对本程序随意修改,复制,使用,但请保留这里注释声明!!!
</p>
*
@author
李尚强
blundblade@sina.com
*/
public
class
TimerTask
extends
Task
{
private
List
fooList
=
new
ArrayList();
private
String
action
=
""
;
//init, print
private
static
final
String
TIME_PROPERTY_INTERNAL
=
"timer.msecs"
;
private
static
final
String
TIME_PROPERTY_NAME
=
"timer.passed"
;
public
void
execute()
throws
BuildException
{
System.out.println(
"I am a timer"
);
System.out.println(
"but there are so many foos: "
+
fooList);
if
(
this
.getOwningTarget()
==
null
)
return
;
Project
proj
=
this
.getOwningTarget().getProject();
String
strTime
=
proj.getProperty(TIME_PROPERTY_INTERNAL);
try
{
long
currMSecs
=
System.currentTimeMillis();
if
(action.equals(
"print"
)){
if
(strTime
==
null
)
proj.setProperty(TIME_PROPERTY_NAME,
"Timer not initilized"
);
else
{
long
startMSecs
=
Long.parseLong(strTime);
long
passedSecs
=
currMSecs
-
startMSecs;
int
minutes
=
(
int
)
(
passedSecs
*
1.0
/
(1000
*
60
*
60)
);
int
hours
=
minutes
/
60;
minutes
=
minutes
%
60;
strTime
=
hours
+
" hours "
+
minutes
+
" minutes"
;
proj.setProperty(TIME_PROPERTY_NAME,
strTime);
}
}
else
if
(action.equals(
"init"
))
{
proj.setProperty(TIME_PROPERTY_INTERNAL,
Long.toString(currMSecs));
}
}
catch
(NumberFormatException
nfe)
{
throw
new
BuildException(nfe.getMessage());
}
}
public
void
addFoo(FooTask
foo){
fooList.add(foo);
}
/**
*
@return
*/
public
String
getAction()
{
return
action;
}
/**
*
@param
string
*/
public
void
setAction(String
string)
{
action
=
string;
}
}
FooTask.Java
:
/*
* Created on 2004-4-17
*
*/
import
org.apache.tools.ant.Task;
/**
*
FooTask.java
*
<p>
Copyright:
Copyright
(c)
2003
你可以对本程序随意修改,复制,使用,但请保留这里注释声明!!!
</p>
*
@author
李尚强
blundblade@sina.com
*/
public
class
FooTask
extends
Task
{
private
String
name
=
""
;
/**
分享到:
相关推荐
自定义Ant任务通常通过实现`org.apache.tools.ant.Task`接口或者继承`org.apache.tools.ant.TaskAdapter`类来完成。首先,我们需要创建一个Java类,然后在这个类中实现`execute()`方法,这个方法将在Ant运行时被调用...
通过自定义Ant任务,你可以实现各种复杂的功能,如自动化测试、代码分析、系统集成等,使得Ant能够更好地适应你的项目需求。记住,良好的Ant脚本组织和清晰的任务定义有助于提高项目维护性和可扩展性。在实际开发...
在这个方法中,你可以编写自定义的任务逻辑。 下面是一个名为`HelloWorldTask`的简单示例: ```java import org.apache.tools.ant.Task; public class HelloWorldTask extends Task { public void execute() { ...
总之,自定义Ant任务能帮助我们扩展Ant的功能,更好地适应项目需求。同时,通过编写单元测试,我们可以确保任务行为的正确性,减少因构建错误导致的问题。这不仅提升了开发效率,也增强了代码的可靠性。对于大型项目...
用户可以通过编写自定义任务来扩展Ant的功能,以适应特定项目的需求。 `ant.jar`是Apache Ant的核心库,包含了所有内置任务和核心功能的实现。当你在命令行中运行`ant`命令时,实际上是执行了这个jar包中的`org....
8. 自定义Ant任务:Ant允许用户通过Java编写自定义任务来满足特定的构建需求。自定义任务的编写涉及到Java编程知识,需要掌握Ant的API和XML处理技术。 在实际应用中,Ant作为一个成熟且稳定的构建工具,已被许多...
自定义任务打包则允许开发者扩展Ant的功能,创建自己的任务类。这可以通过继承Ant内置的任务类或者实现Task接口来完成。自定义任务可以处理特定的业务逻辑,如生成版本信息、执行特定的脚本或集成第三方工具。例如,...
同时,用户也可以自定义任务来扩展Ant的功能。 3. **Property**:属性是Ant中用来存储值的变量,它们可以在整个构建过程中被引用。例如,`src.dir`可以定义为源代码目录,`dest.dir`可以定义为目标输出目录。 4. *...
开发者可以根据项目需求选择并引入合适的Ant任务库,通过编写XML格式的构建脚本来实现自动化构建流程。理解如何有效地利用这些任务库,对于优化Java项目的构建过程,提高开发效率至关重要。在实际操作中,我们需要...
开发者可以根据需要编写自定义任务,扩展Ant的功能。 三、依赖关系与目标(Targets) 在build.xml中,任务通常组织成目标(Targets),每个目标代表一个特定的构建阶段。目标之间可以有依赖关系,Ant会按照依赖顺序...
Ant允许用户通过Java编写自定义任务,以扩展其功能。宏定义(MacroDef)则是为常见任务提供模板,简化脚本编写。 七、属性(Properties) 属性在Ant中用于存储值,可以在脚本中引用和传递。它们可以是全局的,也...
"Ant入门"可能是这个压缩包中的主要教程或者指南,它可能涵盖了Ant的基本概念、安装步骤、XML配置文件的结构、常用任务的使用方法以及如何编写自定义任务等内容。在Ant的学习过程中,了解这些基础知识是非常关键的。...
编写自定义 Ant 任务相对简单,这使得 Ant 能够根据特定需求进行定制。 在 Ant 的历史中,它最初是作为 Tomcat(一个 Java Servlet 和 JSP 容器)的一部分。随着 Tomcat 成为 Apache Jakarta 项目的一部分,Ant ...
Ant 允许开发者编写自定义任务,这些任务可以封装复杂的逻辑,从而简化构建文件的编写。 ##### 5.1 创建自定义任务 1. **定义任务类**:创建一个继承自 `org.apache.tools.ant.Task` 的类,并重写 `execute()` ...
当内置任务无法满足需求时,Ant允许你编写自定义任务。你可以通过继承Ant提供的Task类,创建自己的Java类来实现特定功能。 **第三方Ant任务** 除了官方提供的任务,Ant社区还发展出大量的第三方任务,覆盖了各种...
书中会深入探讨各种内置任务的用法,并演示如何编写自定义任务。 依赖管理是Ant的一个关键特性,它允许开发者声明任务间的依赖关系,确保构建顺序正确。此外,Ant还提供了对文件集(filesets)的支持,可以方便地...
开发者可以通过自定义Ant任务或者使用现有任务的扩展属性,来定制文件传输的行为,比如设置超时、重试策略、错误处理等。 在实际使用JavaAnts时,用户需要编写一个Ant构建文件(通常是build.xml),在这个文件中...