升级Lombok至1.18.28搭配JDK17时编译报错原因咨询
Java 17升级后Lombok+MapStruct编译报错:InaccessibleObjectException的解决方案
问题成因
- Java 17的模块系统(JPMS)默认限制反射访问JDK内部非公开API,报错中
jdk.compiler模块未向未命名模块开放com.sun.tools.javac.processing包,而Lombok 1.18.28仍依赖该内部包的反射调用。 - MapStruct与Lombok的注解处理器执行顺序冲突,可能触发Lombok的不安全反射逻辑。
解决方案
1. 升级Lombok到Java 17兼容版本
优先升级Lombok至1.18.30及以上,该版本彻底适配Java 17模块系统,移除了对JDK内部API的不安全反射。修改Maven依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency>
若使用Lombok Maven插件,同步更新版本:
<plugin> <groupId>org.projectlombok</groupId> <artifactId>lombok-maven-plugin</artifactId> <version>1.18.30.0</version> </plugin>
2. 添加JVM编译参数开放模块访问(临时方案)
若暂时无法升级Lombok,可通过Maven编译器插件添加JVM参数,允许jdk.compiler模块向未命名模块开放指定包:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> <compilerArgs> <arg>--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg> <arg>--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin>
3. 配置注解处理器执行顺序
确保Lombok处理器优先于MapStruct执行,因为MapStruct依赖Lombok生成的getter/setter。在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> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </path> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.2.Final</version> </path> </annotationProcessorPaths> </configuration> </plugin>
验证方法
执行mvn clean compile重新编译项目,若仍报错,清理本地Maven仓库中Lombok的缓存目录(~/.m2/repository/org/projectlombok)后重新拉取依赖。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

