kev*_*rpe 5 java ant static task
我写了两个不同的自定义Ant任务.他们试图通过基类中的静态成员共享数据.这不适合我.
我假设我在Java中正确使用静态成员.我认为这是Java VM的动态加载问题.但是,我是Java的相对新手.
由于Ant自定义任务是在运行时使用任务映射的taskdef,因此Ant构建引擎必须通过java.lang.reflect.Constructor.newInstance()动态加载此代码.
是否有一个技巧使这项工作?
注意:这在"常规"Java代码中工作正常......这是Ant的动态加载问题.
示例类:
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>
完成上述所有操作后,您将看到"alloc"记录两次.我不能让这两个自定义任务共享"大数据".
我在Windows上使用这两个env变量运行ant 1.8.1:
提示:如果要从Ant(1.8)进程中进入此自定义任务,请在此处设置断点:
org.apache.tools.ant.launch.Launcher.main()org.apache.tools.ant.UnknownElement.execute()解决方案很简单,但 Ant 网站上的记录很少(或没有?)。(我将向 Ant 文档提交一个补丁来纠正这种情况!)
loaderref我需要在节点上使用该属性taskdef。该令牌用于引用类加载器(并共享它)。之后,静态成员可以在自定义任务之间正确共享。
更正了 Ant build.xml:
<?xml 版本=“1.0”编码=“UTF-8”?>
<项目名称=“MyTask”basedir=“。” 默认=“初始化”>
<目标名称=“初始化”
描述=“测试自定义任务”
>
<taskdef 名称=“自定义任务1”
类名=“AntCustomTask1”
类路径 =“C:\my_custom_ant_task_class_files”
loaderref =“my_shared_class_loader”
/>
<taskdef 名称=“自定义任务2”
类名=“AntCustomTask2”
类路径 =“C:\my_custom_ant_task_class_files”
loaderref =“my_shared_class_loader”
/>
<自定义任务1/>
<自定义任务2/>
</目标>
</项目>