Eclipse中Spring AOP配置运行异常,同代码可在STS正常运行问题求助
问题根因
你遇到的异常和AOP配置无关,是JDK版本与Spring版本不兼容导致的:
- 你使用的Spring 3.2版本内置的旧版CGLIB依赖JDK的反射能力实现动态代理
- JDK 9及以上版本引入了模块化系统(JPMS),默认禁止了CGLIB需要的
ClassLoader.defineClass方法反射访问权限 - STS默认自带JDK 8,所以可以正常运行;Eclipse中你配置的运行JDK为9及以上版本,所以触发权限报错
解决方案
方案1:降级JDK到1.8(最稳妥,无需修改代码和依赖)
Spring 3.2官方支持的最高JDK版本为JDK 8,按如下步骤修改Eclipse配置即可:
- 右键项目 ->
Build Path->Configure Build Path->Libraries标签页,将JRE System Library替换为JavaSE-1.8 - 打开主类的
Run Configurations->JRE标签页,选择JDK 1.8作为运行环境
方案2:升级Spring版本到5.3+(保留高版本JDK)
高版本Spring内置的CGLIB已经适配了JDK 9+的模块化机制,只需将项目依赖的Spring全组件版本升级到5.3及以上稳定版,同时将beans.xml中3.2版本的xsd地址替换为对应高版本即可。
方案3:添加JVM启动参数(临时兼容,无需修改版本)
如果不想调整JDK和Spring版本,可在Eclipse的运行配置中添加模块开放参数:
- 打开主类的
Run Configurations->Arguments标签页 - 在
VM arguments输入框中添加如下参数:
--add-opens java.base/java.lang=ALL-UNNAMED
内容的提问来源于stack exchange,提问作者Obydul Islam
相关产品推荐
相关产品推荐

