添加MySQL驱动JAR后仍出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver错误
我来帮你搞定这个头疼的java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题,在Eclipse开发Web项目时这种情况挺常见的,咱们一步步排查:
1. 确认驱动JAR的正确位置
Web项目里,MySQL驱动JAR必须放在WEB-INF/lib目录下,而不是项目根目录随便建的lib文件夹。另外还要确保这个JAR被包含到部署组件里:
- 右键你的项目 → 选择「Properties」→ 找到「Deployment Assembly」
- 检查列表里有没有
WEB-INF/lib下的MySQL驱动JAR,如果没有,点击「Add」→ 选择「Java Build Path Entries」→ 选中你的MySQL驱动JAR添加进去
2. 核对驱动类名与驱动版本匹配
这个是很多人踩坑的点:
- 如果你用的是MySQL 5.x版本的驱动,类名是
com.mysql.jdbc.Driver,没问题 - 但如果是MySQL 8.0及以上版本的驱动,旧的类名已经被废弃,必须用
com.mysql.cj.jdbc.Driver,同时JDBC URL还要加上时区参数,比如:String url = "jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC";
你可以看一下你下载的驱动JAR文件名,比如mysql-connector-java-8.0.30.jar就是8.x版本,得换类名。
3. 检查Eclipse的Build Path配置
有时候你把JAR放到WEB-INF/lib后,Eclipse没自动把它加入Build Path,这时候编译没问题但运行时会找不到类:
- 右键WEB-INF/lib下的MySQL驱动JAR → 选择「Build Path」→ 「Add to Build Path」
4. 清理项目并重启Tomcat
Eclipse的缓存偶尔会搞事情,试试:
- 点击菜单栏「Project」→ 「Clean」,选中你的项目清理
- 然后重启Tomcat服务器,重新部署项目
你遇到的错误日志:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1928) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1771) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at Registration.doGet(Registration.java:32) at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1139) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)
内容的提问来源于stack exchange,提问作者RaviChandra

