Как выполнить пошаговую отладку процессора аннотаций во время компиляции?

У меня есть процессор аннотаций для аннотации политики хранения = ИСТОЧНИК.

Я понятия не имею, как выполнить пошаговую отладку.

  • Я выдал операторы печати, информацию о регистраторе, когда запускаю mvn install, компилирую или упаковываю или ant javac, и я вижу их sysouts в журнале компиляции.

  • Однако я понятия не имею, как выполнить пошаговую отладку процессора в Eclipse. Я имею в виду, как вы выполняете пошаговую отладку во время компиляции?


person Blessed Geek    schedule 04.10.2012    source источник


Ответы (3)


Вы должны вызвать компилятор Java из Eclipse, используя конфигурацию отладки (вам нужно будет создать конфигурацию вручную, из пункта меню «Конфигурации отладки...»).

«Правильный» способ вызова компилятора Java в JDK 1.6 или более поздней версии — использовать JavaCompiler в javax.tools, который вы получаете от ToolProvider (я привожу все ссылки, потому что есть приличное количество документации по классам/пакетам, которую вам следует прочитать).

"Быстрый и грязный" способ (который должен работать, но я не даю никаких гарантий) состоит в том, чтобы вызвать com.sun.tools.javac.Main.main(), передав ему ваши обычные аргументы командной строки. Для этого вам понадобится tools.jar в пути к классам (он находится в $JAVA_HOME/lib).

person parsifal    schedule 04.10.2012
comment
привет, прочитав этот ответ как принятый, я думаю, что это решение проблемы. Кстати, я не понимаю, что вызывает компилятор Java из Eclipse, используя конфигурацию отладки (вам нужно будет создать конфигурацию вручную, из конфигураций отладки. значит, вы можете объяснить лучше, пожалуйста? спасибо - person Apperside; 08.12.2013
comment
Я добавил tools.jar и jar процессора в существующий проект. Затем использовал класс com.sun.tools.javac.Main, как было предложено. Создал конфигурацию отладки приложения Java с файлом tools.jar в пути к классам и аргументами javac в качестве аргументов программы. Сработало как шарм - спасибо! - person wbdarby; 01.07.2016

В последнее время можно использовать что-то вроде http://github.com/google/compile-testing, который позволяет вам запускать задание компиляции для произвольных обработчиков аннотаций, для которых вы можете устанавливать точки останова, выполнять пошаговое выполнение и т. д.

@Test public void testStuff() {
  // Create a source file to process, or load one from disk.
  JavaFileObject file = JavaFileObjects.fromSourceLines("test.Foo",
    "package test;",
    "",
    "import bar.*;",
    "",
    "@MyAnnotation(blah=false)",
    "interface TestInterface {",
    "  Bar someBar();",
    "}",

  // assert conditions following a compilation in the context of MyProcessor.
  assert_().about(javaSource()).that(file)
      .processedWith(new MyProcessor())
      .failsToCompile()
      .withErrorContaining("some error message").in(file).onLine(5);
}

Этот тест предполагает, что вы получите сообщение об ошибке, потому что @MyAnnotation неправильно объявлен в тестовом источнике данных. Если это утверждение не выполняется, вы можете запустить его в режиме отладки в своей среде IDE, установить точки останова в MyProcessor и пройти через полную среду компилятора, активную во время отладки.

Для модульного тестирования конкретных методов внутри вашего процессора вы также можете использовать правило @Rule, называемое CompilationRule, из которого вы можете получить служебные классы Elements и Types для более изолированного тестирования определенной логики в вашем компиляторе.

person Christian Gruber    schedule 06.11.2014

Обработка аннотаций происходит во время компиляции, поэтому обычная отладка не работает. Если вы хотите отладить его в контексте вашего проекта, вы можете использовать удаленную отладку Eclipse, используя Gradle или Maven в режиме отладки. Затем вы можете поместить точки останова в файлы процессора аннотаций.

См. раздел Отладка процессора аннотаций в любом проекте. .

Отказ от ответственности: я написал пост.

person bryant1410    schedule 29.03.2016