Список классов, которые не удалось скомпилировать в ANT - PullRequest
3 голосов
/ 26 января 2012

У меня есть тривиальный вопрос для всех вас. У меня есть несколько файлов build.xml, которые собирают сотни классов, и при каждом запуске сборки файл журнала сохраняется на сервере.

Теперь все хорошо, если, например, что-то не получается, я могу просмотреть файлы журнала ... НО иногда я сталкиваюсь со многими ошибками, поэтому сканирование через файл журнала является болезненным.

Я хотел знать, можно ли сказать муравью (даже во время выполнения) или через javac задача, если есть возможность дать список классов, которые не удалось скомпилировать (Я имею в виду не весь стек ошибок, а просто список классов, которые потерпели неудачу)

Ответы [ 2 ]

3 голосов
/ 26 января 2012

--- Отредактировано для включения конкретного примера ---

Этот пример должен дать вам большое преимущество при ведении журнала. Помните, что вы должны добавить его в CLASSPATH до вызова муравья. Если возможно, добавьте его только в CLASSPATH, который использует ваша копия ant, но включив обычный вызов ANT в скрипт, который устанавливает CLASSPATH, а затем вызывает ANT.

Затем запустите муравей с этим логгером, вот так

ant -logger com.edwinbuck.JavacFileLogger

и следующий код создаст список файлов, которые не были скомпилированы. Он делает ряд предположений (некоторые хорошие, некоторые могут использовать улучшения).

  1. Предполагается, что вы должны быть в задании "javac" для компиляции файла java.
  2. Предполагается, что все некомпилируемые файлы отправляют как минимум одно сообщение в форме '/some/path/to/the/file.java :: description of error'
  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 или Logger.

Если вам нужен файл журнала, в котором упоминаются только неудачные классы, вы можете добавить свой собственный Logger в ant, который ждет задачу javac, а затем записывает события регистрации, анализирует имена неудачных классов и добавляет их к файл.

Если вы хотите, чтобы эта информация была внутренней для Ant, вы можете добавить Listener, который в основном собирает необходимые данные и каким-то образом делает их доступными для ANT (возможно, путем определения свойства).

Посмотрите эту страницу на пользовательских регистраторах муравьев , чтобы получить представление, и примите к сведению эту запись , чтобы увидеть, как слушали определенную задачу (в данном случае javac) автоматически запускать другую задачу (даже если она не указана в файле build.xml).

2 голосов
/ 26 января 2012

Почему бы вам не извлечь имена файлов из ваших журналов?

Простой пример:

grep javac build.log | grep java:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...