2010-10-20 61 views
5

我写了两个不同的自定义Ant任务。他们试图通过基类中的静态成员来共享数据。这不适合我。如何在自定义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> 

做到以上的,你会看到 “黄金” 登录两次。我无法让这两个自定义任务分享“大数据”。

我在Windows上运行ant 1.8.1与这两个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()
+0

你可以发布一个简单的构建,说明这一点?我已经在本地尝试过了,它似乎对我有用 - 没有打印第二个分配。 – 2010-10-20 11:26:42

+0

使用您的样本构建我没有两次调用BigData构造函数。不过现在看到两个分配:一个来自println,另一个来自记录器。我已经将所有的课程放在一个目录fwiw中。 – 2010-10-20 11:54:47

回答

1

该解决方案很简单,但在Ant网站上记录得很差(或没有?)。 (我会为Ant文档提交补丁以纠正这种情况!)

我需要在taskdef节点上使用属性loaderref。该令牌用于引用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

我仍然没有在Ant的文档中看到这个用法的描述。你最终提交了补丁吗? – gkb0986 2014-09-29 01:51:54

0

这是不太优雅,但你可以尝试通过System.setPropertySystem.getProperty调用共享的信息。 ANT类加载与普通的Java应用程序完全不同。

相关问题