使用Maven 3.8编译JDK 17项目报jdk.compiler模块未开放错误如何解决
问题原因
这个错误是低版本Lombok不兼容JDK16及更高版本的强封装机制导致的,具体逻辑如下:
- JDK16开始对JDK内部非公开API默认启用强封装限制,禁止未显式授权的外部代码通过反射访问内部类和属性,你遇到的报错就是JVM拦截了对
jdk.compiler模块下com.sun.tools.javac.processing包内部类的反射访问请求。 - 你项目中使用的Lombok版本为1.18.4,该版本发布于2018年,远早于JDK16的发布时间,没有适配高版本JDK的封装规则。而Lombok作为编译期注解处理器,运行时需要调用javac的内部API实现代码生成,刚好触发了上述访问限制。
- pom.xml中配置的
java.version、maven.compiler.source、maven.compiler.target仅控制编译输出的字节码兼容版本,不会修改执行编译的JDK本身的运行限制,所以调整这些参数不会生效,问题只和执行mvn命令的JDK版本有关。 - 报错日志未提及Lombok,是因为该异常是JVM层面在反射调用阶段直接抛出的,此时还未到Lombok输出自身标识日志的阶段,所以不会直接关联到Lombok。
解决方案
按优先级从高到低推荐以下方案:
方案1:升级Lombok版本(最推荐)
Lombok自1.18.20版本开始正式适配JDK16+的封装规则,仅需将pom.xml中的Lombok依赖版本升级到1.18.20及以上的稳定版即可解决问题,无需额外配置:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </dependency>
方案2:添加JVM开权参数(适用于暂时无法升级Lombok的场景)
如果受项目限制暂时不能升级Lombok,可以给maven编译插件添加JVM启动参数,强制开放对应的内部包访问权限:
在pom.xml中添加maven-compiler-plugin的配置如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.4</version> <configuration> <compilerArgs> <arg>--add-opens</arg> <arg>jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
方案3:降级编译用JDK版本(临时过渡方案)
如果上述两个方案都无法实施,可以将执行编译的JDK版本降级到15及以下,即可绕过高版本JDK的强封装限制,该方案仅适合临时调试使用,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Jose Martinez
相关产品推荐
相关产品推荐

