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

克隆Spring Boot项目时遭遇ExceptionInInitializerError:无法访问私有字段问题求助

解决Java模块系统访问限制错误:module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module

这个错误是典型的Java 9+模块系统反射访问限制问题,你的项目依赖的一些旧工具库(比如wro4j、MapStruct或Lombok的旧版本)在尝试通过反射访问JDK内部API时被模块系统阻止了。下面是几种可行的解决办法,按推荐优先级排序:

方案1:降级JDK版本(最简单直接)

课程项目大概率是基于JDK 8或JDK 11开发的,你可以把项目使用的JDK版本切换到JDK 11或更低版本:

  • 在IDE中设置项目SDK为JDK 11
  • 如果用Maven,在pom.xml的<properties>里添加:
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    

方案2:添加VM参数开放模块访问(不降级JDK的临时方案)

如果不想降级JDK,可以给编译器和运行时添加VM参数,允许未命名模块访问JDK的内部包:

  • 在IDE的运行配置中添加VM参数:
    --add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
    --add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
    
  • 如果用Maven编译,在maven-compiler-plugin的配置里添加参数:
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
      <configuration>
        <compilerArgs>
          <arg>--add-opens</arg>
          <arg>jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
          <arg>--add-opens</arg>
          <arg>jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
        </compilerArgs>
        <!-- 原有的annotationProcessorPaths配置保持不变 -->
      </configuration>
    </plugin>
    

方案3:更新依赖版本到适配高JDK的版本(长期解决方案)

你的pom.xml里几个关键依赖版本太旧,不支持Java 9+的模块系统,建议更新到以下版本:

修改后的关键依赖/插件配置:

<properties>
  <!-- 新增JDK版本配置(如果用JDK17) -->
  <maven.compiler.source>17</maven.compiler.source>
  <maven.compiler.target>17</maven.compiler.target>
  <!-- 升级依赖版本 -->
  <wro4j.version>1.10.1</wro4j.version>
  <org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
  <org.projectlombok.version>1.18.30</org.projectlombok.version>
</properties>

<build>
  <plugins>
    <!-- 升级wro4j插件 -->
    <plugin>
      <groupId>ro.isdc.wro4j</groupId>
      <artifactId>wro4j-maven-plugin</artifactId>
      <version>${wro4j.version}</version>
      <!-- 原有的execution和configuration保持不变 -->
    </plugin>
    <!-- 升级maven-compiler-plugin到支持高JDK的版本 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.11.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
          </path>
          <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
          </path>
          <!-- 新增lombok-mapstruct-binding,解决Lombok和MapStruct的兼容性问题 -->
          <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-mapstruct-binding</artifactId>
            <version>0.2.0</version>
          </path>
        </annotationProcessorPaths>
      </configuration>
    </plugin>
    <!-- 其他插件配置保持不变 -->
  </plugins>
</build>

为什么会出现这个错误?

Java 9引入了模块系统(Project Jigsaw),默认限制了对JDK内部API的反射访问。你的项目中,wro4j 1.8.0(旧版本)在处理资源打包时,会反射访问com.sun.tools.javac.processing下的内部类,而高版本JDK(16+)默认不允许未命名模块(你的项目属于未命名模块)访问这些内部包,因此抛出了ExceptionInInitializerError。

内容的提问来源于stack exchange,提问作者Nabeel Bhatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:57:50