如何调整Gradle构建顺序使ByteBuddy注入的Lombok注解触发代码生成
问题解答
1. 能否调整ByteBuddy任务运行在Lombok处理之前
无法实现。ByteBuddy Gradle插件的核心逻辑是操作编译后的.class字节码文件,默认绑定compileJava任务的后续执行阶段。而Lombok作为注解处理器,运行在编译流程的源码解析、语法树处理阶段,在字节码文件生成前就已经完成了注解识别和代码生成。哪怕强行修改任务依赖顺序把ByteBuddy调到compileJava之前,此时还没有生成字节码文件,ByteBuddy无处理对象,完全无法生效。
2. ByteBuddy是否适合该场景
不适合。ByteBuddy的定位是字节码增强工具,处理的是编译完成的字节码,和Lombok的处理时机、处理对象完全错开,无法达成给Lombok传递注解的目标。
3. 可行的构建期插入Lombok注解方案
方案1:源码预修改
自定义Gradle任务在compileJava执行前直接修改源码文件,步骤如下:
- 引入JavaParser等源码解析工具作为构建脚本依赖
- 编写自定义
SourceTask类型的Gradle任务,匹配需要加注解的类,通过源码解析工具写入Lombok注解后输出到临时目录 - 将修改后的临时源码目录设为
compileJava的输入源,设置compileJava依赖自定义任务
参考配置片段:
buildscript { dependencies { classpath 'com.github.javaparser:javaparser-core:3.25.8' } } task addLombokAnnotations(type: SourceTask) { source = sourceSets.main.java outputs.dir "${buildDir}/generated/sources/lombok-modified" doLast { // 此处编写JavaParser逻辑,给符合条件的类加Lombok注解后输出到outputs目录 } } compileJava { source = addLombokAnnotations.outputs dependsOn addLombokAnnotations }
方案2:自定义前置注解处理器
开发自定义注解处理器,设置优先级高于Lombok,在编译期注解处理的第一轮阶段,直接在内存中给目标类的抽象语法树添加Lombok注解。Lombok后续处理时会直接识别到这些内存中的注解,生成对应代码。该方案不需要修改物理源码,流程更干净,需要注意不同JDK版本的语法树API兼容性问题。
内容的提问来源于stack exchange,提问作者jaco0646
相关产品推荐
相关产品推荐

