錯誤現象
信息: validateJarFile(...\WEB-INF\lib\javaee_no_persistence.jar) - jar not loaded.
Offending class: javax/servlet/Servlet.class
Action: List userList = userService.getUserList(); 執行報:class file editor source not found
根因分析
- Servlet API 重複加載:Tomcat
lib/servlet-api.jar 已提供 javax.servlet.*,專案 WEB-INF/lib 下再放 javaee_no_persistence.jar (含 Servlet API) → 類加載器拒絕加載 Webapp 類加載器中的 Servlet 類,導致運行時找不到類定義/源碼。
- 缺少源碼附件:Eclipse 提示 "Class File Editor Source not found" 是因為調試時找不到對應 .java 源文件,非運行錯誤,但反映依賴管理混亂。
解決步驟
- 刪除衝突 Jar:從
WEB-INF/lib 移除 javaee_no_persistence.jar、servlet-api.jar、jsp-api.jar 等容器已提供的 API 包。
- Maven/Gradle 依賴範圍設為 provided:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope> <!-- 關鍵:編譯用,不打包 -->
</dependency>
- 清理並重新部署:
mvn clean package,刪除 Tomcat work/Catalina/localhost/<app>、wtpwebapps 緩存,重新啟動。
- 附加源碼 (可選):Eclipse 右鍵專案 → Properties → Java Build Path → Libraries → 展開 Servlet API Jar → Source Attachment → External File → 選擇
servlet-api-sources.jar。
驗證清單
- ✅
WEB-INF/lib 無 servlet-api*.jar, jsp-api*.jar, javaee*.jar。
- ✅
mvn dependency:tree 無 compile 範圍的 Servlet API 依賴。
- ✅ Tomcat 啟動日誌無
validateJarFile ... jar not loaded 警告。
- ✅ 斷點進入 Service/DAO 方法,變量面板正常顯示值。
延伸:其他常見「Class File Editor Source not found」原因
| 原因 | 現象 | 解決 |
| JDK 與項目編譯版本不匹配 |
斷點行號偏移、變量顯示錯誤 |
Project Facets / Compiler compliance 統一設置 |
| 類文件被多處編譯輸出 |
斷點不生效、提示多個源碼位置 |
清理 target/classes、.metadata/.plugins/org.eclipse.wst.server.core/tmp0 |
| 缺少 Lombok/MapStruct 生成代碼源碼 |
調試進入 .class 而非 .java |
安裝 Lombok 插件、啟用注解處理器 |