You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSF项目迁移Tomcat9+OpenJDK14遇Xerces与OmniFaces冲突报错

排查方向与解决方案

这种java.lang.AbstractMethodError在Java版本/容器升级时非常常见,本质是XML解析API的定义和实现版本不兼容——JDK 14里的javax.xml.parsers.DocumentBuilderFactory已经更新了抽象方法,但你项目里的org.apache.xerces.jaxp.DocumentBuilderFactoryImpl还是旧版本,没实现这些新方法,导致启动报错。结合你的迁移场景(Java8+Tomcat7 → Tomcat9+OpenJDK14),给你几个具体的排查方向:

  • 先清理项目中显式引入的Xerces依赖
    Tomcat 9本身已经内置了兼容JDK14的XML解析组件,而且从JDK 1.8开始,JDK自带了JAXP的默认实现(com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl)。如果你的POM里手动加了xerces或xercesImpl依赖,大概率会和Tomcat/JDK自带的版本冲突。直接删掉这些依赖,让容器或JDK接管XML解析,很多时候就能解决问题。

  • 排查依赖传递带来的旧版Xerces
    你用的OpenWebBeans、OmniFaces、PrimeFaces这些组件,可能会间接引入旧版Xerces。用Maven命令mvn dependency:tree生成依赖树,搜索xerces或xercesImpl,找到是哪个依赖带进来的,然后在POM里给对应的依赖添加排除规则。比如:

    <dependency>
        <groupId>org.apache.openwebbeans</groupId>
        <artifactId>openwebbeans-impl</artifactId>
        <version>你的版本</version>
        <exclusions>
            <exclusion>
                <groupId>xerces</groupId>
                <artifactId>xercesImpl</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    同时要确保你用的OpenWebBeans、PrimeFaces版本本身兼容Tomcat9和JDK14——比如OpenWebBeans至少要2.0.x以上,PrimeFaces要8.x或更高版本,否则即使排除了Xerces,可能还会有其他兼容性问题。

  • 检查硬编码的XML工厂类配置
    有些项目会通过系统属性或配置文件指定XML解析工厂类,比如启动参数里加了-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl,或者在web.xml、初始化代码里硬编码了这个类名。JDK14的JAXP API新增了抽象方法,旧版Xerces实现不了,就会抛出这个错误。
    找到这类配置,要么删除它(让JDK自动选择兼容的实现),要么替换成JDK自带的实现类com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl。

  • 清理冲突的XML API依赖
    如果你的POM里显式引入了jaxp-api、xml-apis这类依赖,也会和JDK14自带的API版本冲突。JDK已经包含了这些API的最新版本,不需要手动引入;如果必须保留,要把<scope>设为provided,让JDK提供的版本优先加载。

核心思路就是尽量避免项目自带XML解析相关的实现类,优先使用Tomcat或JDK提供的兼容版本,减少版本冲突的可能性。

内容的提问来源于stack exchange,提问作者Luqqu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:18:12