#java #annotations #lombok
#java #аннотации #ломбок
Вопрос:
Я сделал пользовательскую реализацию javax.annotation.processing.AbstractProcessor
, и она работает. Но мой процессор не нашел геттеры, сеттеры и конструкторы, сгенерированные Lombok.
Вот мой propceesor (нужно ли мне создавать минимальный пример?): https://github.com/hohserg1/ElegantNetworking/blob/1.12.2-annotation-processor/src/main/java/hohserg/elegant/networking/annotation/processor/ElegantPacketProcessor.java#L62
Пример класса:
ElegantPacket //my
@Value //lombok
public class Test implements ClientToServerPacket {
int some; //it visible
//int getSome() //generated by Lombok, it invisible
//public Test(int some) //generated by Lombok, it invisible
}
Ответ №1:
Если вы хотите запустить как Lombok, так и другой процессор аннотаций, вам следует удалить свой код и запустить свой процессор аннотаций для результата.
Это то, что делает плагин Checker Framework Gradle, как описано в руководстве Checker Framework .
Объяснение: большинство процессоров аннотаций либо выдают выходные данные (скажем, выдают предупреждения), либо генерируют новые классы. Lombok — это процессор аннотаций, который изменяет существующий код. Это делается путем доступа к внутренним API-интерфейсам javac
компилятора (он также поддерживает eclipsec
). Эти манипуляции приводят javac
к выделению байт-кода, который содержит изменения Lombok в ваших классах. Однако эти изменения невидимы для более ранних этапов компилятора, в частности для вашего процессора аннотаций. Другой способ сказать все это заключается в том, что Lombok плохо работает с другими процессорами аннотаций.
Ответ №2:
Хорошо, я решаю это с помощью annotationProcessor
конфигурации зависимостей gradle:
dependencies {
//gradle 4.6
annotationProcessor 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.8"
...
}
Также не все изменения lombok все еще видны из моего процессора аннотаций. Изменения модификаторов доступа к полям не видны, но это можно определить из аннотаций lombok. Например, @Value превращает поля package-private в private .
Также плагин apt может использоваться для gradle менее 4.6
buildscript {
repositories {
...
maven { url 'https://plugins.gradle.org/m2/' }
}
dependencies {
...
classpath 'net.ltgt.gradle:gradle-apt-plugin:0.9'
}
}
dependencies {
apt 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.7"
...
}