是否可以显示蚂蚁扩展点的调用"graph"?



我在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

我知道有两种方法可以获得这些信息:

  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

这是相当草率的,但它工作。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只会运行它们一次)。

相关内容

  • 没有找到相关文章