首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Maven 項目部署 JBoss 報「Failed to create a new SAX parser」:排查 xerces/xml-apis 依賴衝突並通過 dependencyExclusion 徹底解決

     編輯:Java 相關知識

Maven 打包 WAR 部署到 JBoss 時報 Failed to create a new SAX parser。網上常見方案是刪除項目 lib 下的 xerces-2.6.2.jar、xml-apis.jar,但 Maven 會根據 pom.xml 依賴傳遞再次打入 WAR。本文記錄通過 Maven Dependency Exclusion 從源頭切斷傳遞依賴,徹底解決的過程。

一、錯誤現象

Failed to create a new SAX parser
org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:...)
...
Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XML11Configuration cannot be cast to org.xml.sax.XMLReader

本質:WAR 內攜帶的 xercesImpl、xml-apis 與 JBoss 服務端自帶的 XML 解析器版本衝突,導致類加載器加載到錯誤實現類。

二、根因定位:DWR 傳遞依賴

  • 項目依賴 dwr,DWR 默認傳遞依賴 xerces:xercesImpl 和 xml-apis:xml-apis。
  • Maven 打包時將這兩個 JAR 放入 WEB-INF/lib。
  • JBoss (基於 Tomcat) 自帶 XML 解析器,雙親委派機制下應優先使用服務端類,但 WebApp ClassLoader 隔離導致優先加載 WAR 內舊版本,引發 ClassCastException。

三、解決方案:Maven 排除傳遞依賴

操作步驟 (MyEclipse / Eclipse + m2eclipse)

  1. 打開 pom.xml,切換到 Dependency Hierarchy 選項卡。
  2. 在過濾框輸入 xercesImpl 和 xml-apis 定位到具體節點。
  3. 右鍵該依賴節點 → Exclude Maven Artifact。

生成的 POM 片段

<dependency>
    <groupId>org.directwebremoting</groupId>
    <artifactId>dwr</artifactId>
    <version>2.0.x</version>
    <exclusions>
        <exclusion>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
        </exclusion>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

原理

<exclusions> 告訴 Maven:「解析 dwr 依賴樹時,不要傳遞 這兩個 artifact」。打包後 WAR 的 WEB-INF/lib 不再包含它們,運行時使用 JBoss 內置解析器,衝突消失。

四、驗證與通用排查技巧

  1. mvn clean package 重新打包。
  2. 解壓 WAR,確認 WEB-INF/lib 無 xercesImpl*、xml-apis*。
  3. 部署 JBoss,觀察啟動日志無 SAX parser 錯誤,應用正常訪問。

通用排查命令

# 1. 查看完整依賴樹,定位傳遞路徑
mvn dependency:tree -Dverbose | grep -E "xerces|xml-apis"

# 2. 分析衝突
mvn dependency:tree -Dincludes=xerces:xercesImpl,xml-apis:xml-apis

五、延伸:其他常見「雙親委派逆轉」衝突場景

衝突庫典型症狀解決思路
slf4j / log4j / logback 多版本ClassCastException、日志不輸出、多重綁定警告排除傳遞,統一版本,或用 jboss-deployment-structure.xml 控制模塊隔離
Jackson / Gson 不同版本序列化異常、字段丟失依賴管理統一版本,排除舊傳遞
Spring 核心包版本不一致NoSuchMethodError、BeanCreationExceptionBOM 統一版本 (spring-framework-bom)

六、總結

Failed to create a new SAX parser 核心是 WAR 內攜帶舊版 XML 解析器 JAR 與容器衝突。利用 Maven <exclusions> 從依賴樹源頭切斷傳遞,比手動刪 JAR 徹底、可維護。養成 mvn dependency:tree 定位傳遞路徑、<dependencyManagement> 統一版本的習慣,是避免 Jar 地獄的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved