---具体的な例を含めるように編集---
この例では、あなたの伐採の主要なヘッドスタートを与える必要があります。 antを起動する前にCLASSPATHに追加する必要があることを覚えておいてください。可能であれば、antのコピーが使用するCLASSPATHにのみ追加しますが、CLASSPATHを設定してANTを呼び出すスクリプトで通常のANT呼び出しをラップします。
は、そのように
ant -logger com.edwinbuck.JavacFileLogger
のように、このロガーでantを実行し、次のコードはコンパイルされませんでしたファイルのリストを生成します。それはいくつかの仮定をしています(いくつかは良い、いくつかは改善を使用するかもしれません)。
- Javaファイルをコンパイルするには、「javac」タスクが必要であることが前提です。
- それは、すべての非コンパイルするファイルは、フォームの少なくとも1つのメッセージ放出することを前提として「/some/path/to/the/file.javaを::失敗の説明」
- それは他の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ファイル)。
にお電話いただきありがとうございます、私はあなたにできるだけ早くお知らせします。まあどちらかが大丈夫だろう、私はちょうどどちらが実装するのが最速か疑問に思っています。 – 7dr3am7
私はいくつかの記事を読んでいましたが、ちょっと質問がありました。エラーと簡単な出力の違いをロガーがどのように知っていますか?そして何よりも、私はそれをどのように解析できますか? – 7dr3am7
エラーか単純出力かを判断する必要があります。これは、通常、BuildEvent優先順位をチェックし、BuildEventメッセージでキーワードを検索する組み合わせによって行われます。多くの場合、BuildEventを見つけるのに役立つ文字列または部分文字列を見つけることができます。「エラー」や「コンパイルに失敗しました」などと思われることがあります。それを解析する際には、4番目の単語、最初の括弧の間のものなど、文字列からどのようなパターンを引っ張るかを把握する必要があります。時間があれば、例を投稿します。 –