Обработчики информации о модулях и аннотаций Java 11

Как мы можем предоставить обработчику аннотаций модуль Java 11?

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

import javax.annotation.processing.Processor;
import com.mycompany.mylib.impl.MyAnnotationProcessor;

module com.mycompany.mylib {

    provides Processor with MyAnnotationProcessor;

}

Сейчас, к сожалению, этого недостаточно, так как пакеты javax.annotation.processing, javax.lang.model.* и javax.tools находятся не в модуле java.base, а в модуле java.compiler.

С Java SE 8 все было просто доступно в JRE, но с Java 11 мы получаем возможность использовать только подмножество. Затем с помощью jlink мы можем создавать образы времени выполнения меньшего размера.

Теперь, конечно, я мог бы просто добавить следующее в информацию о модуле:

requires java.compiler;

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

Но обработка аннотаций — это нечто особенное: это код, выполняемый во время компиляции, а не во время выполнения. Таким образом, он не должен быть частью образа среды выполнения. Это должно быть только требование/зависимость времени компиляции.

Есть ли способ решить эту проблему с помощью модульной системы Java 11?


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


Ответы (1)


Вроде надо писать

требуется статический java.compiler;

В JLS 7.7.1 указано, что

За ключевым словом required может следовать модификатор static. Это указывает на то, что зависимость, являющаяся обязательной во время компиляции, является необязательной во время выполнения.

person Victor Nazarov    schedule 27.01.2021