Как я могу делиться данными между пользовательскими задачами Ant? - PullRequest
5 голосов
/ 20 октября 2010

Я написал две разные пользовательские задачи 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()

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Решение простое, но плохо (или нет?) Задокументировано на веб-сайте Ant.(Я исправлю патч в документации Ant, чтобы исправить эту ситуацию!)

Мне нужно было использовать атрибут loaderref на taskdef узлах.Маркер используется для ссылки на ClassLoader (и делиться им).После этого статические члены корректно распределяются между пользовательскими задачами.

Исправленный 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"
               loaderref="my_shared_class_loader"
      />
      <taskdef name="CustomTask2"
               classname="AntCustomTask2"
               classpath="C:\my_custom_ant_task_class_files"
               loaderref="my_shared_class_loader"
      />
      <CustomTask1/>
      <CustomTask2/>
   </target>
</project>
0 голосов
/ 20 октября 2010

Это менее элегантно, но вы можете попробовать поделиться информацией через System.setProperty и System.getProperty звонки.Загрузка класса ANT определенно отличается от обычной Java-программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...