2012-05-08 81 views
0

我写了自己的ANT任务来执行某些功能。不过,我需要这个任务来调用一个java任务作为一个嵌套任务。所以,我有下面的代码在我的构建文件:在自定义任务中运行嵌套任务

<mytask ... > 
    <java ... /> 
</mytask> 

我想java任务执行完毕后,但在此之前mytask完成,清理的目的后运行一段代码。

这是一个破碎的设计,不建议在构建文件?如果不是,我应该采用哪种方法来运行清理方法?

+0

还有一两件事:改变这个Q&A的标题为'运行定制task'或类似的嵌套任务...可以吸引更多的关注。 – coolcfan

+0

谢谢coolcfan! – Neel

回答

1

让你的任务实现org.apache.tools.ant.TaskContainer接口,编写你自己的addTask(Task task)方法。

例如(它应该只需要一个名为任务的“java”):

private List<Task> _nestedTask = new ArrayList<>(); 

public void addTask(Task task) { 
    if (task.getTaskName().equals("java")) { 
     _nestedTasks.add(task); 
    } 
    else { 
     throw new BuildException("Support only nested <java> task."); 
    } 
} 

请注意,如果你写在你的构建文件中有多个嵌套<java>任务,你需要你自己来处理它们。要执行嵌套<java>任务,只需遍历列表并针对每个任务调用​​方法即可。

更新:

添加嵌套任务时,它不会自动运行。如果您的自定义任务中未调用​​方法,它甚至不会运行。

所以...一个非常基本的和简单的例子:

// your custom task's execute... 
public void execute() { 
    //do something 

    for (Task task : _nestedTask) { 
     task.perform(); // here the nested task is executed. 
    } 

    //do something 
} 
+0

是的,我有这个代码来添加嵌套任务,但这里是问题:只有在嵌套任务执行之前调用addTask方法,我应该在哪里调用'cleanup'方法,以便在调用之后Java任务? – Neel

+0

@Neel'addTask'和调用'task.execute'是两个单独的步骤。 'addTask'由Ant调用,但并不意味着嵌套任务在添加时被执行。直到你调用它的'execute'方法,嵌套的任务才会运行。看到我更新的答案。 – coolcfan

+0

谢谢coolcfan! – Neel