解决Lombok编译报错:IllegalAccessError(JDK9+兼容问题)

7次阅读
没有评论

在使用Lombok简化Java开发时,不少同学升级JDK到9及以上版本后,会遇到如下编译报错,直接阻断项目构建,让人十分头疼:

Fatal error compiling: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x5dead1a1) 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 @0x5dead1a1

今天就来彻底解决这个问题,从根源解析原因,给出一步到位的解决方案,新手也能轻松操作。

一、错误核心原因(一句话看懂)

这个错误的本质是 高版本JDK(9+)与低版本Lombok不兼容,核心冲突点在于:

  • JDK 9及以上引入了「模块化(Module)」机制,为了安全性,封闭了JDK内部的编译API(比如com.sun.tools.javac.processing包),不允许外部非模块化依赖直接访问;
  • 低版本Lombok(<1.18.22)没有适配JDK的模块化机制,其底层实现依赖JDK内部的编译API,访问被阻断后,就会抛出IllegalAccessError(非法访问错误)。

简单说:旧版Lombok“找不着”JDK的核心编译类了,导致编译失败。

二、一键解决方案(99%可解决)

最核心、最省心的解决方式,就是 升级Lombok到适配高JDK的版本,无需修改业务代码,仅调整依赖即可。推荐使用Lombok 1.18.30(稳定版,完美兼容JDK 8~21),下面分项目类型给出具体配置。

1. Maven项目(pom.xml配置)

替换项目中原有旧版Lombok依赖,同时升级Maven编译插件(适配高JDK版本):

<dependencies>
    <!-- 替换为最新适配版Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<!-- 同步升级Maven编译插件(关键,避免编译环境不兼容) -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <!-- 替换为你项目实际使用的JDK版本(如8、11、17) -->
                <source>11</source>
                <target>11</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

2. Gradle项目配置

根据Gradle配置语法,分Groovy和Kotlin两种方式修改依赖:

Groovy语法(build.gradle)

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'
}

Kotlin语法(build.gradle.kts)

dependencies {
    compileOnly("org.projectlombok:lombok:1.18.30")
    annotationProcessor("org.projectlombok:lombok:1.18.30")
}

三、IDE辅助配置(避免IDEA内编译报错)

有些同学升级依赖后,命令行编译正常,但IDEA内仍报错,这是因为IDE的Lombok插件或注解处理未开启,需补充两步配置(以IDEA为例):

  1. 安装/更新Lombok插件: File → Settings → Plugins → 搜索「Lombok」→ 安装(若已安装,点击更新后重启IDEA);
  2. 开启注解处理: File → Settings → Build, Execution, Deployment → Compiler → Annotation Processors → 勾选「Enable annotation processing」(注解处理开关)。

配置完成后,IDEA会自动识别Lombok注解(@Data、@Getter等),报错即可消失。

四、特殊情况:JDK 16+ 额外配置(极少用到)

如果你的项目使用JDK 16、17、21等更高版本,升级Lombok后仍报错,可在编译参数中添加「允许非法访问」配置(仅针对JDK 16+),以Maven为例:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <source>17</source>
        <target>17</target>
        <encoding>UTF-8&lt;/encoding&gt;
        <!-- JDK 16+ 追加配置 -->
        <compilerArgs>
            <arg>--illegal-access=permit</arg>
        </compilerArgs>
    </configuration>
</plugin>

五、错误总结与注意事项

1. 核心总结

本次报错的核心矛盾是「JDK模块化」与「旧版Lombok不兼容」,解决优先级:

升级Lombok版本(核心)→ 升级编译插件 → IDE注解配置 → JDK 16+ 额外参数

2. 注意事项

  • Lombok版本建议≥1.18.22,优先选择1.18.30(稳定无bug);
  • JDK版本与编译插件版本需匹配(比如JDK 17对应maven-compiler-plugin 3.11.0+);
  • 无需修改业务代码,仅调整依赖和配置即可解决,避免盲目修改JDK版本。

最后

Lombok的核心作用是简化Java代码,减少getter/setter、构造器等冗余代码,但版本适配问题很容易被忽略。遇到此类编译报错,优先检查版本兼容性,按照本文步骤操作,基本都能一次性解决。

如果操作过程中仍有疑问,欢迎在评论区留言,一起交流解决~

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码