周末嘗試重啟舊專案 (JSP + JavaBean + Servlet + SQL Server),環境配置看似無誤 (Tomcat、JDBC 驅動、JSP/Servlet/JavaBean 測試均通),卻在瀏覽器存取時噴出 This connection has not been established yet.。經排查發現:命令列執行能載入 JDBC 驅動,Eclipse/ Tomcat 卻找不到類別。本文記錄完整排查過程與核心真相。
msbase.jar, mssqlserver.jar, msutil.jar) 已加入系統 CLASSPATH 環境變數java BeanClass 執行正常,資料庫連線成功ClassNotFoundException: com.microsoft.jdbc.SQLServerDriverset classpath=... → startup.bat,錯誤依舊JDK/jre/lib/ext 成功!:系統神奇般恢復正常命令列模式:JVM 自動載入系統環境變數
CLASSPATH指定的路徑。
IDE/應用伺服器模式:忽略系統 CLASSPATH,使用自身定義的類別路徑 (Eclipse: 專案 Build Path;Tomcat:WEB-INF/lib、common/lib、shared/lib等)。
System.getProperties() 驗證差異| 屬性 | 命令列模式 | Eclipse/Tomcat 模式 |
|---|---|---|
java.class.path | 系統 CLASSPATH 內容 | IDE/伺服器自行構建的路徑 |
sun.boot.class.path | JDK jre/lib 核心庫 | 同 |
java.ext.dirs | jre/lib/ext 目錄 | 同 |
批次檔修改 CLASSPATH 僅影響 java.class.path,Tomcat 啟動時已讀取自身配置,**不會重讀環境變數**。
WEB-INF/lib/ → **隨專案部署、移植性最佳** ✅common/lib/ 或 shared/lib/ → 多應用共享jre/lib/ext/ → **全域生效、但污染 JRE、不利版本隔離** ⚠️java -cp 或 CLASSPATH 僅對獨立 Java 應用有效WEB-INF/classes、WEB-INF/lib/*.jar**WEB-INF/lib 方式,並納入版控或使用 Maven/Gradle 管理依賴