Java 11 module-info: как зарегистрировать процессор аннотаций - PullRequest
2 голосов
/ 15 марта 2020

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

module com.mycompany.mylib {

    provides ServiceInterface with ServiceImpl;

}

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

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

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

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

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

Версия в мастер-ветви - это версия , которая работает :

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

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

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

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

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

в ветви только для одного модуля Я снова удалил информацию о модуле из java11-sample-annotation-processor. Процессор аннотаций зарегистрирован в src/main/resources/META-INF/services/javax.annotation.processing.Processor.

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

1 Ответ

1 голос
/ 15 марта 2020

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

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

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

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

[...]

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

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

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

--module-path path или -p path

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

[...]

--processor-module-path путь

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

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

...