如何让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
相关产品推荐
相关产品推荐

