Чтобы зарегистрировать поставщика услуг в 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?