J2EE 應用在 WebSphere 等容器中運行時,類加載錯誤(如 ClassNotFoundException)是開發者常見痛點。本文系統梳理 J2EE 模塊結構、WebSphere 類加載器層級關係、隔離模式,並給出模塊依賴管理、JAR 包放置、鬆散類與 JAR 選型的落地最佳實踐,助你從根源消除類加載疑難雜症。
WEB-INF/classes(鬆散類,支持熱重載)與 WEB-INF/lib(JAR 包)。lib),避免全局類路徑污染。簡化層級(自上而下):
CLASSPATH)ws.ext.dirs,載入 J2EE/容器類)關鍵規則:請求優先委派父加載器,父找不到再由子加載。請求只能向上,不能向下。若 WebSphere 類加載器需查找模塊類,會拋出 ClassNotFoundException。

| 模式 | 說明 | 建議 |
|---|---|---|
| Server | 全服務器單一類加載器 | 測試用,生產不推薦 |
| Application | 每個 EAR 一個類加載器 | 常用,EAR 內模塊可見 |
| Module | 每個模塊(WAR/EJB JAR)一個類加載器 | 最嚴格隔離,生產首選 |
| Compatibility | 兼容 WAS 3.x 行為,跨 EAR 可見 | 僅遷移舊應用時使用 |
鐵律:不要依賴隔離模式。應用必須在 Module 模式下也能正常運行,通過 MANIFEST.MF Class-Path 顯式聲明依賴。
MANIFEST.MF + Application DeveloperMANIFEST.MF 的 Class-Path 屬性中引用所需 JAR 或模塊。MANIFEST.MF 與 Build Path。
WEB-INF/liblib + Edit Module Dependenciesws.ext.dirs(需訪問 J2EE 類)或 CLASSPATH(否則),但強烈不建議,會導致版本衝突、部署耦合、測試環境失真。WEB-INF/classes 或 ejbModule),支持熱重載/重啟項目即時生效。編譯靠 Java Build Path;運行靠容器類加載器鏈與 MANIFEST.MF。編譯通過不代表運行無誤,理解兩者差異是排查 ClassNotFoundException 的關鍵。