2016-07-13 2 views
3

Я работаю над проектом с несколькими модулями maven, в котором один из модулей содержит несколько обработчиков аннотаций для пользовательских аннотаций, используемых другими модулями. Когда я добавляю зависимость модуля процессора аннотации к любому другому модулю, аннотации этих модулей обрабатываются этими обработчиками аннотаций.Использование пользовательских обработчиков аннотаций рядом с Checker Framework

Но недавно я включил Checker Framework (для аннотаций типа), а затем все пользовательские обработчики аннотации (я упоминал выше) перестали работать. Приветствуется любая идея о том, как заставить их работать даже с Checker Framework?


Чтобы очистить сценарий,

Скажем, у меня есть модуль Maven с именем module_A. В этом модуле у меня есть аннотация (класс), называемая «@FoodItem». Мне нужно обеспечить соблюдение правила, согласно которому любой класс, аннотированный аннотацией @FoodItem, должен реализовать интерфейс «Продовольствие». Поэтому я написал обработчик аннотации «FoodItemAnnotationProcessor» в том же модуле (module_A), который обрабатывает такие классы и проверяет соответствие этому правилу.

Тогда, допустим, у меня есть еще один модуль с именем module_B, который имеет зависимость от maven с модулем_A. В этом модуле у меня есть класс под названием «Пицца», который аннотируется аннотацией @FoodItem.

Если вы построили проект (который имеет модули_A и module_B) с вышеуказанной конфигурацией, «ProcessItemAnnotationProcessor» выполняется на этапе компиляции и проверяет класс «Пицца» для упомянутого выше правила.

После этого я интегрировал рамки Checker в module_B (как упоминалось here). Затем проверки, связанные с каркасом проверки, выполняются во время компиляции, как ожидалось, но «FoodItemAnnotationProcessor» перестает работать.

+0

Можете ли вы дать более подробную информацию о своей установке или (желательно!) Минимальном рабочем примере? – mernst

+0

Добавлено описание сценария –

+0

Шаг 3 инструкций, на которые вы ссылались, включает фрагмент кода с комментарием ''. Вы включили в него программу FoodItemAnnotationProcessor? – mernst

ответ

0

Чтобы понять проблему, вы должны знать, как javac находит ваши обработчики аннотаций.

Если вы не поставить --processor аргумент для JAVAC (см doc-javac-options), затем аннотацию-процессор функцию автоматического обнаружения (см javac-doc: Annotation processing) активируется. Это означает, что javac будет искать все доступные аннотационные процессоры в вашем classpath (или processorpath, если вы указали его).
Ящики, содержащие файл META-INF/services/javax.annotation.processing.Processor, могут указывать классы классов аннотации, и javac будет автоматически их использовать.

«Проблема» в том, что в чекер-каркасе есть несколько многократных обработчиков аннотаций для проверок, но вы можете использовать только некоторые из них: таким образом, процесс обнаружения аннотаций не может быть использован, и вы должны вручную указать все аннотации процессоры для запуска в вашем файле сборки.

Для Maven сборки, вы можете сделать это следующим образом: checker-framework doc for Maven

<annotationProcessors> 
    <!-- Add all the checkers you want to enable here --> 
    <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> 
</annotationProcessors> 

Это будет явно установить --processor аргумент для JAVAC (см doc-javac-options), который отключает процесс аннотацию-открытие по умолчанию.

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

E.g.если вы хотите запустить NullnessChecker и Dagger, необходимо указать как:

<annotationProcessors> 
    <!-- Add all the checkers you want to enable here --> 
    <annotationProcessor>org.checkerframework.checker.nullness.NullnessChecker</annotationProcessor> 
    <!-- Add all your other annotation processors here --> 
    <annotationProcessor>dagger.internal.codegen.ComponentProcessor</annotationProcessor> 
</annotationProcessors> 

Подсказка:
, чтобы выяснить, какие аннотацию процессоры вы сейчас используете, запустить сборку и передать Non-Standard Option -XprintProcessorInfo в JAVAC ,

UPDATE:

Шашка также поддерживает какое-то автоматическое обнаружение (doc-ref) - Примечание: Я не использовал это пока.

2.2.3 Проверка автоматического обнаружение

«Автоматическое обнаружение» делает Javac компилятор всегда запускать клетчатый плагин, даже если вы явно не передать параметр -Процессора командной строки. Это может привести к сокращению вашей командной строки и гарантирует, что ваш код проверен, даже если вы забудете опцию командной строки.

Чтобы включить автоматическое обнаружение, поместите конфигурационный файл с именем META-INF/services/javax.annotation.processing.Processor в вашем пути . Файл содержит имена плагинов checker, которые должны быть указаны: , которые перечислены по одной строке. Например, чтобы запустить Nullness Checker и интернирование Checker автоматически, файл конфигурации должен содержать :

org.checkerframework.checker.nullness.NullnessChecker
org.checkerframework.checker.interning.InterningChecker