Lombok1.18.30搭配Java17/21编译时IllegalAccessError问题求助
问题
编译Gradle项目时遇到以下错误:
java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x44492a8a) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x44492a8a
已知早期Lombok版本出现该问题时升级即可解决,但已使用最新的Lombok 1.18.30仍存在此问题。尝试过Java 21、Java 17版本均报错,仅Java 8可正常运行;测试多个Gradle版本,仅Gradle 8.5宣称兼容Java 21。
补充的build.gradle相关配置:
compileOnly('org.projectlombok:lombok:1.18.30') apply plugin: 'io.franzbecker.gradle-lombok' import io.franzbecker.gradle.lombok.task.DelombokTask task delombok(type: DelombokTask, dependsOn: compileJava) { ext.outputDir = file("$buildDir/delombok") outputs.dir(outputDir) sourceSets.main.java.srcDirs.each { inputs.dir(it) args(it, "-d", outputDir) } doFirst { outputDir.deleteDir() } }
解决方案
1. 替换为官方维护的Lombok Gradle插件
当前使用的io.franzbecker.gradle-lombok插件已停止维护,对Java 17+的模块系统支持不足。改用官方推荐的io.freefair.lombok插件:
- 删除原有插件的
apply plugin: 'io.franzbecker.gradle-lombok'配置 - 添加官方插件配置(适配Gradle 7.0+):
plugins { id 'io.freefair.lombok' version '8.6' // 8.6版本兼容Gradle 8.5,可按需调整 }
- 保留
compileOnly 'org.projectlombok:lombok:1.18.30',或升级到Lombok最新稳定版(如1.18.32)提升Java 21适配性
2. 调整Delombok任务配置
官方插件已内置Delombok功能,无需自定义任务,直接使用插件提供的delombok任务即可。若需自定义,参考以下配置:
tasks.withType(DelombokTask) { outputDir = file("$buildDir/delombok") sourceSets.main.java.srcDirs.each { inputs.dir(it) args(it, "-d", outputDir) } doFirst { outputDir.deleteDir() } }
注意移除任务对compileJava的依赖,避免编译顺序冲突。
3. 添加JVM参数适配模块系统(备选方案)
若暂时无法替换插件,可在Gradle配置中添加JVM参数,允许Lombok访问jdk.compiler模块的内部API:
在build.gradle中给Java编译任务添加参数:
tasks.withType(JavaCompile) { options.compilerArgs += [ '--add-exports', 'jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED' ] }
同时给自定义的Delombok任务添加相同参数:
task delombok(type: DelombokTask, dependsOn: compileJava) { // 保留原有配置 jvmArgs += [ '--add-exports', 'jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED' ] }
4. 确认版本兼容性
确保Gradle与Java版本完全匹配:
- Java 17需搭配Gradle 7.3及以上版本
- Java 21必须使用Gradle 8.3及以上版本,当前使用的Gradle 8.5符合要求,但需排查项目中是否存在其他旧插件或配置冲突
内容的提问来源于stack exchange,提问作者mightypants
相关产品推荐
相关产品推荐

