【问题标题】:How do I share data between custom Ant tasks?如何在自定义 Ant 任务之间共享数据?
【发布时间】: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。我已经将所有类都放在一个目录中。

标签: java ant static task


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    更正 Ant build.xml:

    目标> 项目>

    【讨论】:

    • 我仍然没有在 Ant 的文档中看到这种用法的描述。你最后提交补丁了吗?
    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多