Lombok 报错:无法访问 jdk.compiler 内部类的解决方案
作者:小猿、
概述
在使用 Lombok 简化 Java 开发时,不少开发者在 JDK 9 及以上版本会遇到如下报错:class
lombok.javac.apt.LombokProcessor (in unnamed module @0x6971c6b7) 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 @0x6971c6b7
本文将从报错根源切入,拆解问题本质,提供 4 套可落地的解决方案,并补充避坑要点,帮助开发者彻底解决该问题。
一、报错根源:JDK 模块化与 Lombok 的核心冲突
要解决报错,需先理解两个关键技术点的交互逻辑:
1. JDK 9 + 的模块化机制:从 “开放” 到 “隔离”
JDK 8 及之前版本,Java 类加载采用 “全局可见” 模式,JDK 内部类(如com.sun.tools.javac相关类)可被外部代码直接访问。但从 JDK 9 开始,Java 引入模块化系统(Module System),核心目标是实现 “代码隔离”:
- JDK 按功能拆分为多个独立模块(如负责编译的
jdk.compiler、负责基础功能的jdk.base); - 每个模块通过
module-info.java明确声明 “对外暴露的包” 和 “依赖的模块”; - 未声明 “导出” 的内部包(如
jdk.compiler下的com.sun.tools.javac.processing),默认拒绝外部访问。
2. Lombok 的运行原理:依赖 JDK 内部编译类
Lombok 并非普通 Java 库,其核心能力(如@Data自动生成 getter/setter、@Slf4j创建日志对象)依赖Java 编译时注解处理器(APT):
- 编译阶段,Lombok 通过
lombok.javac.apt.LombokProcessor介入javac编译器流程; - 需访问
com.sun.tools.javac.processing.JavacProcessingEnvironment(javac内部管理注解处理器的核心类),才能修改抽象语法树(AST),实现 “少写代码” 的效果。
冲突点:JDK 9 + 的jdk.compiler模块未 “导出”com.sun.tools.javac.processing包,而 Lombok 默认处于 “无名模块(unnamed module)” 中,无法访问该内部包,最终触发权限报错。
二、4 套解决方案:从简单到进阶(优先级排序)
根据项目实际场景(Lombok 版本、JDK 版本、构建工具),可选择以下方案,推荐优先尝试前两种。
方案一:升级 Lombok 到最新版本(首选无侵入方案)
Lombok 团队已针对 JDK 模块化问题持续适配,从1.18.16版本开始,通过优化内部逻辑减少对 JDK 内部类的依赖,或通过合规方式访问,直接规避报错。这是最简单、最稳定的解决方案。
操作步骤:
- 查看当前 Lombok 版本在
pom.xml(Maven)或build.gradle(Gradle)中找到 Lombok 依赖,确认当前版本(如旧版本1.18.10需升级)。 - 替换为最新稳定版本访问Lombok 官方 Maven 仓库,获取最新版本(截至 2024 年,最新稳定版为
1.18.30),替换依赖配置。
Maven 项目示例:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version> <!-- 替换为最新版本 -->
<scope>provided</scope> <!-- 编译时依赖,不打包到最终产物 -->
</dependency>Gradle 项目示例:
dependencies {
provided 'org.projectlombok:lombok:1.18.30' // 编译时依赖
annotationProcessor 'org.projectlombok:lombok:1.18.30' // 必须配置注解处理器
}验证效果Maven 执行mvn clean compile,Gradle 执行gradle clean build,若编译通过,报错已解决。
方案二:添加 JVM 编译参数,显式 “导出” 内部包
若因项目依赖限制(如必须使用旧版本 Lombok)无法升级,可通过JVM 参数强制jdk.compiler导出内部包,打破模块化访问限制。
不同构建工具的配置方式:
1. Maven 项目:配置maven-compiler-plugin
在pom.xml的build/plugins节点下添加插件,指定编译参数:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 适配JDK 9+的最低版本 -->
<configuration>
<source>17</source> <!-- 与项目JDK版本一致(如JDK 17) -->
<target>17</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<!-- 核心参数:允许jdk.compiler导出内部包给所有无名模块 -->
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<!-- 若后续出现其他内部类报错,可追加类似参数,例如:
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
-->
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>2. Gradle 项目:配置compileJava任务
在build.gradle中添加编译参数:
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
sourceCompatibility = JavaVersion.VERSION_17 // 与项目JDK一致
targetCompatibility = JavaVersion.VERSION_17
// 添加JVM参数
options.compilerArgs += [
'--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED'
]
}3. IDE 临时配置(测试用)
若需在 IDE 中快速验证,可直接配置编译参数:
- IntelliJ IDEA:
File > Settings > Build > Compiler > Java Compiler,在 “Additional command line parameters” 中输入上述参数,重建项目。 - Eclipse:
Project > Properties > Java Compiler > Annotation Processing,勾选 “Enable annotation processing”,并在 “Factory Path” 添加 Lombok JAR 包,同时补充上述参数。
方案三:修复 IDE 的 Lombok 配置(排除环境问题)
有时报错并非代码 / 依赖问题,而是 IDE 的 Lombok 插件或注解处理功能未正确配置,导致处理器无法运行。需从 3 点排查:
1. 确认 IDE 已安装 Lombok 插件
- IntelliJ IDEA:
File > Settings > Plugins,搜索 “Lombok”,确认已安装并启用(安装后需重启 IDE)。 - Eclipse:
Help > Eclipse Marketplace,搜索 “Lombok” 安装,重启后生效。
2. 启用 “注解处理” 功能
Lombok 依赖注解处理器工作,若未启用会导致处理器加载失败:
- IntelliJ IDEA:
File > Settings > Build > Annotation Processors,勾选 “Enable annotation processing”。 - Eclipse:
Project > Properties > Java Compiler > Annotation Processing,勾选 “Enable annotation processing”。
3. 统一 IDE 与项目的 JDK 版本
若 IDE 使用的 JDK 与项目配置不一致(如项目用 JDK 17,IDE 用 JDK 8),会触发模块化适配问题:
- IntelliJ IDEA:
File > Project Structure > Project,将 “Project SDK” 改为项目使用的 JDK 版本。
方案四:降级 JDK 到 8 版本(应急方案,不推荐)
若上述方案均无法实施,可临时将 JDK 降级到 JDK 8——JDK 8 无模块化机制,com.sun.tools.javac.processing包可直接访问,不会报错。
注意事项:
- JDK 8 已于 2026 年停止 Oracle 官方支持,长期使用存在安全风险;
- 降级前需确认项目无 JDK 9 + 特性(如模块化语法、接口私有方法),避免新的兼容性问题。
三、避坑指南:解决后的关键注意事项
优先升级 Lombok,拒绝 “绕过” 机制添加
--add-exports参数本质是 “绕过” JDK 模块化规则,若未来 JDK 调整内部包结构(如移除com.sun.tools.javac.processing),该参数会失效;而升级 Lombok 是官方适配方案,兼容性更强。避免 Lombok 版本冲突若项目中多个依赖间接引入不同版本 Lombok(如 A 依赖用 1.18.10,B 依赖用 1.18.30),会导致处理器加载异常。可通过以下命令查看依赖树,排除旧版本:
- Maven:
mvn dependency:tree | grep lombok - Gradle:
gradle dependencies | grep lombok
- Maven:
JDK 17 + 的额外适配JDK 17 对内部 API 限制更严格,旧版本 Lombok(如 1.18.22 以下)即使添加
--add-exports也可能报错,需确保 Lombok 版本≥1.18.22。
四、总结
Lombok 报错 “无法访问 jdk.compiler 内部类” 的核心是JDK 9 + 模块化与 Lombok 运行依赖的冲突。解决问题的最优路径是:
- 优先升级 Lombok 到最新版本;
- 若无法升级,添加 JVM 编译参数导出内部包;
- 最后排查 IDE 配置,确保插件与注解处理功能正常。
在 Java 生态升级的背景下,保持 Lombok 与 JDK 版本同步,是避免此类兼容性问题的长期策略。
到此这篇关于Lombok 报错:无法访问 jdk.compiler 内部类的解决方案的文章就介绍到这了,更多相关Lombok无法访问 jdk.compiler 内部内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
