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

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依旧报错

问题原因

  1. Bean实例化触发反射操作:EntityMapper被Spring上下文管理为Bean,加载ApplicationContext(测试或应用启动时)会自动实例化该类。实例化过程中初始化mapperFactory和mapper时,底层Orika映射框架会通过反射调用Object.clone()方法。
  2. Java模块化权限限制:Java 9+的模块系统默认不向未命名模块(传统classpath下的代码)开放java.lang包的反射访问权限,导致Orika的反射操作被拒绝,抛出InaccessibleObjectException。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:55:35