Я написал две разные пользовательские задачи 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» записывается дважды. Я не могу заставить эти две пользовательские задачи поделиться «большими данными».
Я запускаю ant 1.8.1 в Windows с этими двумя переменными env:
- JAVA_HOME = C: \ Program Files \ Java \ jdk1.6.0_21
- CLASSPATH = (пусто)
Подсказка: если вы хотите перейти к этой пользовательской задаче из процесса Ant (1.8), установите здесь точки останова:
org.apache.tools.ant.launch.Launcher.main()
org.apache.tools.ant.UnknownElement.execute()