JavaMail NoClassDefFoundError: LineInputStream 根因與一鍵修復
錯誤現象
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
根因分析
- 項目引入了獨立的
javax.mail-api + javax.mail (RI 實現) JAR。
- MyEclipse 內置
javaee.jar (Java EE 5 Library) **同樣包含** `com.sun.mail.util` 包。
- 類加載器優先加載
javaee.jar 中**舊版本/殘缺**的類,導致缺少 LineInputStream。
- **本質:同一包路徑下存在多個版本 JAR,類加載衝突。**
一鍵修復:從 javaee.jar 中移除 mail 包
- 定位文件:
MyEclipse安裝目录/Common/plugins/com.genuitec.eclipse.j2eedt.core_版本/data/libraryset/EE_5/javaee.jar
- 用壓縮軟件(WinRAR/7-Zip)打開
javaee.jar。
- 刪除其中的
javax/mail/ 和 com/sun/mail/ 目錄。
- 保存 JAR,重啟 MyEclipse。
圖解步驟




原理說明
- MyEclipse 運行時將
javaee.jar 放入系統類加載器路徑,優先級高於項目 Classpath。
- 移除內部 mail 包後,類加載器轉而加載項目提供的完整
javax.mail.jar。
- 此法治標不治本,**根治方案**:升級 MyEclipse / 避免使用內置 Java EE Library / 改用 Maven/Gradle 管理依賴並設定
provided 作用域。
通用避坑清單
| 衝突場景 | 典型錯誤 | 解決思路 |
| Servlet API 重複 | NoSuchMethodError: ServletContext.getContextPath | 排除容器自帶 servlet-api.jar,項目用 provided |
| JAXB 版本衝突 | ClassCastException: JAXBContextImpl | 統一版本,JDK 9+ 需額外引入 jaxb-api/impl |
| Logging 框架雙綁 | SLF4J: Class path contains multiple SLF4J bindings | 排除舊綁定,保留 logback-classic / log4j-slf4j-impl |
**核心原則:依賴管理交給構建工具,IDE 內置庫只作編譯參考,不參與運行。**
- 上一篇文章: Java 每日一題:clone 淺拷貝導致監護人對象共享 Bug 復現與修復
- 下一篇文章: Log4j 2.x 配置大全:從入門到高級多輸出、異步、郵件、數據庫、自定義 Appender
Copyright ©
程式碼之家 All Rights Reserved