Перехватить трассировку стека из вызова javac

#exception #ant #stack-trace #javac

#исключение #ant #трассировка стека #javac

Вопрос:

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

Немного истории, я использую сервер CI, CruiseControl, и хочу написать адаптер, который будет перехватывать трассировку стека из неудачной сборки и позволит мне проанализировать, какие файлы вызвали сбой сборки из вызова задачи javac. Так, например, если код был возвращен в репозиторий, в котором была сигнатура метода из другого класса, но этот класс так и не был добавлен в репозиторий, задача javac завершится неудачей из-за исключения cannot find symbol в классе. Я хочу иметь возможность прочитать трассировку стека, чтобы получить класс, который вызвал сбой сборки.

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

Комментарии:

1. Что такое трассировка стека javac?

Ответ №1:

Во-первых, для терминологии: компилятор обычно не выдает исключений (если это происходит, скорее всего, в компиляторе ошибка, или ваша файловая система создает проблемы, или что-то в этом роде), поэтому трассировка стека отсутствует.

То, что вы видите при компиляции, — это выходные данные компилятора, включая любые сообщения об ошибках компилятора.

Глядя на javac задачу ant, кажется, что нет способа перенаправить вывод куда-либо, что означает, что его синтаксический анализ возможен только путем синтаксического анализа выходных данных всего ant run.

Вы могли бы добиться большего успеха, используя API компилятора (javax.tools) и добавив DiagnosticListener к запуску компилятора. Однако вам пришлось бы самостоятельно включить это в ant-задачу.