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

如何让Spring Boot项目适配JPMS模块化?

问题分析

异常核心原因:

  • Spring通过CGLIB生成的代理类(ModulesApplication$$EnhancerBySpringCGLIB$$...)无法访问org.springframework.cglib.core.ReflectUtils——该类处于未命名模块中,而你的modules模块未声明允许读取未命名模块。
  • 你的module-info.java缺少对spring.core模块的依赖,Spring的CGLIB功能直接依赖该模块。
解决方案

1. 修正module-info.java

添加spring.core模块依赖,确保Spring核心功能的模块化访问:

open module modules {
    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.beans;
    requires spring.context;
    // 新增Spring Core模块依赖,CGLIB功能依赖此模块
    requires spring.core;
}

2. 添加JVM启动参数

由于部分Spring依赖可能仍以未命名模块方式加载,需配置参数让modules模块读取未命名模块,并开放必要包的访问权限给Spring Core:

--add-reads modules=ALL-UNNAMED
--add-opens modules/com.example.modules=spring.core
--add-opens java.base/java.lang=spring.core
  • --add-reads modules=ALL-UNNAMED:允许modules模块读取所有未命名模块的内容
  • --add-opens ...:开放指定包的访问权限,确保Spring的CGLIB能生成合法代理类

3. 构建插件配置(可选但推荐)

如果使用Maven,在pom.xml的Spring Boot插件中配置上述JVM参数,确保打包后运行时自动生效:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.example.modules.ModulesApplication</mainClass>
                <jvmArguments>
                    --add-reads modules=ALL-UNNAMED
                    --add-opens modules/com.example.modules=spring.core
                    --add-opens java.base/java.lang=spring.core
                </jvmArguments>
            </configuration>
        </plugin>
    </plugins>
</build>

4. 验证运行

重新编译并启动应用,CGLIB代理类即可正常访问所需Spring类,异常将被解决。

内容的提问来源于stack exchange,提问作者Sandro J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:41:27