java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor

当在IntelliJ IDEA 2021.1.2使用JDK1.8时,出现LombokProcessor错误。问题源于JDK版本过高与lombok版本不匹配。解决方法包括在pom.xml中升级lombok到1.18.12,并在Project Structure中设置使用corretto-1.8版本的JDK。完成这些步骤后,错误得以解决,代码能够正常运行。

参考:
1.https://www.cnblogs.com/ZZG-GANGAN/p/14789050.html
2.https://www.cjavapy.com/article/1932/
运行java代码时出现了错误: java: java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor
环境: IntelliJ IDEA 2021.1.2 x64
问题分析: JDK版本太高,lombok版本太低
解决方法:

1.升级和添加lombok的版本信息

需在pom.xml中添加一行代码<version>1.18.12</version> 版本信息需与自己电脑上的一致,可到maven中进行升级版本和查看的操作
在这里插入图片描述

2.使用jdk1.8

①File---->Project Structure
在这里插入图片描述

②检查是否有1.8版本的jdk,若有就直接跳到第④步,若无则需要下载操作:SDKs----> + ---->Dowload JDK
在这里插入图片描述
③选择version为1.8,其他默认即可
在这里插入图片描述
④点击使用corretto-1.8版本的JDK,先点击Apply,再点击OK
在这里插入图片描述
最后再次运行代码,就可以成功了,闯关成功!

### Java中因LombokJDK编译器模块间访问限制导致的`IllegalAccessError`问题分析 #### 问题背景 自Java 9引入模块化系统以来,通过JPMS(Java Platform Module System),类库之间的可见性和依赖关系变得更加严格。如果某些工具或框架试图访问未导出的包,则会触发诸如`java.lang.IllegalAccessError`之类的错误。 在特定场景下,当使用Lombok配合JDK自带的编译器模块`jdk.compiler`时,可能会遇到此类问题。这是因为Lombok需要深入操作编译过程中的内部API,而这些API可能并未公开给外部调用者[^1]。 --- #### 错误原因剖析 1. **模块间的访问控制** JDK 9及以上版本中,`jdk.compiler`模块默认情况下不会将其内部包导出至无命名模块(unnamed module)。这意味着任何尝试直接访问该模块私有功能的行为都会失败并抛出`IllegalAccessError`异常[^2]。 2. **Lombok的工作机制** Lombok简化了开发者编写样板代码的过程,它通过字节码注入技术修改AST(抽象语法树)。为了完成这一目标,在编译阶段需借助于`javax.annotation.processing.Processor`接口以及底层支持它的`com.sun.*`系列类。然而后者属于受保护区域的一部分,因此容易触犯上述提到的新规限。 3. **具体报错链路** 当运行环境切换到基于模块化的JVM实例上执行带Lombok注解处理程序(`LombokProcessor`)的任务时,若缺少必要的权限声明,则会出现如下形式的消息提示: ``` java.lang.IllegalAccessError: class lombok.javac.JavacAnnotationHandler (in unnamed module @0xabcdefg) cannot access class com.sun.tools.javac.code.Attribute$Proxy (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.code to unnamed module @0xabcdefg ``` --- #### 解决方案探讨 ##### 方法一:调整命令行参数增加开放选项 可以通过设置额外的启动标志位来放宽跨模块边界的约束条件: ```bash --add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ --add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \ --add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.parse=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED ``` 以上配置项的作用在于显式告知虚拟机允许来自匿名模块的对象读取指定路径下的资源数据结构定义详情。 ##### 方法二:升级相关组件版本号 确认当前使用的Lombok插件是否已经适配最新版OpenJDK/JDK发行序列;官方团队持续优化产品兼容性表现,针对已知缺陷通常会在后续迭代更新里修复掉。例如从v1.18.x迁移到更高层次编号之后往往能有效缓解部分棘手难题。 ##### 方法三:构建专属模块描述符文件 创建名为`module-info.java`的小型元信息脚本用于精确定义哪些外部实体可以合法引用本地封装的内容片段: ```java open module my.custom.module { requires jdk.compiler; } ``` 随后重新打包项目制品并将此新特性纳入考虑范围之内即可规避原始冲突状况发生概率提升整体稳定性水平。 --- ### 总结说明 综上所述,面对由Lombok引发关于非法越界请求事件的最佳实践应当综合考量实际开发需求灵活选用合适的技术手段加以应对处置。无论是临时性的快速修正措施还是长远规划布局都需要围绕现代软件工程原则展开讨论研究最终达成预期效果最大化目的。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值