Lombok getters/setters 在我的注解处理器中不可见

Lombok getters/setters are not visible from my annotation processor

我对 javax.annotation.processing.AbstractProcessor 进行了自定义实现,并且它有效。 但是我的处理器没有找到由 Lombok 生成的 getters、setters 和构造函数。

这是我的proceesor(我需要创建最小的例子吗?): https://github.com/hohserg1/ElegantNetworking/blob/1.12.2-annotation-processor/src/main/java/hohserg/elegant/networking/annotation/processor/ElegantPacketProcessor.java#L62

示例class:

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
}

如果您希望 运行 Lombok 和另一个注释处理器,那么您应该 delombok 您的代码和 运行 您的注释处理器的结果。

这就是Checker Framework Gradle Plugin does, as explained in the Checker Framework Manual

解释: 大多数注释处理器要么产生输出(例如,发出警告),要么生成新的 类。 Lombok 是修改现有代码的注解处理器。它通过访问 javac 编译器(它也支持 eclipsec)的内部 API 来实现。这些操作导致 javac 发出字节码,其中包含 Lombok 对您的 类 的更改。但是,这些更改对于编译器的早期阶段是不可见的,尤其是您的注释处理器。换句话说,Lombok 不能很好地与其他注释处理器配合使用。

好的,我通过使用 gradle 依赖配置的 annotationProcessor 来解决这个问题:

dependencies {
    //gradle 4.6+
    annotationProcessor 'org.projectlombok:lombok:1.18.8', "io.gitlab.hohserg.elegant.networking:annotation-processor:2.8"
    ...
}

也不是所有的 lombok 更改仍然可以从我的注释处理器中看到。字段访问修饰符的变化是不可见的,但可以从 lombok 注释中确定。例如,@Value 将包私有字段设为私有。

插件 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"
    ...
}