Информация о модуле Java 11: как зарегистрировать процессор аннотаций

Чтобы зарегистрировать поставщика услуг в Java 11, можно использовать следующую запись информации модуля «обеспечивает»:

module com.mycompany.mylib {

    provides ServiceInterface with ServiceImpl;

}

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

Чтобы проверить это, я создал несколько SSCCE на GitHub.

Есть 2 модуля:

  • java11-sample-annotation-processor: содержит аннотацию @Foo и FooApplicationProcessor
  • java11-sample-lib: предоставляет 2 примера классов, оба используют аннотацию @Foo

Ожидаемый результат: в java11-sample-lib JAR должен быть файл foo.txt

работает версия в главной ветке. сильный>:

  • Ява 11
  • нет module-info используется
  • регистрация обработчика аннотаций в src/main/resources/META-INF/services/javax.annotation.processing.Processor

В следующих версиях файл foo.txt не создается:

В ветке registration-in-module-info. Я заменил 2 библиотеки на модули Java 11 с информацией о модуле. Обработчик аннотаций здесь зарегистрирован в модуле-информации:

import com.github.puce77.java11annotationprocessortest.annotation.impl.FooApplicationProcessor;

module com.github.puce77.java11annotationprocessortest.annotation {
    exports com.github.puce77.java11annotationprocessortest.annotation;

    provides javax.annotation.processing.Processor with FooApplicationProcessor;

    requires java.compiler;
}

registration-in-module-info Ветка -moduleAndPkg: небольшое изменение, где я указал целевой модуль и целевой пакет (жестко запрограммированный), а не корневой пакет.

В ветке registration-meta-inf по-прежнему у обоих есть информация о модуле, но обработчик аннотаций зарегистрирован в src/main/resources/META-INF/services/javax.annotation.processing.Processor, а не в информации о модуле (на случай, если компилятор не может работать с инструкциями в модуле-информации!?)

В ветке only-one-module Я снова удалил информацию о модуле из java11-sample-annotation-processor. Обработчик аннотаций зарегистрирован в src/main/resources/META-INF/services/javax.annotation.processing.Processor.

Итак, мой вопрос: как настроить процессор аннотаций при работе с модулями Java 11?


person Puce    schedule 15.03.2020    source источник


Ответы (1)


Раньше обработчики аннотаций автоматически обнаруживались при размещении на пути к классам во время компиляции. Вы можете увидеть это в документации из javac:

--class-path путь, -classpath путь или -cp путь

Указывает, где найти файлы пользовательских классов и обработчики аннотаций [выделено мной]. Этот путь к классу переопределяет путь к пользовательскому классу в переменной среды CLASSPATH.

  • Если --class-path, -classpath или -cp не указаны, то путь к пользовательскому классу является значением переменной среды CLASSPATH, если она установлена, или текущим каталогом.
  • Если не компилируется код для модулей, если не указана опция --source-path или -sourcepath, то также ищется путь пользовательского класса для исходных файлов.
  • Если параметр -processorpath не указан, то в пути к классу также выполняется поиск обработчиков аннотаций [выделено мной].

[...]

--processor-path путь или -processorpath путь

Указывает, где найти обработчики аннотаций. Если этот параметр не используется, поиск процессоров осуществляется в пути к классам [выделено мной].

И это все еще так, пока вы используете путь к классам. Однако это не так при использовании пути к модулю. Чтобы модульные процессоры аннотаций были обнаружены, вы должны явно указать на них с другой опцией:

--module-path путь или -p путь

Указывает, где найти модули приложения.

[...]

--processor-module-path путь

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

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

person Slaw    schedule 15.03.2020
comment
Это действительно странно, так как это делает обработку аннотаций гораздо более неудобной. - person Puce; 01.06.2020
comment
Итак, я пришел к следующему решению: github.com/puce77/java11 -annotation-processor-test/tree/ — зарегистрировать обработчик аннотаций в обоих направлениях: module-info и META-INF, для поддержки пути к модулю и пути к классам — в модулях: укажите annotationProcessorPaths в плагине компилятора — в не-модулях: работает «из коробки» - person Puce; 01.06.2020
comment
@Puce спасибо, что поделились этим! хороший трюк с proc:none для процессорного модуля! - person Alexey Gavrilov; 11.04.2021