我写了两个不同的自定义蚂蚁任务。他们试图通过基类中的静态成员共享数据。这对我不起作用。
我假设我在Java中正确地使用了静态成员。我认为这是Java虚拟机的动态加载问题。不过,我对Java还比较陌生。
因为Ant自定义任务在运行时使用
taskdef
任务中,Ant构建引擎必须通过java.lang.reflect.Constructor.newInstance()动态加载此代码。
有什么诀窍能让这个成功吗?
注意:这在“常规”Java代码中工作得很好。。。蚂蚁的动态负载才是问题所在。
示例类:
import org.apache.tools.ant.Task;
public class AntCustomTaskShared extends Task {
private static Integer _static_bigdata = null;
public Integer get_bigdata() {
if (_static_bigdata == null) {
log("alloc"); // from ant Task class
_static_bigdata = new Integer(0);
}
return _static_bigdata;
}
}
import org.apache.tools.ant.BuildException;
public class AntCustomTask1 extends AntCustomTaskShared {
public void execute() throws BuildException {
Integer big_data = get_bigdata(); // "alloc" is printed
// do stuff with big_data
log("I'm doing big stuff");
}
}
import org.apache.tools.ant.BuildException;
public class AntCustomTask2 extends AntCustomTaskShared {
public void execute() throws BuildException {
Integer big_data = get_bigdata(); // "alloc" is printed (again)
// do stuff with big_data
log("I'm doing big stuff again");
}
}
示例Ant build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="MyTask" basedir="." default="init">
<target name="init"
description="test the custom task"
>
<taskdef name="CustomTask1"
classname="AntCustomTask1"
classpath="C:\my_custom_ant_task_class_files"
/>
<taskdef name="CustomTask2"
classname="AntCustomTask2"
classpath="C:\my_custom_ant_task_class_files"
/>
<CustomTask1/>
<CustomTask2/>
</target>
</project>
我在Windows上运行ant 1.8.1,它有两个env变量:
-
JAVA_HOME=C:\程序文件\JAVA\jdk1.6.0_21
-
提示:如果要从Ant(1.8)进程单步执行此自定义任务,请在此处设置断点:
-
org.apache.tools.ant.launch.Launcher.main()
-
org.apache.tools.ant.UnknownElement.execute()