BuildSql Ant自定义任务传参

在实际应用中

工程的目录结构以及所需的jar包如下:

1.自定义Ant任务:DefAntTask.java

自定义Ant任务一般来说需要继承Task类,但是这不是必须,只要DefAntTask中有public void execute()方法就行了。

package com.hsp.tasks;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class DefAntTask{
	
	private String name;
	
	private String password;
	
	private File destfile;
	
    private List<BuildTask> generators = new ArrayList<BuildTask>();
	
	public  void execute(){
		/**
                 问题1: BUILD FAILED
           G:\workspace\DefAntTaskTest_03\build.xml:48: taskdef class com.hsp.tasks.DefAntTask cannot be found
           using the classloader AntClassLoader[]
                解决:在自定义任务中 正确配置classpath 即可
		 */
		
		System.out.println("def Ant task....");
		
		System.out.println("name:"+name);
		System.out.println("password:"+password);
		
		System.out.println(destfile.getAbsolutePath());
		
		for (BuildTask task : generators) {
			task.test(); 
		}
	}
	/**
	 *  1.<hkTask /> :会导致调用createHkTask 方法创建一个hkTask
	 *  2.createHkTask必须有返回值,返回一个hkTask任务
	 */
	public BuildTask createHkTask() {
		BuildTask buildTask = new HKBuildTask();
		generators.add(buildTask);
		return buildTask; 
	}

	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;
	}


}

2.编写一个接口 BuildTask.java

package com.hsp.tasks;

public interface BuildTask{ 
	/**
	 * 测试方法
	 */
    public void test();	

}

3.编写接口BuildTask的实现类 HKBuildTask.java

package com.hsp.tasks;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

public class HKBuildTask extends Task implements BuildTask{
  
	@Override
	public void test() {
		log("exec  hkTask  test method .....");
		
	}
	@Override
	public void execute() throws BuildException {
		log("exec hkTask execute method....");
	}


}

4.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执行日志,输出到指定文件,目录log要提前创建好-->
	<record name="D:/log/test.log" loglevel="info" append="no" action="start" />

	<property name="build.classes" location="build/classes" />

	<property name="build.libs" location="lib" />
	<echo message="输出lib目录的完成路径:">${build.libs}</echo>

	<target name="init">
		<mkdir dir="${build.classes}" />
	</target>

	<path id="classpath">
		<pathelement location="${build.classes}"/>
		<fileset dir="${build.libs}">
			<include name="**/*.jar" />
		</fileset>
	</path>

	<target name="compile" depends="init">
		<!--编译 实现的自定义任务DefAntTask.java,生成的class文件位于${build.classes}中-->
		<javac srcdir="src" destdir="${build.classes}" includeantruntime="false">
			<classpath refid="classpath" />
		</javac>
	</target>

	<target name="execute" depends="compile">
		<!--定义任务-->
		<taskdef name="defAntTask" classname="com.hsp.tasks.DefAntTask" >
	       <classpath refid="classpath"></classpath>
		</taskdef>
		<!--调用执行自定义任务,并且向任务类传递属性-->
		<defAntTask name="gaoweigang" password="123456" destfile="./src">
			<hkTask /><!--调用DefAntTask类中createHkTask() 创建任务hkTask-->z
		</defAntTask>
	</target>

</project>

5.执行构建文件build.xml,输出如下:


 

可能遇到的问题:
1.ant编译中出现“includeantruntime was not set”警告的问题,如下:

 [javac]  G:\workspace\DefAntTaskTest_03\build.xml:32: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

解决:

执行ant编译时,总会出现如下的警告:

[javac] D:\SnowPad\build.xml:26: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

虽然不影响编译,但还是解决才安心。其实解决方法也很简单,只需要根据提示在javac任务中添加includeAntRuntime="false"属性即可。例如:

修改前:

    <javac srcdir="${srcDir}" destdir="${binDir}" />

修改后:

    <javac srcdir="${srcDir}" destdir="${binDir}" includeAntRuntime="false" />

注:

①.对于includeAntRuntime属性,官方的解释如下:

    Whether to include the Ant run-time libraries in the classpath; defaults to yes, unless build.sysclasspath is set. It is usually best to set this to false so the script's behavior is not sensitive to the environment in which it is run.

②.此警告在较早的ant版本中可能不会出现,当前用的版本是:Apache Ant(TM) version 1.8.2 compiled on December 20 2010。所以此问题跟ant版本有关。

2.[javac] 注意:G:\workspace\DefAntTaskTest_03\src\com\hsp\tasks\DefAntTask.java 使用了未经检查或不安全的操作。
   [javac] 注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
解决:

在jre1.6的环境中,范型的使用都会报类似警告

即支持范型的容器应该定义范型类型然后再使用,或者,在方法前加一个忽略注释:

1. 定义范型类型,注意对应的getters 与setters方法也需要加范型

ArrayList<String> al=new ArrayList<String>();  

2. 方法前加入 忽略注释

@SuppressWarnings("unchecked") 

猜你喜欢

转载自weigang-gao.iteye.com/blog/2199608