IntelliJ/Maven执行mvn install及spring-boot:run时Bean创建失败求助
问题:Maven构建与Spring Boot运行时的反射权限错误
错误场景
在IntelliJ终端执行mvn install构建Maven项目时,测试用例启动失败,抛出反射权限相关错误;后续在pom.xml中添加参数后mvn install可正常执行,但mvn spring-boot:run启动应用时仍报相同错误。
错误日志
[ERROR] com.scopic.javachallenge.controllers.TeamProcessControllerTest.testSample Time elapsed: 0 s <<< ERROR! java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityMapper' defined in file [C:\Users\ronit\Documents\Repos\target\classes\com\scopic\javachallenge\mappers\EntityMapper.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.scopic.javachallenge.mappers.EntityMapper]: Constructor threw exception; nested exception is java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @66d1af89 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.scopic.javachallenge.mappers.EntityMapper]: Constructor threw exception; nested exception is java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @66d1af89 Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @66d1af89
涉及的EntityMapper代码
public class EntityMapper { private final MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); private final MapperFacade mapper = mapperFactory.getMapperFacade(); public EntityMapper() throws Exception { // public constructor } }
已尝试的方案
- 修改EntityMapper构造函数,声明
throws NullPointerException() - 手动在
mvn install命令后追加VM参数--add-opens java.base/java.lang=ALL-UNNAMED,未生效 - 在pom.xml中配置该参数后,
mvn install执行成功,但mvn spring-boot:run依旧报错
问题原因
- Bean实例化触发反射操作:EntityMapper被Spring上下文管理为Bean,加载ApplicationContext(测试或应用启动时)会自动实例化该类。实例化过程中初始化
mapperFactory和mapper时,底层Orika映射框架会通过反射调用Object.clone()方法。 - Java模块化权限限制:Java 9+的模块系统默认不向未命名模块(传统classpath下的代码)开放
java.lang包的反射访问权限,导致Orika的反射操作被拒绝,抛出InaccessibleObjectException。 - Maven插件参数不共享:
mvn install依赖maven-surefire-plugin(测试)或maven-compiler-plugin,而mvn spring-boot:run由spring-boot-maven-plugin负责执行,两者的VM参数配置独立,之前的pom.xml配置仅覆盖了前者,未配置后者。
解决方法
1. 配置Spring Boot Maven插件的VM参数
在pom.xml中给spring-boot-maven-plugin添加jvmArguments配置,确保mvn spring-boot:run启动时带上权限参数:
<build> <plugins> <!-- 其他插件配置 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>--add-opens java.base/java.lang=ALL-UNNAMED</jvmArguments> </configuration> </plugin> </plugins> </build>
2. IntelliJ运行配置全局添加参数
如果直接在IntelliJ中运行测试或启动应用,可在Run Configuration的VM options中添加:
--add-opens java.base/java.lang=ALL-UNNAMED
3. 升级Orika版本(可选)
检查项目依赖的Orika版本,若使用旧版本(如1.5.3及以下),升级到1.5.4及以上版本,新版本已适配Java 9+模块化系统,无需手动添加权限参数。
内容的提问来源于stack exchange,提问作者Ronit Danti
相关产品推荐
相关产品推荐

