2012-01-26 12 views
3

私は皆さんのために些細な質問をしています。 私は何百ものクラスをコンパイルするbuild.xmlファイルをいくつか持っています。ビルドを実行するたびに、ログファイルがサーバーに保存されます。ANTでコンパイルに失敗したクラスのリスト

これまでのところ、何かが失敗した場合、ログファイルを調べることができます...しかし、いつか私は多くのエラーに直面しているので、ログファイルをスキャンするのは辛いです。

私はそれは のコンパイルに失敗したクラスのリストを与えることが可能であるならば(私が意味するものではありませんアリ(でも実行時)または のjavacタスク経由に言うことが可能であるかどうかを知りたいと思った

すべてのエラースタックだけでなく、失敗したクラスのリスト)

答えて

3

---具体的な例を含めるように編集---

この例では、あなたの伐採の主要なヘッドスタートを与える必要があります。 antを起動する前にCLASSPATHに追加する必要があることを覚えておいてください。可能であれば、antのコピーが使用するCLASSPATHにのみ追加しますが、CLASSPATHを設定してANTを呼び出すスクリプトで通常のANT呼び出しをラップします。

は、そのように

ant -logger com.edwinbuck.JavacFileLogger 

のように、このロガーでantを実行し、次のコードはコンパイルされませんでしたファイルのリストを生成します。それはいくつかの仮定をしています(いくつかは良い、いくつかは改善を使用するかもしれません)。

  1. Javaファイルをコンパイルするには、「javac」タスクが必要であることが前提です。
  2. それは、すべての非コンパイルするファイルは、フォームの少なくとも1つのメッセージ放出することを前提として「/some/path/to/the/file.javaを::失敗の説明」
  3. それは他のjavacのメッセージが含まれていないことを前提としてい.javac: "

ファイルを開いて書き込むためには、次のコードを変更する必要があります。

package com.edwinbuck; 

import java.io.PrintStream; 
import java.util.HashSet; 
import java.util.Set; 

import org.apache.tools.ant.BuildLogger; 
import org.apache.tools.ant.BuildEvent; 
import org.apache.tools.ant.util.StringUtils; 

public class JavacFileLogger implements BuildLogger { 

    protected PrintStream out; 

    protected PrintStream err; 

    protected static final String eol = StringUtils.LINE_SEP; 

    private Set<String> errorFiles = new HashSet<String>(); 

    private boolean ignoringMessages = true; 

    public void buildStarted(BuildEvent event) { 
    } 

    public void buildFinished(BuildEvent event) { 
    } 

    public void targetStarted(BuildEvent event) { 
    } 

    public void targetFinished(BuildEvent event) { 
    } 

    public void taskStarted(BuildEvent event) { 
    if (event.getTask().getTaskName().equals("javac")) { 
     ignoringMessages = false; 
    } 
    } 

    public void taskFinished(BuildEvent event) { 
    if (event.getTask().getTaskName().equals("javac")) { 
     ignoringMessages = true; 
     // flush the set of files with errors 
     for (String filename : errorFiles) { 
     out.print(filename); 
     out.print(eol); 
     } 
    } 
    } 

    public void messageLogged(BuildEvent event) { 
    // we don't care about non-javac messages 
    if (!ignoringMessages) { 
     // error messages have a distinct ".java:" in the line containing the file name. 
     if (event.getMessage().contains(".java:")) { 
     // just add the (string) name to the set to condense multiple reported errors in the same file 
     errorFiles.add(event.getMessage().substring(0, event.getMessage().indexOf(":"))); 
     } 
    } 
    } 

    public void setErrorPrintStream(PrintStream err) { 
    this.err = err; 
    } 

    public void setEmacsMode(boolean emacsMode) { 
    } 

    public void setOutputPrintStream(PrintStream output) { 
    this.out = output; 
    } 

    public void setMessageOutputLevel(int level) { 
    // this logger ignores message levels 
    } 

} 

---オリジナルのポストは、以下の---

あなたが何をしたいのかに応じて、あなたはおそらく、カスタムAntのリスナーやロガーが必要です。

失敗したクラスだけを記述するログファイルが必要な場合は、javacタスクを待機するantに独自のLoggerを追加して、ロギングイベントをキャプチャし、失敗したクラス名を解析して、ファイル。

この情報をAntの内部に入れたい場合は、基本的に必要なデータを収集し、何らかの形でANT(おそらくプロパティを定義する)で利用できるようにするリスナーを追加できます。

このページでは、アイデアを得るためにを、take note of this postingは、(ビルドで指定されていなくても)別のタスクを自動的に実行するための特定のタスク(この場合はjavac)の聞き方を確認します。 xmlファイル)。

+0

にお電話いただきありがとうございます、私はあなたにできるだけ早くお知らせします。まあどちらかが大丈夫だろう、私はちょうどどちらが実装するのが最速か疑問に思っています。 – 7dr3am7

+0

私はいくつかの記事を読んでいましたが、ちょっと質問がありました。エラーと簡単な出力の違いをロガーがどのように知っていますか?そして何よりも、私はそれをどのように解析できますか? – 7dr3am7

+0

エラーか単純出力かを判断する必要があります。これは、通常、BuildEvent優先順位をチェックし、BuildEventメッセージでキーワードを検索する組み合わせによって行われます。多くの場合、BuildEventを見つけるのに役立つ文字列または部分文字列を見つけることができます。「エラー」や「コンパイルに失敗しました」などと思われることがあります。それを解析する際には、4番目の単語、最初の括弧の間のものなど、文字列からどのようなパターンを引っ張るかを把握する必要があります。時間があれば、例を投稿します。 –

2

ログからファイル名をgrepしないのはなぜですか?

簡単な例:

grep javac build.log | grep java: 
+0

試してみました - 同じファイルのリスト全体または複数のメッセージエラーが頻繁に発生するため、あまりにも苦痛です。 – 7dr3am7

+0

@ 7dr3am7:コンパイラの出力には多くの仮定があります。スクリプトはより簡単に変更可能になります。私はそれをユニークなリストにするためにパイプを追加して(答えと同じ)行います。 – Jayan

+0

スクリプトができますが、リスナー/ロガーを好むでしょう**ランタイム** – 7dr3am7

関連する問題