Grails 2.4.3搭配MySQL 8.0.36运行时出现SpringLoadedPreProcessor异常求助
问题描述
我正在尝试运行Grails 2.4.3项目并搭配MySQL 8.0.36,已经更新了驱动类和MySQL连接器配置:
- 驱动类:
driverClassName = "com.mysql.cj.jdbc.Driver" - 依赖配置:
runtime 'mysql:mysql-connector-java:8.0.22'
但运行时遇到以下错误:
| Error 2024-02-19 14:37:19,993 [localhost-startStop-1] ERROR agent.SpringLoadedPreProcessor - Unexpected problem transforming call sites
Message: Unexpected problem processing bytes for class
Line | Method
->> 760 | defineClass in java.lang.ClassLoader| 142 | defineClass in java.security.SecureClassLoader
| 455 | defineClass in java.net.URLClassLoader
| 73 | access$100 in ''
| 367 | run . . . . in java.net.URLClassLoader$1
| 361 | run in ''
| 360 | findClass . in java.net.URLClassLoader
| 424 | loadClass in java.lang.ClassLoader
| 98 |. in com.mysql.cj.jdbc.NonRegisteringDriver
| 344 | forName in java.lang.Class
| 266 | run . . . . in java.util.concurrent.FutureTask
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
Caused by IllegalStateException: Entry: 52 18
我试过更换不同版本的SpringLoaded和MySQL连接器,但问题依然存在,有没有人遇到过类似的问题?
可能的解决方案
我之前帮朋友排查过老Grails版本适配新MySQL的类似问题,给你几个可行的方向试试:
指定兼容的SpringLoaded版本
Grails 2.4.3默认的SpringLoaded版本可能对MySQL 8的新驱动类兼容性不好,建议在BuildConfig.groovy里明确指定一个更稳定的版本,比如:build ':springloaded:1.2.8.RELEASE'这个版本对Java 8和新JDBC驱动的兼容性会好一些。
完善MySQL JDBC URL参数
MySQL 8要求必须指定时区,而且默认的认证方式(caching_sha2_password)和老版本Grails的兼容性差,建议把URL配置成这样:url = "jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&useLegacyDatetimeCode=false"其中
serverTimezone是必填项,allowPublicKeyRetrieval能解决新认证方式的连接问题,useLegacyDatetimeCode=false可以避免日期类型的兼容问题。调整MySQL连接器版本
太新的连接器版本可能和Grails 2.4.3的依赖冲突,建议换成8.0.28这个相对稳定的版本,同时排除Grails自带的旧MySQL驱动,避免依赖冲突:runtime('mysql:mysql-connector-java:8.0.28') { exclude group: 'org.grails.plugins', name: 'mysql' }确保Java版本兼容性
Grails 2.4.3最高只支持Java 8,不要用Java 9及以上版本,否则会出现各种类加载和字节码转换的异常,这很可能是你遇到的SpringLoaded错误的根源之一。清理项目缓存
老Grails项目的缓存很容易导致奇怪的问题,建议删除以下目录后重新构建:- 项目根目录下的
.grails和target文件夹 - 用户目录下的
~/.grails缓存文件夹
然后依次执行grails clean和grails run-app。
- 项目根目录下的
备注:内容来源于stack exchange,提问作者r.bx

