--- Отредактировано для включения конкретного примера ---
Этот пример должен дать вам большое преимущество при ведении журнала. Помните, что вы должны добавить его в CLASSPATH до вызова муравья. Если возможно, добавьте его только в CLASSPATH, который использует ваша копия ant, но включив обычный вызов ANT в скрипт, который устанавливает CLASSPATH, а затем вызывает ANT.
Затем запустите муравей с этим логгером, вот так
ant -logger com.edwinbuck.JavacFileLogger
и следующий код создаст список файлов, которые не были скомпилированы. Он делает ряд предположений (некоторые хорошие, некоторые могут использовать улучшения).
- Предполагается, что вы должны быть в задании "javac" для компиляции файла java.
- Предполагается, что все некомпилируемые файлы отправляют как минимум одно сообщение в форме '/some/path/to/the/file.java :: description of error'
- Предполагается, что никакое другое сообщение 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 или Logger.
Если вам нужен файл журнала, в котором упоминаются только неудачные классы, вы можете добавить свой собственный Logger в ant, который ждет задачу javac
, а затем записывает события регистрации, анализирует имена неудачных классов и добавляет их к файл.
Если вы хотите, чтобы эта информация была внутренней для Ant, вы можете добавить Listener, который в основном собирает необходимые данные и каким-то образом делает их доступными для ANT (возможно, путем определения свойства).
Посмотрите эту страницу на пользовательских регистраторах муравьев , чтобы получить представление, и примите к сведению эту запись , чтобы увидеть, как слушали определенную задачу (в данном случае javac) автоматически запускать другую задачу (даже если она не указана в файле build.xml).