运行基于注解的简单Spring项目报错,无法加载配置类该如何解决?
问题根因
报错核心是你使用的低版本Spring框架依赖的旧版CGLIB动态代理工具,不兼容Java 9及以上版本的JPMS模块系统:旧版CGLIB需要反射调用JDK内部的ClassLoader.defineClass方法,高版本Java默认禁止了这类非法的跨模块反射访问,所以抛出权限异常。
修复方案
你可以根据自己的需求选择任意一种方案解决:
- 方案1(最推荐):升级Spring框架到适配高版本Java的版本
直接将Spring版本升级到5.x及以上的稳定版本,这类版本已经完成了Java 9+模块系统的适配,不需要额外修改配置就能正常运行。注意所有Spring相关依赖的版本需要保持一致,避免出现版本冲突问题。 - 方案2(临时兼容,无需修改依赖版本):添加JVM启动参数开放模块权限
如果你暂时不想升级Spring版本,可以在运行时给JVM添加开放模块访问的参数:- 在Eclipse中右键点击Driver类,选择
Run As->Run Configurations - 找到对应Driver类的启动配置项,切换到
Arguments选项卡 - 在
VM arguments输入框中添加如下参数:--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED - 在Eclipse中右键点击Driver类,选择
- 方案3:降级JDK版本到Java 8
Java 8没有引入JPMS模块系统,不存在跨模块反射访问的限制,可以完美适配老版本的Spring框架,直接将项目的JDK编译和运行版本切换为Java 8即可解决问题。
额外注意事项
你贴出的文件列表存在笔误,标注为HelloWorld.java的文件实际内容是Driver类的代码,请检查是否漏写了HelloWorld类,同时需要给HelloWorld类添加@Component("helloWorld")注解,否则Spring组件扫描无法识别这个类,解决上述模块问题后还会抛出找不到helloWorld Bean的异常。
内容的提问来源于stack exchange,提问作者Sudarshan
相关产品推荐
相关产品推荐

