2011-08-02 4 views
4

私はアリで定義された拡張ポイントを持っている:ant拡張ポイントの呼び出し「グラフ」を表示することはできますか?

<extension-point name="foo"/> 

タスクの多くは、いくつかの輸入アリのファイルで、この時点に貢献:

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

私はちょっと迷ってしまいましたしかしに正確にどのようにタスクは貢献しています。特定の拡張ポイントによってトリガされるタスクをAntに報告させる方法はありますか?より一般的には、アリタスクの「コールグラフ」(または単に依存関係のリスト)を表示する方法はありますか?

私は運がない、ant(-vなど)の詳細オプションを使用してみました。

おかげ

すべての

答えて

0

まず、あなたは(私は〜/ .profileファイルに設定されている)ANT_OPTSにいくつかのパラメータを追加することによって、リモートデバッグを使用して、IDEでANTプロセスをデバッグしようとすることができます:

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

プロファイリングが役立ちます。私はたぶん、あなたはそれを試してみることができます

http://sourceforge.net/projects/antro

... ANT Wikiのプロジェクト洞を見つけました。プロジェクトはあなたの問題を解決する有望なANTのために設計されていると言われています。

また、Yourkit Java Profilerを使用してCPUプロファイリングを行うこともできます。 YJPはJavaアプリケーションの呼び出しグラフを表示できますが、どちらがANTターゲットであるかを知ることができるかどうかはわかりません。

次のドキュメントは、YJPエージェントを使用してJavaアプリケーションを起動する方法を示しています。

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

0

私は、この情報を取得するための2つの方法を知っている:あなたは、Antのコンソールロガーから有効な標的/拡張ポイントの呼び出しシーケンスを取得することができます

  1. 。これを行うには、コマンドラインの-verboseをAntに渡すことで、Antのロギング機能を冗長モードにします。ビルドスクリプトで呼び出されるほとんどのターゲットのすぐ前にコンソールにダンプする2つの行が続きます。

    • 「次から始まるコールシーケンスのターゲットの要約を示す行」テキスト、Build sequence for target(s) 'artifact' is [...]
    • 詳細な呼び出しシーケンスを示す行(ネストされたターゲットとantcallsが含まれています)。この行は、テキスト、Complete build sequence is [...]で始まります。このリストは、できるだけ合理的に、行がコンソールに記録された時点でリストされている各ターゲットの属性ifおよびunlessの評価を考慮しています。

    通常、-verboseオプションと同じようにAntビルドを起動するだけで、探している情報がコンソールに表示されます。

  2. Grandというツールを使用して、呼び出しシーケンスを図で表すことができます。しかし、それはかなりの時間更新されていないので、拡張ポイント(これはあなたがここで心配しているものです)をサポートしていません。 antcall'santdepend'enciesと解釈されます。 ifunlessの属性は評価されませんが、潜在的な実行順序 - 実際の呼び出しグラフよりも依存関係の階層を識別するだけです。プロジェクトはGithub上にあるので、拡張ポイントをサポートするための更新がそれほど難しくないかもしれません。

    グラフィックはGraphvizを使用してレンダリングされます。実際の呼び出しシーケンスについては

、使用オプション1.

0

これはかなりずさんですが、それは動作します。 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は一度だけ実行されます)。

関連する問題