You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:36:03