为Ant开发扩展任务

原文:http://lujar.iteye.com/blog/154490

关于Ant的调试:

如何在eclipse中调试自定义的anttaskhttp://blog.csdn.net/onlyerlee/article/details/2260063

创建并调试自定义的AntTask:http://blog.csdn.net/caesarzou/article/details/5672415

第二篇调试文章,会说出第一篇文章的不足,并提供更好的方式。

ant学习笔记—自定义Ant任务:http://blog.csdn.net/jackkp_catus/article/details/2295612

两种方式

为Ant实现扩展任务其实是非常容易的,只需按照以下几个步骤即可:

1.创建一个Java类继承org.apache.tools.ant.Task类;

2.对每个属性实现set方法。Ant会根据需要自动完成类型转换;

3.如果扩展的任务需要嵌套其它的Task,那么这个Java类必需实现接口org.apache.tools.ant.TaskContainer;

4.如果扩展的任务要支持Text,需要增加一个方法voidaddText(String);

5.对每个嵌套的元素,实现create、add或addConfigured方法;

6.实现publicvoidexecute方法;

7.在build.xml文件中使用<taskdef>来引用自定义的Task。

下面以一个简单的例子来说明如何为Ant增加一个hello任务,它可以连续打印多条信息,打印的次数由属性count指定,而打印的内容则由它内嵌的一个helloinfo任务的message属性指定,看上去这非常类似JSP中自定义标签的一些概念,实现代码如下:

//HelloInfoTask.java

package com.sharetop.antdemo;

import org.apache.tools.ant.*;

public class HelloInfoTask {
	private String msg;

	public void execute() throws BuildException {
		System.out.println(msg);
	}

	public void setMessage(String msg) {
		this.msg = msg;
	}
}

下面是外部Task类的代码:

//HelloTask.java

package com.sharetop.antdemo;

import org.apache.tools.ant.*;

public class HelloTask extends Task implements org.apache.tools.ant.TaskContainer {
	private Task info;
	private int count;

	public void execute() throws BuildException {
		for (int i = 0; i < count; i++)
			info.execute();
	}

	public void setCount(int c) {
		this.count = c;
	}

	public void addTask(Task t) {
		this.info = t;
	}
}

实现了这两个Task,在build.xml文件中定义它的taskname,就可以在Target中执行它了。如果你不想使用<taskdef>标签来定义Task,也可以通过修改default.properties文件来实现引入新Task,这个文件位于org.apache.tools.ant.taskdefs包里。下例是一个使用标签来引入新Task的Build文件部分:

第一种方式:

<target name="hello" depends="client">
	<taskdef name="hello" classname="com.sharetop.antdemo.HelloTask" classpath="client.jar" />
	<taskdef name="helloinfo" classname="com.sharetop.antdemo.HelloInfoTask" classpath="client.jar" />
	<hello count="3">
		<helloinfo message="hello world" />
	</hello>
</target>

另一种方式:http://blog.csdn.net/wangjun_pfc/article/details/4425495

不同的是把taskdef定义在target的外部

<path id="xdoclet.task.classpath">
         <fileset dir="${xdoclet.home}/lib">
         <include name="**/*.jar"/>
         </fileset>
         <fileset dir="${xdoclet.home}/plugins">
         <include name="**/*.jar"/>
         </fileset>
   </path>
    <taskdef
       name="xdoclet"
       classname="org.xdoclet.ant.XDocletTask"
       classpathref="xdoclet.task.classpath"
    />

定义完任务之后,就可以来使用它了,如:

   
<target name="生成Hibernate配置文件">
       <xdoclet>
           <fileset dir="${src.dir}/com/bjsxt/oa/model">
              <include name="**/*.java"/>
           </fileset>       
           <component
              classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
              destdir="${src.dir}"
              version="3.0"
              hbm2ddlauto="update"
              jdbcurl="jdbc:mysql://127.0.0.1/oa_200706"
              jdbcdriver="com.mysql.jdbc.Driver"
              jdbcusername="root"
              jdbcpassword="mysql"
              dialect="org.hibernate.dialect.MySQLDialect"
              showsql="true"
           />
       </xdoclet>
    </target>

ant

相关推荐