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基于final修饰数据过程解析

    Java基于final修饰数据过程解析

    这篇文章主要介绍了Java基于final修饰数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot Actuator未授权访问漏洞的排查和解决方法

    SpringBoot Actuator未授权访问漏洞的排查和解决方法

    Spring Boot Actuator 是开发和管理生产级 Spring Boot 应用程序的重要工具,它可以帮助你确保应用程序的稳定性和性能,本文给大家介绍了SpringBoot Actuator未授权访问漏洞的排查和解决方法,需要的朋友可以参考下
    2024-05-05
  • 解决IDEA2020.1版本不兼容Lombok的问题

    解决IDEA2020.1版本不兼容Lombok的问题

    这篇文章主要介绍了解决IDEA2020.1版本不兼容Lombok的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • springmvc如何进行异常处理

    springmvc如何进行异常处理

    这篇文章主要介绍了springmvc如何进行异常处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java方法及数组相关原理解析

    Java方法及数组相关原理解析

    这篇文章主要介绍了Java方法及数组相关原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java8需要知道的4个函数式接口简单教程

    Java8需要知道的4个函数式接口简单教程

    这篇文章主要介绍了Java 8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • Java Http的基础概念了解

    Java Http的基础概念了解

    这篇文章主要介绍了Java Http的基础概念,HTTP协议是建立在TCP协议之上的,这个程序是通过TCP编程来构建一个简单的Http服务器,需要的朋友可以参考下
    2023-04-04
  • SpringBoot全局异常处理之解决404/500错误

    SpringBoot全局异常处理之解决404/500错误

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息,这篇文章主要给大家介绍了关于SpringBoot全局异常处理之解决404/500错误的相关资料,需要的朋友可以参考下
    2023-11-11
  • springboot IDEA启动两个端口服务nginx负载过程

    springboot IDEA启动两个端口服务nginx负载过程

    这篇文章主要介绍了springboot IDEA启动两个端口服务nginx负载过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • BeanPostProcessor在显示调用初始化方法前修改bean详解

    BeanPostProcessor在显示调用初始化方法前修改bean详解

    这篇文章主要介绍了BeanPostProcessor在显示调用初始化方法前修改bean详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论