專案原在 Tomcat 6.0 運行良好,強制遷移至 Resin 3.0 後頻發 SAXNotRecognizedException,根因在於 Hibernate 帶入的舊版 XML 解析器(Xerces)與 Resin 內建解析器衝突。本文記錄排查全過程與精簡依賴的最佳實踐。
ERROR Digester:686 - Digester.getParser:
org.xml.sax.SAXNotRecognizedException: https://apache.org/XML/features/validation/dynamic
at com.caucho.xml.parsers.XmlSAXParserFactory.setFeature(XMLSAXParserFactory.java:94)
at org.apache.commons.digester.parser.XercesParser.configureXerces(XercesParser.java:185)
單獨部署 Struts/Spring/Hibernate 皆正常,唯有加入 Hibernate 即報錯,鎖定為 Hibernate 依賴傳遞的包衝突。
WEB-INF/lib 變化。xercesImpl.jar、xml-apis.jar 等舊版 XML 解析包,Resin 3.0 已內建現代解析器,雙方特性標識不兼容。xercesImpl.jar、xml-apis.jar、dom4j.jar(若 Resin 已提供)等。hibernate3.jar、antlr-2.7.5H3.jar(Hibernate 3 必需)。| 類別 | Jar 包 | 說明 |
|---|---|---|
| 必需 | hibernate3.jar | 核心運行時 |
| antlr-2.7.5H3.jar | HQL 解析器專用版本 | |
| 常見冗餘/衝突 | xercesImpl.jar | 舊版 XML 解析器,容器通常內建 |
| xml-apis.jar | XML API 介面,JDK 5+ 已包含 | |
| dom4j.jar | 配置解析依賴,容器或 Spring 可能已提供 | |
| commons-logging.jar | 若容器統一日誌門面可移除 | |
| cglib-*.jar | 增強庫,Hibernate 3 核心包常已內嵌 | |
| asm-*.jar | 位元碼操作,同上 |
遷移容器本質是運行時環境變更,依賴衝突在所難免。建立「精簡依賴、容器優先」的部署習慣,能將此類問題消滅在萌芽狀態。