Получатели / установщики Lombok не видны из моего процессора аннотаций

#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"
    ...
}