Lombok 报错:无法访问 jdk.compiler 内部类的解决方案

 更新时间:2025年10月22日 15:38:08   作者:小猿、  
本文分析了JDK9及以上版本中Lombok报错"无法访问jdk.compiler内部类"的问题根源,并提供了4中解决方案,具有一定的参考价值,感兴趣的可以了解一下

概述

在使用 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.JavacProcessingEnvironmentjavac内部管理注解处理器的核心类),才能修改抽象语法树(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.xmlbuild/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 IDEAFile > Settings > Build > Compiler > Java Compiler,在 “Additional command line parameters” 中输入上述参数,重建项目。
  • EclipseProject > Properties > Java Compiler > Annotation Processing,勾选 “Enable annotation processing”,并在 “Factory Path” 添加 Lombok JAR 包,同时补充上述参数。

方案三:修复 IDE 的 Lombok 配置(排除环境问题)

有时报错并非代码 / 依赖问题,而是 IDE 的 Lombok 插件或注解处理功能未正确配置,导致处理器无法运行。需从 3 点排查:

1. 确认 IDE 已安装 Lombok 插件

  • IntelliJ IDEAFile > Settings > Plugins,搜索 “Lombok”,确认已安装并启用(安装后需重启 IDE)。
  • EclipseHelp > Eclipse Marketplace,搜索 “Lombok” 安装,重启后生效。

2. 启用 “注解处理” 功能

Lombok 依赖注解处理器工作,若未启用会导致处理器加载失败:

  • IntelliJ IDEAFile > Settings > Build > Annotation Processors,勾选 “Enable annotation processing”。
  • EclipseProject > Properties > Java Compiler > Annotation Processing,勾选 “Enable annotation processing”。

3. 统一 IDE 与项目的 JDK 版本

若 IDE 使用的 JDK 与项目配置不一致(如项目用 JDK 17,IDE 用 JDK 8),会触发模块化适配问题:

  • IntelliJ IDEAFile > Project Structure > Project,将 “Project SDK” 改为项目使用的 JDK 版本。

方案四:降级 JDK 到 8 版本(应急方案,不推荐)

若上述方案均无法实施,可临时将 JDK 降级到 JDK 8——JDK 8 无模块化机制,com.sun.tools.javac.processing包可直接访问,不会报错。

注意事项:

  • JDK 8 已于 2026 年停止 Oracle 官方支持,长期使用存在安全风险;
  • 降级前需确认项目无 JDK 9 + 特性(如模块化语法、接口私有方法),避免新的兼容性问题。

三、避坑指南:解决后的关键注意事项

  1. 优先升级 Lombok,拒绝 “绕过” 机制添加--add-exports参数本质是 “绕过” JDK 模块化规则,若未来 JDK 调整内部包结构(如移除com.sun.tools.javac.processing),该参数会失效;而升级 Lombok 是官方适配方案,兼容性更强。

  2. 避免 Lombok 版本冲突若项目中多个依赖间接引入不同版本 Lombok(如 A 依赖用 1.18.10,B 依赖用 1.18.30),会导致处理器加载异常。可通过以下命令查看依赖树,排除旧版本:

    • Maven:mvn dependency:tree | grep lombok
    • Gradle:gradle dependencies | grep lombok
  3. JDK 17 + 的额外适配JDK 17 对内部 API 限制更严格,旧版本 Lombok(如 1.18.22 以下)即使添加--add-exports也可能报错,需确保 Lombok 版本≥1.18.22。

四、总结

Lombok 报错 “无法访问 jdk.compiler 内部类” 的核心是JDK 9 + 模块化与 Lombok 运行依赖的冲突。解决问题的最优路径是:

  1. 优先升级 Lombok 到最新版本;
  2. 若无法升级,添加 JVM 编译参数导出内部包;
  3. 最后排查 IDE 配置,确保插件与注解处理功能正常。

在 Java 生态升级的背景下,保持 Lombok 与 JDK 版本同步,是避免此类兼容性问题的长期策略。

到此这篇关于Lombok 报错:无法访问 jdk.compiler 内部类的解决方案的文章就介绍到这了,更多相关Lombok无法访问 jdk.compiler 内部内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何向主函数main中传入参数

    Java如何向主函数main中传入参数

    这篇文章主要介绍了Java如何向主函数main中传入参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 详解SpringBoot集成Redis来实现缓存技术方案

    详解SpringBoot集成Redis来实现缓存技术方案

    本篇文章主要介绍了详解SpringBoot集成Redis来实现缓存技术方案,具有一定的参考价值,有兴趣的可以了解一下
    2017-06-06
  • 新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)

    新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)

    这篇文章主要介绍了新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目的图文教程,需要的朋友可以参考下
    2018-01-01
  • Java中使用File类创建文件方法总结

    Java中使用File类创建文件方法总结

    Java File类是I/O操作基础,用于表示文件路径,提供构造方法、文件创建、信息获取(如名称、路径、大小)及目录操作,这篇文章主要介绍了Java中使用File类创建文件方法的相关资料,需要的朋友可以参考下
    2025-05-05
  • Java 18 新特性之Web服务器 jwebserver功能

    Java 18 新特性之Web服务器 jwebserver功能

    JEP 408: Simple Web Server,是这次Java 18推出的一个比较独立的全新功能点。我们可以通过命令行工具来启动一个提供静态资源访问的迷你Web服务器,本文通过一个构建HTML页面的例子,来尝试一下jwebserver的功能
    2022-04-04
  • mybaties plus selectMaps和selectList的区别说明

    mybaties plus selectMaps和selectList的区别说明

    这篇文章主要介绍了mybaties plus selectMaps和selectList的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java实现简单图书管理系统

    java实现简单图书管理系统

    这篇文章主要为大家详细介绍了java实现简单图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java高并发写入用户信息到数据库的几种方法

    java高并发写入用户信息到数据库的几种方法

    本文主要介绍了java高并发写入用户信息到数据库的几种方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Java中的事件处理机制详解

    Java中的事件处理机制详解

    这篇文章主要介绍了Java中的事件处理机制详解,Java事件处理是采取"委派事件模型",当事件发生时,产生事件的对象,会把此"信息"传递给"事件的监听者"处理,这里所说的"信息"实际上就是java.awt.event事件类库里某个类创建对象,需要的朋友可以参考下
    2023-09-09
  • 浅析SpringBoot如何解决CORS问题

    浅析SpringBoot如何解决CORS问题

    在前后端分离的开发模式中,经常会遇到 跨域资源共享(CORS) 的问题,本文将全面介绍 Spring Boot 中处理 CORS 的常见方法,大家可以根据需要进行选择
    2025-05-05

最新评论