【发布时间】:2011-04-27 23:35:58
【问题描述】:
我编写了两个不同的自定义 Ant 任务。他们试图通过基类中的静态成员共享数据。这对我不起作用。
我假设我在 Java 中正确使用了静态成员。我认为这是 Java VM 的动态加载问题。但是,我是 Java 的新手。
由于 Ant 自定义任务在运行时使用 taskdef 任务进行映射,因此 Ant 构建引擎必须通过 java.lang.reflect.Constructor.newInstance() 动态加载此代码。
有什么诀窍可以使这项工作发挥作用吗?
注意:这在“常规”Java 代码中运行良好……问题在于 Ant 的动态加载。
示例类:
导入 org.apache.tools.ant.Task; 公共类 AntCustomTaskShared 扩展任务 { 私有静态整数_static_bigdata = null; 公共整数 get_bigdata() { 如果(_static_bigdata == null){ 日志(“分配”); // 来自 ant 任务类 _static_bigdata = 新整数(0); } 返回_static_bigdata; } } 导入 org.apache.tools.ant.BuildException; 公共类 AntCustomTask1 扩展 AntCustomTaskShared { 公共无效执行()抛出 BuildException { 整数 big_data = get_bigdata(); // “alloc”被打印出来 // 用 big_data 做事 log("我在做大事"); } } 导入 org.apache.tools.ant.BuildException; 公共类 AntCustomTask2 扩展 AntCustomTaskShared { 公共无效执行()抛出 BuildException { 整数 big_data = get_bigdata(); // “alloc”被打印(再次) // 用 big_data 做事 log("我又在做大事了"); } }示例 Ant build.xml:
执行上述所有操作,您将看到“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()
【问题讨论】:
-
你能发布一个简单的构建来说明这一点吗?我已经在本地尝试过,它似乎对我有用 - 没有打印第二个 alloc。
-
使用您的示例构建,我没有两次调用 BigData 构造函数。不过现在确实看到了两个分配:一个来自 println,一个来自 logger。我已经将所有类都放在一个目录中。