在使用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为例):
- 安装/更新Lombok插件: File → Settings → Plugins → 搜索「Lombok」→ 安装(若已安装,点击更新后重启IDEA);
- 开启注解处理: 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</encoding>
<!-- 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、构造器等冗余代码,但版本适配问题很容易被忽略。遇到此类编译报错,优先检查版本兼容性,按照本文步骤操作,基本都能一次性解决。
如果操作过程中仍有疑问,欢迎在评论区留言,一起交流解决~