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

