Отладка процессоров аннотаций Java с использованием Intellij и Maven

Я пытаюсь узнать, как создать собственный обработчик аннотаций, и мне не терпится отладить его.

Мне уже удалось запустить компилятор javac в режиме отладки (с чистой установкой mvnDebug) (с чужим проектом с процессором аннотаций), подключиться к нему с помощью IntelliJ IDEA и остановить его на точках останова в обработчик аннотаций.


Если у нас есть что-то подобное в каком-то пакете в нашем проекте, как и любой другой класс (например, без специальной конфигурации или чего-то еще):

public class MyProcessor extends AbstractProcessor {...}

Можем ли мы каким-то образом подключить его к процессу сборки maven в качестве обработчика аннотаций? Так что сначала он компилируется, а затем весь проект компилируется с активным процессором аннотаций.

Кроме того, насколько мне известно, обработчикам аннотаций требуется какой-то файл META INF, который можно создать с помощью чего-то вроде обработчик аннотаций google autoservices.

Так что, возможно, сначала будет запущен процесс сборки maven, в котором у нас есть autoservices, а затем расширение класса AbstractProcessor скомпилирован как процессор аннотаций и, наконец, весь проект скомпилирован с нашим собственным активным процессором аннотаций (и с компилятором javac в режиме отладки).


person PaperTsar    schedule 10.07.2015    source источник
comment
Моя предпочтительная стратегия - это отладка в модульном тесте.   -  person David Pérez Cabrera    schedule 10.07.2015
comment
@ DavidPérezCabrera Да, но ради обучения я хотел бы проверить присутствующие переменные.   -  person PaperTsar    schedule 10.07.2015


Ответы (1)


Вот рецепт.

Примечание: в некоторых случаях я сделал его очень подробным, пропустив части, которые вы уже знаете, как это сделать.

  1. Прежде всего, загрузите и установите Maven, затем загрузите и установите IntelliJ IDEA (далее именуется ИДЕЯ). (Если вы не знаете, как использовать Windows CMD, вот краткий учебник, а также: как чтобы открыть командную строку)

  2. Создайте проект Maven в IDEA без какого-либо архетипа. Затем создайте какой-нибудь пакет в src> main> java

  3. Создайте класс, который расширяет javax.annotation.processing.AbstractProcessor.

  4. Вставьте минимальный код, чтобы он работал. (Не забудьте аннотацию вверху объявления класса!)

    Предполагая, что полный путь аннотации равен core.Factory, код будет выглядеть так:

    @SupportedAnnotationTypes("core.Factory")
    public class MyProcessor extends AbstractProcessor {
    Messager messager;
    
        @Override
        public void init(ProcessingEnvironment env) {
            messager = env.getMessager();
            super.init(env);
        }
    
        @Override
        public boolean process(Set<? extends TypeElement> annotations,       RoundEnvironment roundEnv) {
            for (TypeElement te : annotations)
                for (Element e : roundEnv.getElementsAnnotatedWith(te))
                    messager.printMessage(Diagnostic.Kind.NOTE, "Printing: " +   e.toString());
            return true;
        }
    
        @Override
        public SourceVersion getSupportedSourceVersion() {
            return SourceVersion.latestSupported();
        }
    }
    
  5. Создайте аннотацию в том же пакете.

    public @interface Factory {
    
    }
    
  6. В проекте, вероятно, есть каталог src> test> java, создайте там другой пакет с тем же именем, что и пакет, который вы создали ранее. Затем создайте в нем класс с именем, заканчивающимся на «Test» (например: MyProcessorTest). Затем аннотируйте этот класс новым типом аннотации, который вы создали ранее (@Factory).

    @Factory
    public class MyProcessorTest {
    
    }
    
  7. Теперь, чтобы обработчики аннотаций работали, у них должен быть какой-то файл в META-INF. Для этого мы воспользуемся другим процессором аннотаций, который называется autoservice. Итак, в файл pom.xml вставьте его зависимость.

    <dependencies>
        <dependency>
            <groupId>com.google.auto.service</groupId>
            <artifactId>auto-service</artifactId>
            <version>1.0-rc2</version>
        </dependency>
    </dependencies>
    

    7.1 Боковое примечание: По какой-то причине, если я не укажу это явно, проект Maven использует Java 1.5. Чтобы заставить его работать с Java 1.8, вставьте это в файл pom.xml.

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  8. Аннотируйте наш класс процессора с помощью @AutoService(Processor.class).

  9. Теперь нам нужно настроить конфигурацию удаленного отладчика в IDEA. Для этого перейдите в Выполнить> Изменить конфигурации, нажмите зеленую кнопку «+» в левом верхнем углу и выберите «Удаленный». Назовите его что-то вроде "mvnDebug", установите Host равным localhost, а Port - 8000, нажмите ОК, и все готово.

  10. Установите точку останова в методе процесса в нашем процессоре.

  11. Откройте командную строку Windows, перейдите в каталог проектов, где находится pom.xml. Затем введите mvnDebug clean install. Если все настроено правильно, должно быть написано что-то вроде «Прослушивание транспорта dt_socket по адресу: 8000».

  12. Вернитесь в IDEA и выполните только что созданную конфигурацию mvnDebug. Если все настроено правильно, должно быть написано что-то вроде «Подключено к целевой виртуальной машине, адрес: 'localhost: 8000', транспорт: 'сокет'».

  13. Вернитесь в командную строку и, если ничего не происходит, нажмите какую-нибудь клавишу, чтобы ее разбудить.

  14. Если все было настроено правильно, IDEA остановится в точке останова, приостановив выполнение javac (компилятора Java).


Дополнительные руководства по обработке аннотаций

person PaperTsar    schedule 11.07.2015
comment
это пошаговое руководство пропущено, спасибо, работает без проблем - person Carmine; 31.12.2016