`
weigang.gao
  • 浏览: 482405 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Ant自定义任务 Example

 
阅读更多

 作为现在Java构建工具中事实上的标准,Ant被设计成可以通过Java类进行扩展,而且只需要很少的Java代码,就可以编写一个新的Ant任务。其实编写一个 Ant任务非常简单,只需要编写一个带有一个execute()方法的Java类就行了。

package com.hsp.tasks;
public class DefAntTask{	
	public  void execute(){
		System.out.println("def Ant task....");			
	}
}

这个Java不需要扩展任何基类,只需要一个方法就行:execute( )。但这个方法必须是公有的(public),没有参数,而这个类必须能通过无参的构造函数实例化。这个方法可以有返回值,但是会被忽略并且产生一个警告信息。任务在执行过程中可以有System.out和System.err的输出,但是会被Ant截获并按照适当的日志级别输出到控制台,当然也可以配置让日志输出到文件中。

<taskdef>标签用于自定义一些任务,从而将第三方的任务集成到构建文件中。你可以在目标(<target>)之外声明<taskdef>,以便把这些任务定义成全局任务,这样在就可以像使用 Ant 的核心任务一样使用这个自定义的任务了。不过任务的类文件必须位于其可见的classpath内。为了可以在一个构建过程中使用编译过的任务,<taskdef>必须出现在编译之后。如下build.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- ====================================================================== 
     2015年3月29日 下午10:20:43                                                        

     project    
     description
                   
     gaoweigang                                                                
     ====================================================================== -->
<project name="project" default="execute">
    <description>
            description
    </description>
	<!--Ant执行日志-->
    <record name="D:/log4j.log" loglevel="info" append="no" action="start"/>
	
	<property name="build.dir" location="build"></property>
	
	<target name="init">
	    <mkdir dir="${build.dir}"/>
	</target>
    
	<target name="compile" depends="init">
		<!--编译 实现的自定义任务DefAntTask.java,生成的class文件位于${build.dir}中-->
	    <javac srcdir="src" destdir="${build.dir}" ></javac>
	</target>
	
	<target  name="execute"  depends="compile">
		<!--定义任务-->
	    <taskdef  name="DefAntTask" classname="com.hsp.tasks.DefAntTask" classpath="${build.dir}" />
		<!--调用执行自定义任务-->
		<DefAntTask/>
	</target>
	
</project>
1.1   任务的生命周期

下面是Ant任务的生命周期,构建过程从装载Ant和解析构建文件开始:

  • 当Ant 解析构建文件时,对文件中声明的每个任务,通过不带参数的构造函数建立一个恰当的Task的子类的实例。      
  • Ant传递一些信息给任务,包括任务所在的工程和目标、以及其他一些次要细节,例如它出现在构建文件中的行数。
  • Ant调用Task类的init( )函数。大多数任务都不重写这个函数。
  • Ant按照自己的方式,一次执行目标(就是依据depends属性指定的顺序) 一个目标中的任务得以逐个执行。对于每一个任务,Ant先根据构建文件的属性和元素的值对其进行配置,然后调用其execute( )函数。

Ant内部使用TaskAdapter,一个派生自org.apache.tools.ant.Task的任务适配器来处理那些不扩展Task类的任务。适配器中有个Object实例,并会调用任务对象的execute( )方法。

 

2.Ant API

现在我们就来了解一下Ant中主要的API,作为开发者的我们需要经常和它们打交道。

2.1 Task

抽象类org.apache.tools.ant.Task是Ant任务最常用的基类,是Ant构建过程中的主要工作单元。Task类通过保护类型成员变量project,提供对project对象的访问。还有log方法则可以将输出传给Ant进程。Task类中主要是init()和execute()方法需要重载,而log()方法(log(String msg, int msgLevel)和log(String msg))主要是用于调用,它是调用project对象的log函数。其中有五个日志级别(按优先级排列):

  • MSG_ERR
  • MSG_WARN
  • MSG_INFO
  • MSG_VERBOSE
  • MSG_DEBUG

2.2 Project

String  getProperty(String name):返回某个Ant特性的值,如果不存在这个特性,则返回null。

Void  setNewProperty(String name,  String value):给一个特性赋值,但要记住Ant中的特性是不可变更的。所以这个方法在这个特性存在的情况下,就什么都不作。

File getBaseDir():这个函数返回工程的基准目录(base directory)。它对解析相对路径非常有用,虽然在实际中用的并不多,因为Ant的文件和路径已经具有了自动展开的功能。

File resolveFile(String filename):这个函数根据文件名返回带有绝对路径的File对象。假如文件名是个相对值,则它会根据工程的基准目录进行解析。

 

2.3 Path

String toString():返回经过完全解析的、且平台相关的完整路径信息。

static String[]  translatePath(Project project , String path):这个工具函数根据某个路径分解得到路径元素数组,那个路径包含着由冒号或者分号分隔开来的路径元素。

int size():返回Path实例中路径元素的数量。

String[] list():返回Path实例中路径元素数组。

2.4 Fileset

 

2.5 DirectoryScanner

 

2.6 EnumeratedAttribute

 

2.7 FileUtils

 

3.属性

XML属性其实就是一个名值对。假如你现在有一个 任务,仅有一个属性name:

       <DefAntTask  name=”gaoweigang”/>

这个任务有个setName的函数:

       private  String  name;

       public  void  setName(String  name) {

              this.name = name;

       }

这和JavaBean的命名风格很相似,每个特性都对应一个读写器(setter/getter)。属性的内省机制支持Java的基本类型和包装类型,而类型之间的转换出现错误的话,将抛出NumberFormatException异常,构建过程将停止。

通过实现一个以java.io.File参数的设值函数,Ant提供了对文件或者目录属性内置的支持,它可以将构建文件中的相对目录解析为绝对路径。

<DefAntTask  destdir =”descFile”/>

对应的任务就实现了setDestDir函数:

private  File  destFile;

public  void  setDestDir(File  destFile) {

       this.destFile  =  destFile;

}

例如:工程目录结构如下:


 

①实现自定义任务

package com.hsp.tasks;

import java.io.File;

public class DefAntTask{
	
	private String name;
	
	private String password;
	
	private File destfile;
	
	public  void execute(){
		System.out.println("def Ant task....");
		
		System.out.println("name:"+name);
		System.out.println("password:"+password);
		
		System.out.println(destfile.getAbsolutePath());
				
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public File getDestfile() {
		return destfile;
	}

	public void setDestfile(File destfile) {
		this.destfile = destfile;
	}


}

②在build.xml使用自定义任务

<?xml version="1.0" encoding="UTF-8"?>
<!-- ====================================================================== 
     2015年3月29日 下午10:20:43                                                        

     project    
     description
                   
     gaoweigang                                                                
     ====================================================================== -->
<project name="project" default="execute">
    <description>
            description
    </description>
	<!--Ant执行日志-->
    <record name="D:/log4j.log" loglevel="info" append="no" action="start"/>
	
	<property name="build.dir" location="build"></property>
	
	<target name="init">
	    <mkdir dir="${build.dir}"/>
	</target>
    
	<target name="compile" depends="init">
		<!--编译 实现的自定义任务DefAntTask.java,生成的class文件位于${build.dir}中-->
	    <javac srcdir="src" destdir="${build.dir}" ></javac>
	</target>
	
	<target  name="execute"  depends="compile">
		<!--定义任务-->
	    <taskdef  name="DefAntTask" classname="com.hsp.tasks.DefAntTask" classpath="${build.dir}" />
		<!--调用执行自定义任务,并且向任务类传递属性-->
		<DefAntTask name="gaoweigang" password="123456" destfile="./src"/>
	</target>
	
</project>

 ③执行构建,日志输出如下:


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<?xml version="1.0" encoding="UTF-8"?>

<project basedir="." default="builddatabase">

<!-- ================================================================== -->

<!-- 其他配置 -->

<!-- ================================================================== -->

<property file="build_database.properties" />

<path id="toolslib">

<!--定义java编译结果.class文件的跟目录 -->

<pathelement location="${depend_classes_folder}" />

<!-- 需要使用的第三方jar存放目录 -->

<fileset dir="${depend_libs_folder}">

<include name="**/*.jar" />

</fileset>

</path>

<target name="builddatabase">

<taskdef name="buildToolTask" classname="com.ling2.build.ant.BuildToolTask"

classpathref="toolslib" />

<!-- destdir属性可以在各输出属性中分别指定,这里是全局指定 -->

<buildToolTask database_configfile="${database_configfile}"

config_rootfolder="${config_rootfolder}" errolist_configfile="${errolist_configfile}"

svn_rootfolder="${depend_svn_rootfolder}" result_rootfolder="${depend_result_rootfolder}"

publish_filename="${publish_filename}" database_name="${database_name}">

<hkTask />

</buildToolTask>

</target>

 

</project>

 

参考:http://blog.csdn.net/jackkp_catus/article/details/2295612

  • 大小: 14.4 KB
  • 大小: 7.8 KB
分享到:
评论

相关推荐

    Ant自定义任务

    本文将深入探讨“Ant自定义任务”的概念、实现方式以及实际应用。 Ant是基于XML的构建工具,其主要任务定义在名为`build.xml`的文件中。默认情况下,Ant提供了一系列内置的任务,如编译Java源代码、打包JAR文件、...

    [北京圣思园Ant深入详解]_004.实现自定义Ant任务

    在Ant的世界里,自定义任务是扩展其功能的关键方式之一,允许开发者根据特定项目需求创建自己的构建步骤。Ant是Apache软件基金会的一个项目,它是一个基于Java的构建工具,广泛用于管理Java项目的构建、编译、测试和...

    记录一个关于如何实现Ant自定义task,并且进行有效单元测试的例子

    首先,理解Ant的自定义任务机制。Ant允许开发者通过继承`org.apache.tools.ant.Task`类或`org.apache.tools.ant.UnknownElement`类来创建自己的任务。这些自定义任务可以扩展Ant的功能,满足特定项目需求。例如,你...

    自定义AntTask简单实例

    Ant的核心功能包括编译、测试、打包和部署等,但有时这些预定义的任务并不能满足特定项目的需求。这时,我们可以自定义Ant Task,扩展Ant的功能。本教程将通过一个简单的实例,讲解如何创建和使用自定义Ant Task。 ...

    ant发送邮件依赖jar包.rar

    在上面的Ant脚本中,`taskdef`任务定义了一个自定义任务`sendmail`,这个任务是由你的`SendEmailTask`类实现的,这个类应该利用JavaMail API来发送邮件。`send-email`目标使用了`sendmail`任务,提供了SMTP服务器...

    ANT的常用标签练习

    它需要`name`属性指定任务名,`classname`属性指定自定义任务类的全限定名。 3. 在build.xml中像使用内置标签一样使用自定义任务。 例如,如果你有一个自定义的`&lt;myTask&gt;`标签,你可以在build.xml中这样使用: ```...

    ant配置ant配置

    在实际项目中,为了提高效率和代码复用,往往还会使用`macrodef`元素定义宏,这可以创建自定义的任务模板。例如,定义一个用于打包JAR的宏: ```xml &lt;attribute name="Main-Class" value="com.example....

    ant.jar最新包

    它还支持自定义任务,允许开发者编写自己的 Java 类来扩展 Ant 的功能。 总之,Ant.jar 是 Java 开发中不可或缺的工具,它为开发者提供了一种强大且灵活的方式来自动化构建流程,无论是简单的编译还是复杂的部署,...

    apache-ant-1.8.4

    此外,Apache Ant支持自定义任务和扩展,可以通过实现Task接口或者使用Ant Task的现有库(如Ivy用于依赖管理)来增强其功能。Ant的灵活性使得它可以与其他工具(如Maven、Gradle)集成,提供更复杂的构建流程。 ...

    apache-ant-1.7.1

    6. 自定义任务和属性 Ant允许定义自定义的任务和属性,通过编写Java类扩展Ant的任务接口,或者使用`&lt;property&gt;`标签来定义和引用属性,实现更灵活的构建逻辑。 7. 类库依赖管理 Ant 1.7.1虽然没有内置依赖管理功能...

    ant 标签详细解释

    ### ant 标签详细解释 #### 一、`&lt;project&gt;` 标签 ...以上就是对 Ant 构建工具中几个关键标签的详细介绍,这些标签在构建过程中发挥着重要的作用,熟练掌握它们的用法可以帮助我们更高效地完成构建任务。

    ant-javamail-1.6.jar.zip

    Ant的灵活性在于其可扩展性,可以通过自定义任务或者利用已经存在的任务库来满足特定需求。而ant-javamail-1.6.jar就是Ant的一个扩展,它提供了对JavaMail的支持,让Ant能够处理邮件相关的任务。 JavaMail API是...

    JUnit&Ant JUnit&Ant

    5. **自定义任务**:除了内置任务,开发者还可以创建自定义任务以满足特定需求。 6. **外部工具集成**:Ant 可以轻松调用外部工具,如 JUnit,进行测试。 **JUnit 与 Ant 结合使用** 在Java项目中,JUnit 通常与 ...

    J2EE中应用Ant包压缩导出的Excel文件并提供下载

    这个类可能定义了一个自定义任务,接收Excel文件作为输入,然后将其压缩为ZIP格式。 `Java压缩zip示例.txt`文件则可能是关于如何在Java中使用标准`java.util.zip`包进行压缩操作的示例代码。这个包提供了`...

    ant-subdirtask.jar.zip

    使用SubdirTask时,你需要在Ant的构建脚本中引入这个自定义任务,并配置相应的属性。首先,将"ant-subdirtask.jar"添加到Ant的类路径中,这样Ant才能识别并加载这个任务。接着,在build.xml文件中定义SubdirTask,...

    ant-contrib-1.0b3-bin.jar

    "ant-contrib"库是由社区开发的一个非官方Ant扩展,它包含了一系列自定义的任务和条件,使得Ant在处理复杂的构建逻辑时更加得心应手。其中,"ant-contrib-1.0b3-bin.jar"是这个库的特定版本,它包含了执行循环、决策...

    Ant工具build文件使用的简单示范

    此外,Ant的可扩展性也很强,可以通过自定义任务或利用已有的Ant贡献任务来处理特定需求。 总之,Ant作为一款强大的Java构建工具,通过`build.xml`文件实现了构建过程的自动化,极大地提高了开发效率。对于初学者来...

    ant使用指南(中文)

    Ant的核心理念是“一切都是任务”,它通过预定义的任务和用户自定义的任务来完成各种构建任务。 ### 二、安装与配置 1. **下载**:访问Apache官方网站,下载最新版本的Ant。 2. **解压**:将下载的zip文件解压缩到...

    ant 发送Email

    3. **XML配置**:在build.xml中,定义一个自定义任务标签,如`sendmail`,并设置相关的属性,例如发件人、收件人、主题、正文以及SMTP服务器信息: ```xml &lt;mailhost&gt;smtp.example.com&lt;/mailhost&gt; &lt;from&gt;...

Global site tag (gtag.js) - Google Analytics