克隆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
相关产品推荐
相关产品推荐

