Grails WAR部署遇ClassNotFoundException: com.mysql.jdbc.Driver求助
解决WAR部署到Tomcat时MySQL驱动找不到的问题
我之前也碰到过几乎一模一样的问题,咱们一步步拆解排查,应该能快速解决:
核心问题根源
Spring Boot内嵌Tomcat运行时,会自动把所有依赖(包括MySQL驱动)打包到可执行JAR里,类加载器能顺利找到驱动类;但部署到外部Tomcat时,如果WAR包没把MySQL驱动打包到WEB-INF/lib目录,Tomcat的类加载器就找不到com.mysql.jdbc.Driver,直接抛出ClassNotFoundException。
具体解决方案
1. 先确认WAR包是否包含MySQL驱动
手动解压你的WAR包,检查WEB-INF/lib目录下有没有mysql-connector-java-5.1.46.jar:
- 如果没有,说明Gradle打包时漏了这个依赖,这是最常见的原因;
- 如果已经存在,再考虑Tomcat类加载冲突的问题(概率较低)。
2. 调整Gradle依赖与WAR打包配置
针对Gradle构建,确保MySQL驱动被正确打包到WAR中:
- 把依赖声明换成Gradle 4+推荐的
implementation或runtimeOnly(替代旧的compile/runtime):
dependencies { // 用implementation确保驱动被打包到WAR的WEB-INF/lib implementation 'mysql:mysql-connector-java:5.1.46' // 你的其他Spring Boot依赖... }
- 如果还是不行,在
build.gradle中添加WAR插件的强制打包配置:
war { enabled = true // 强制将runtimeClasspath下的所有依赖复制到WEB-INF/lib from configurations.runtimeClasspath into 'WEB-INF/lib' }
3. 快速验证驱动类名配置
虽然你说配置正确,但再核对下application.yml:
- 对于MySQL 5.x版本(比如你的5.1.46),
driverClassName: com.mysql.jdbc.Driver是完全正确的;只有MySQL 8.x才需要换成com.mysql.cj.jdbc.Driver,这一步可以快速排除配置错误。
4. 排查Tomcat类加载冲突(兜底方案)
如果WAR包已经包含驱动但还是报错,检查外部Tomcat的$CATALINA_HOME/lib目录:
- 如果里面有其他版本的MySQL驱动JAR,直接删除它,避免类加载优先级冲突;
- 也可以在Tomcat的
context.xml中配置数据源时指定类加载器,但这是最后一步才考虑的操作。
内容的提问来源于stack exchange,提问作者Raymond Holguin
相关产品推荐
相关产品推荐

