2011-08-02 29 views
4

我有蚂蚁定义的扩展点:是否可以显示蚂蚁扩展点的调用“图形”?

<extension-point name="foo"/> 

很多任务有助于这一点在多台进口蚂蚁文件:

<bindtargets targets="bar" extensionPoint="foo" /> 

不过我有点失去了为到底是哪任务正在起作用。有没有办法让蚂蚁报告由给定扩展点触发的任务?更普遍的是,有没有办法显示一个蚂蚁任务的“调用图”(或简单的依赖关系列表)?

我尝试使用详细的选项为蚂蚁(-v等),没有运气。

感谢

回答

0

首先,你可以尝试使用远程调试调试过程ANT在IDE中添加一些参数来ANT_OPTS(矿山坐落在〜/ .profile文件):

http://blog.dahanne.net/2010/06/03/debugging-any-java-application/

并且分析可能有所帮助。我发现项目胃窦蚂蚁维基...

http://sourceforge.net/projects/antro

也许你可以试一下。据说这个项目是为ANT设计的,它看起来很有希望解决你的问题。

此外,您还可以使用Yourkit Java Profiler执行CPU分析。 YJP可以显示Java应用程序的调用图,但我不确定是否可以找出哪些是ANT目标。

以下文档显示如何使用YJP代理启动Java应用程序。

http://www.yourkit.com/docs/95/help/agent.jsp

0

我知道有2种方法得到这个信息:

  1. 你可以从Ant的控制台记录的有效靶点/扩展点的调用序列。为此,通过在命令行上传递-verbose给Ant,将Ant的日志记录工具置于详细模式。有两条线,一前一后,因为他们是在生成脚本中调用的转储到控制台立即大多数目标之前:

    • 一条线,表示在调用序列开始与目标的摘要文字,Build sequence for target(s) 'artifact' is [...]
    • 显示详细调用序列的行(嵌套目标和包含antcalls)。该行以文本Complete build sequence is [...]开头。此列表尽可能合理地考虑在线路记录到控制台时列出的每个目标的任何ifunless属性的评估。

    简单地调用Ant构建,你通常会使用-verbose选项和控制台应该有你要找的信息。

  2. 你可以使用一个叫做Grand工具调用序列的图示。然而,它还没有更新一段时间,因此不支持扩展点(这是你在这里关注的)。这将解释antcall'santdepend'encies。它不评估ifunless属性,而只是识别潜在的执行顺序 - 不是实际调用图更加依赖层次。该项目在Github上,因此支持扩展点的更新可能不会太困难。

    图形是使用Graphviz的呈现。

对于实际调用序列,使用选项1

0

这是很草率的,但它的作品。蚂蚁实际上是非常容易的脚本,如果你使用的是至少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任务(尽管可以轻松修改它),也可以对属性进行响应。如果依赖关系嵌套太深,它可能会遇到递归深度限制(但我怀疑任何项目都将它们嵌套得足够深)。

的数组用于确保每个依赖性列出一次(蚂蚁只会运行它们一次)。