我在ant中定义了一个扩展点:
<extension-point name="foo"/>
在几个导入的ant文件中有许多任务促成了这一点:
<bindtargets targets="bar" extensionPoint="foo" />
然而,我有点迷失了到底哪些任务是有贡献的。是否有一种方法可以让ant报告由给定扩展点触发的任务?更一般地说,是否有一种方法可以显示蚂蚁任务的"调用图"(或简单的依赖项列表)?
我尝试使用ant的详细选项(-v等),但没有成功。
谢谢
首先,您可以尝试在IDE中使用远程调试来调试ANT进程,方法是向ANT_OPTS添加一些参数(我的参数设置在~/.profile中):
http://blog.dahanne.net/2010/06/03/debugging-any-java-application/
分析可能会有所帮助。我在ANT Wiki上找到了Antro项目…
http://sourceforge.net/projects/antro
也许你可以试试。据说该项目是为ANT设计的,看起来很有希望解决您的问题。
还可以使用Yourkit Java Profiler进行CPU分析。YJP可以显示java应用程序的调用图,但我不确定是否可以找出哪些是ANT目标。
下面的文档展示了如何使用YJP代理启动java应用程序。
http://www.yourkit.com/docs/95/help/agent.jsp
我知道有两种方法可以获得这些信息:
-
您可以从Ant的控制台日志记录器获得有效的目标/扩展点调用序列。为此,通过将命令行上的
-verbose
传递给Ant,将Ant的日志记录功能置于详细模式。有两行,一个接一个,在大多数目标在构建脚本中被调用时立即转储到控制台:- 显示以文本
Build sequence for target(s) 'artifact' is [...]
开头的调用序列中目标的摘要的行。 - 显示详细呼叫顺序的一行(包括嵌套的目标和
antcalls
)。这一行以文本Complete build sequence is [...]
开头。该清单尽可能合理地考虑在将行记录到控制台时列出的每个目标的if
和unless
属性的评估。
简单地调用你的Ant构建,你通常会使用-verbose选项,你的控制台应该有你正在寻找的信息。
- 显示以文本
-
您可以使用Grand工具获得呼叫序列的图形表示。然而,它已经有一段时间没有更新了,因此不支持扩展点(这就是您在这里所关心的)。它将解释
antcall's
、ant
和depend'encies
。它不计算if
和unless
属性,而只是识别潜在的执行序列——更像是一个依赖层次结构,而不是一个实际的调用图。该项目在Github上,所以更新以支持扩展点可能不会太困难。图形使用Graphviz呈现。
对于实际的呼叫序列,使用选项1
这是相当草率的,但它工作。Ant实际上很容易编写脚本,如果您至少使用Java 6(也可能是Java 7),则内置了javascript支持,因此可以立即使用。这定义了一个任务,它将按照调用顺序回显任何目标的依赖项:
<scriptdef name="listdepends" language="javascript">
<attribute name="target"/>
<![CDATA[
var done = [];
var echo = project.createTask("echo")
function listdepend(t) {
done.push(t.getName());
var depends = t.getDependencies();
while (depends.hasMoreElements()) {
var t2 = depends.nextElement();
if (done.indexOf(t2)==-1) listdepend(project.getTargets().get(t2));
}
echo.setMessage(t.getName());
echo.perform();
}
var t = attributes.get("target");
if (t!=null) {
var targ = project.getTargets().get(t);
listdepend(targ);
}
]]>
</scriptdef>
在您的示例中,您可以创建一个新目标(或不创建),并像这样调用它:
<target name="listfoo">
<listdepends target="foo"/>
</target>
就像我说的,这有点草率。它可能不是很快(尽管除非您的目标触发了数千个其他目标,否则它可能不会明显慢)。它不会处理antcall任务(尽管可以很容易地修改它)或响应if和unless属性。如果依赖嵌套得太深,它可能会达到递归深度限制(但我怀疑任何项目都嵌套得足够深)。
数组用于确保每个依赖项被列出一次(ant只会运行它们一次)。