首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP 連接 MySQL 報 ClassNotFoundException:JDBC 驅動包部署位置詳解

     編輯:程式設計綜合問答

錯誤現象

Java 類測試連接正常,但放入 JSP 頁面運行時報:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

核心原因:Web 應用類加載器隔離

  • Java 類運行:使用項目 Build Path 中的庫,類加載器為系統/應用類加載器,可見項目所有依賴。
  • JSP 編譯為 Servlet 運行:由 Web 容器(Tomcat)的 WebAppClassLoader 加載,**只能見 WEB-INF/lib 和 WEB-INF/classes 下的類/ jar**。

若 JDBC 驅動 jar 僅在 Build Path / 項目 lib 目錄 / Maven 本地倉庫,**未打包進 WAR 的 WEB-INF/lib**,JSP 就會找不到驅動類。

解決方案:確保驅動包在 WEB-INF/lib

Maven 專案(推薦)

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version> <!-- 或 5.1.49 等 -->
    <scope>compile</scope> <!-- 默認即 compile,會打包進 WEB-INF/lib -->
</dependency>

執行 mvn clean package,檢查生成的 WAR 中 WEB-INF/lib/mysql-connector-java-*.jar 存在。

非 Maven 專案(Eclipse/MyEclipse)

  1. 右鍵專案 → Properties → Deployment Assembly。
  2. 點擊 Add... → Java Build Path Entries → 選中 MySQL 驅動 jar → Finish。
  3. 或直接將 jar 複製到 WebContent/WEB-INF/lib(或 src/main/webapp/WEB-INF/lib)目錄下,刷新專案。

Tomcat 共享庫(不推薦用於應用級驅動)

將 jar 放入 $CATALINA_HOME/lib 可讓所有應用共享,但會導致版本鎖定、升級困難,**生產環境強烈建議每個應用自帶驅動包(放 WEB-INF/lib)**。

驗證步驟

  1. 部署應用後,打開 Tomcat 管理頁或解壓 WAR,確認 WEB-INF/lib 含驅動 jar。
  2. JSP 中添加測試代碼:Class.forName("com.mysql.cj.jdbc.Driver")(MySQL 8.0+ 驅動類名變更)。
  3. 重新發布並測試。

常見坑點

  • 驅動類名錯誤:MySQL 8.0+ 為 com.mysql.cj.jdbc.Driver,舊版為 com.mysql.jdbc.Driver,請根據 jar 版本選擇。
  • 多版本驅動共存:WEB-INF/lib 下同時有 5.x 和 8.x jar,類加載器可能載入舊版導致兼容性問題。
  • Scope 設置為 provided:Maven <scope>provided</scope> 不會打包進 WAR,JSP 會找不到類。

圖片參考

部署結構示意

總結

JSP 運行在 Web 容器類加載器下,**JDBC 驅動包必須位於 WEB-INF/lib**。Maven 專案確保 compile scope;非 Maven 專案配置 Deployment Assembly 或手動複製 jar。這是 Web 應用類加載隔離機制決定的,而非代碼邏輯問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved