Указание порядка обработки аннотаций
Я пытаюсь запустить Dagger 2, а также Lombok в своем проекте Java. Конечно, Ломбок должен бежать первым, но похоже, что он действительно работает. Сначала я подозревал, что могу указать порядок по соответствующей позиции библиотечных фляг в пути к классам, но этот порядок, очевидно, игнорируется.
Есть ли способ указать порядок их запуска каким-либо образом, или мне просто приходится жить, не имея возможности объединить две точки доступа?
Я подготовил контрольный пример SSCCE.
Просто git clone
& mvn compile
достаточно продемонстрировать проблему - если вы прокомментируете строку 18 и раскомментируйте строки 20-21 в App.java, она скомпилируется, даже если нотация Lombok в строке 18 создает идентичный конструктор. Проблема в том, что Ломбок, кажется, бежит за Кинжалом.
3 ответа
После долгих исследований и бесед с одним из разработчиков Lombok, выясняется, что поскольку javac выполняет загрузку классов на основе hashCode(), порядок работы процессоров аннотаций, работающих в этом сценарии, по существу случайный, а, что еще хуже, случайный между несколькими пробеги. Там в настоящее время, кажется, нет решения этой проблемы.
Я пошел с плагином lombok-maven и деломбокировал всю вещь, которая не идеальна и несколько хакерская, но, по крайней мере, дает рабочий результат. В надежде, что это поможет будущим гуглерам, я отправил рабочую версию в репозиторий.
В идеале порядок не должен иметь значения. Процессоры аннотаций должны создавать только файлы - всякий раз, когда файл создается, начинается новый раунд обработки, и другие процессоры снова имеют возможность делать свое дело с новым файлом. В этом случае порядок на самом деле не имеет значения, поэтому я не думаю, что существует официальный способ форсировать порядок процессоров. Проблема в том, что процессор Lombok манипулирует существующими файлами вместо того, чтобы создавать новые, чего он не должен делать. Некоторые компиляторы могут иметь возможность упорядочивать процессоры или использовать порядок загрузки процессоров или их появления в аргументах командной строки, но это будет зависеть от реализации компилятора.
Вы можете посмотреть на процесс сборки Daggers и Lombok и посмотреть, какие процессоры там задействованы. Затем явно установите эти процессоры в вашей сборке maven в правильном порядке, протестируйте разные компиляторы и посмотрите, запускает ли их какой-либо из них в этом порядке.
При необходимости вы можете разделить процесс компиляции и запустить Lombok с -proc:only
сначала и после этого еще один шаг компиляции без Lombok и без переопределения манипулируемых файлов (если это возможно, я никогда не пробовал это).
Можно указать порядок обработки аннотаций в javac, используя -processor
флаг. Тем не менее, я не получил компиляцию даже с этим набором параметров. Я подозреваю, что кинжал смотрит на исходный код напрямую, или что API процессора аннотаций планирует процессор аннотаций в том же раунде, и модификации lombok не распространяются.
Я думаю, что самое надежное решение сейчас - использовать деломбок для наведения порядка.
Раскрытие информации: я разработчик Lombok.