如何在自定义Ant任务之间共享数据?

时间:2010-10-20 10:58:59

标签: java ant static task

我写了两个不同的自定义Ant任务。他们试图通过基类中的静态成员共享数据。这不适合我。

我假设我在Java中正确使用静态成员。我认为这是Java VM的动态加载问题。但是,我是Java的相对新手。

由于使用taskdef任务在运行时映射Ant自定义任务,因此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上使用这两个环境变量运行ant 1.8.1:

  • 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 个答案:

答案 0 :(得分:1)

解决方案很简单,但在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>

答案 1 :(得分:0)

这不太优雅,但您可以尝试通过System.setPropertySystem.getProperty来电分享信息。 ANT类加载肯定不同于普通的Java应用程序。