代码之家  ›  专栏  ›  技术社区  ›  kevinarpe Dario Hamidi

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

  •  5
  • kevinarpe Dario Hamidi  · 技术社区  · 14 年前

    我写了两个不同的自定义蚂蚁任务。他们试图通过基类中的静态成员共享数据。这对我不起作用。

    我假设我在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()
    2 回复  |  直到 14 年前
        1
  •  1
  •   kevinarpe Dario Hamidi    14 年前

    解决方案很简单,但效果很差(或者不是?)记录在蚂蚁网站上。(我将向Ant文档提交一个补丁来纠正这种情况!)

    我需要使用属性 loaderref taskdef 节点。令牌用于引用类加载器(并共享它)。之后,在自定义任务之间正确共享静态成员。

    已更正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>
    
        2
  •  0
  •   Nik    14 年前

    System.setProperty System.getProperty 电话。ANT类的加载与普通Java应用程序完全不同。