你可以在ant Task.init()方法中做什么?

时间:2010-02-17 16:46:05

标签: java ant

我正在开发一些所有需要初始化相同对象的自定义ant任务。我想在init()方法中从Task扩展的公共超类中初始化这些对象。但我从the lifecycle of an ant task看到init()在设置任务子元素和属性之前被调用。因此,如果我正确阅读,那么初始化这些对象所需的所有数据在init()期间都是不可用的。

那么,为什么在此时调用init()?你甚至知道你可以在init()中使用什么?它可以用于什么?

(还有一些其他方法可以依赖于在execute()之前调用,但在我的数据可用之后?)

4 个答案:

答案 0 :(得分:3)

最好的指南是查看Ant附带的任务的源代码。 init()似乎有3个主要用例:

  1. 委托对象的预初始化。例如,Sync任务将其大部分工作委托给底层对象,并将一些setXYZ()传递给此委托。此委托的实例化和预配置必须在任务上设置任何属性之前发生。
  2. 配置属性值的默认值,这些默认值基于常规项目设置。例如,SSH任务通过查看System属性来初始化其knownHosts默认值。此外,调用Project已将init()对象注入任务,因此任务可以查看该对象。
  3. 向类路径添加可选的第三方依赖项。例如,JUnit任务添加了各种与Junit相关的依赖项。这些只能在使用任务时加载,因为它们是可选的。
  4. 上述所有内容都可以在任务构造函数中完成,但使用显式init()方法与Ant任务设计保持一致。

    至于问题的第二部分,不,没有生命周期钩子在被设置的属性之间调用,并且execute()被调用。你必须在execute()内部做到这一点。

答案 1 :(得分:2)

在解析构建文件时以及在将Task绑定到其拥有项目之后,在每个Task上调用init()方法。因此,任务可以执行涉及Project实例的工作。

答案 2 :(得分:0)

为什么不在单例中执行初始化然后获取ant任务来调用单例来获取初始化数据?然后你只需支付一次初始化费用。

答案 3 :(得分:0)

要在调用execute方法之前在基类中执行某些初始化,可以在基类中实现execute(),创建这些对象,并调用在基类中声明的抽象方法。例如:

public abstract class BaseClass extends Task {
  public final void execute() {
    Foo foo = createFoo();
    Bar bar = createBar(foo);
    execute(foo,bar);
  }
  public abstract void execute(Foo foo, Bar bar);
}

public class BazTask extends BaseClass {
  public void execute(Foo foo, Bar bar) {
    System.out.println("foo is " + foo + " and bar is " + bar);
  }
}

您还可以将创建的对象存储为字段,并为方法指定一个不同的名称(如executeTask),而不是根据参数进行重载。