Подтвердить что ты не робот

Указание порядка обработки аннотационных процессоров

Я пытаюсь запустить Dagger 2, а также Lombok в своем проекте Java. Разумеется, Ломбок должен работать первым, но действительно ли это на самом деле кажется случайным. Сначала я подозревал, что могу указать порядок по соответствующей позиции баннеров библиотеки в пути к классу, но этот порядок, очевидно, проигнорирован.

Есть ли способ указать порядок для их запуска каким-либо образом, или мне просто нужно жить, не имея возможности объединить две точки доступа?

Я подготовил тестовый сценарий SSCCE.

Простой git clone и mvn compile достаточно, чтобы продемонстрировать проблему - если вы прокомментируете строку 18 и раскомментируете строки 20-21 в App.java, она будет компилироваться, даже если нотация Lombok в строке 18 создает идентичные конструктор. Проблема в том, что Ломбок, похоже, работает после Кинжала.

4b9b3361

Ответ 1

После много исследований и беседы с одним из разработчиков Lombok выяснилось, что, поскольку javac загружает класс на основе hashCode(), порядок обработчиков аннотаций, работающих в этом сценарии, по сути, является случайным, и что еще хуже, случайный между несколькими прогонами. В настоящее время это не похоже на решение этой проблемы.

Я пошел с плагином lombok-maven и делюминировал все это, что не идеально и несколько взломанно, но, по крайней мере, дает рабочий результат. В надежде, что он может помочь будущим гуглерам, пришедшим сюда, я совершил рабочую версию в репо.

Ответ 2

В идеале порядок не должен иметь значения. Обработчики аннотаций должны создавать только файлы - всякий раз, когда создается файл, начинается другой раунд обработки, а другой процессор снова имеет возможность делать свою работу с новым файлом. В этом случае порядок не имеет особого значения, поэтому я не думаю, что существует официальный способ заставить порядок процессоров. Проблема в том, что процессор Lombok управляет существующими файлами вместо создания новых, которые он не должен делать. Некоторые компиляторы могут иметь возможность заказывать процессоры или использовать порядок загрузки или появления процессоров в аргументах командной строки, но это будет зависеть от реализации компилятора.

Вы можете попробовать посмотреть кинжалы и процесс сборки Lombok и посмотреть, какие процессоры вызывают там. Затем явным образом настройте эти процессоры в своей сборке maven в правильном порядке и протестируйте разные компиляторы и посмотрите, будет ли какой-либо из них запускать их в этом порядке.

При необходимости вы можете разбить процесс компиляции и запустить Lombok с -proc:only первым, а после этого другим шагом компиляции без Lombok и без переопределения файлов с манипуляциями (если это возможно, я никогда не пробовал это).

Ответ 3

В javac можно указать порядок обработчиков аннотаций, используя флаг -processor. Тем не менее, я не получил компиляцию даже с этим набором параметров. Я подозреваю, что кинжал напрямую смотрит на исходный код или что API-интерфейс обработчика аннотаций планирует обработчик аннотации в том же раунде, а модификации ломбока не распространяются.

Я думаю, что наиболее надежным решением является использование delombok, чтобы заставить порядок.

Раскрытие информации: Я разработчик Lombok.