Как шаг-отладка аннотации процессора во время компиляции?

У меня есть обработчик аннотаций для аннотации политики хранения=SOURCE.

Я не знаю, как его отладить.

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

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

3 ответов


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

"правильный" способ вызова компилятора Java в JDK 1.6 или выше-использовать JavaCompiler интерфейс javax.инструменты, который вы получаете от ToolProvider (Я включаю все ссылки, потому что есть приличное количество класса / пакета документация, которую вы должны прочитать).

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


в последнее время можно использовать что-то вроде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, из которого вы можете получить элементы и типы классов утилит для тестирования конкретной логики в вашем компиляторе более изолированным способом.


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

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

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