You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:58:16