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

WildFly/JBoss部署API时出现Xerces类找不到问题求助

Xerces DocumentBuilderFactoryImpl 类找不到问题(WildFly/JBoss 部署)

在WildFly 17.0.1(基于JBoss Module 1.9.1)部署API时,调用某接口执行XML解析代码时抛出ClassNotFoundException,找不到org.apache.xerces.jaxp.DocumentBuilderFactoryImpl。

异常代码

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
// 异常发生在这一行
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance("org.apache.xerces.jaxp.DocumentBuilderFactoryImpl", ClassLoader.getSystemClassLoader());
dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

错误日志

ERROR [stderr] JAXP: find factoryId =javax.xml.transform.TransformerFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
ERROR [stderr] JAXP: found system property, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
ERROR [stderr] JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null
ERROR [stderr] JAXP: find factoryId =javax.xml.transform.TransformerFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.transform.TransformerFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.stream.XMLOutputFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
ERROR [stderr] JAXP: found system property, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
ERROR [stderr] JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null
ERROR [stderr] JAXP: find factoryId =javax.xml.transform.TransformerFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.parsers.SAXParserFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.parsers.SAXParserFactory
ERROR [stderr] JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
ERROR [stderr] JAXP: found system property, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
ERROR [stderr] JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null
ERROR [stderr] JAXP: find factoryId =javax.xml.transform.TransformerFactory
ERROR [stderr] JAXP: Looking up system property 'javax.xml.xpath.XPathFactory:http://java.sun.com/jaxp/xpath/dom'
ERROR [stderr] JAXP: The property is undefined.
ERROR [stderr] JAXP: found null in $java.home/conf/jaxp.properties
ERROR [stderr] JAXP: factory 'org.apache.xpath.jaxp.XPathFactoryImpl' was found for http://java.sun.com/jaxp/xpath/dom
ERROR [stderr] JAXP: find factoryId =javax.xml.parsers.DocumentBuilderFactory
ERROR [stderr] JAXP: found system property, value=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
ERROR [stderr] JAXP: created new instance of class org.apache.xerces.jaxp.DocumentBuilderFactoryImpl using ClassLoader: null
ERROR [stderr] (Exception Multicaster Thread15) com.blazesoft.server.base.NdServiceSessionException: Service session Id number 1.
ERROR [stderr] (Exception Multicaster Thread15) java.lang.ClassNotFoundException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
                SEVERE [com.sun.xml.ws.server.sei.EndpointMethodHandler] (default task-1) com.blazesoft.server.base.NdServiceSessionException: Service session Id number 1.
                Class 'org.apache.xerces.jaxp.DocumentBuilderFactoryImpl' could not be found. Please verify it is on the classpath. while evaluating "XYZ" in function ABC
                        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                        ...

已做操作

  • 已通过Ant构建脚本build.xml添加相关依赖,生成的部署包WEB-INF/lib包含以下JAR:
<fileset id="required-jars" dir="${product.lib}">
    <include name="xerces.jar"/>
    <include name="resolver.jar"/>
    <include name="serializer.jar"/>
    <include name="xalan.jar"/>
    <include name="xercesImpl.jar"/>
    <include name="xml-apis.jar"/>
</fileset>

版本信息

  • Xerces 2.6.1
  • JBoss Module 1.9.1
  • WildFly 17.0.1

解决方案

1. 替换ClassLoader调用

代码中使用的ClassLoader.getSystemClassLoader()无法访问WildFly应用WEB-INF/lib中的JAR(系统类加载器和应用类加载器隔离),改为使用当前线程上下文类加载器:

// 替换原newInstance调用
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(
    "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl", 
    Thread.currentThread().getContextClassLoader()
);

2. 排除WildFly自带的XML解析模块

WildFly自带XML解析相关模块,会和打包的Xerces版本冲突。在WEB-INF/jboss-deployment-structure.xml中添加排除配置:

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="javax.xml.api"/>
            <module name="org.apache.xerces"/>
            <module name="org.apache.xalan"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

3. 移除重复的Xerces JAR

Xerces 2.x开始,xerces.jar是旧聚合包,核心实现为xercesImpl.jar。保留xercesImpl.jar和xml-apis.jar,移除xerces.jar避免类加载冲突。

4. 自定义模块依赖(可选)

如果上述方法无效,可在WildFly中创建自定义Xerces模块,在jboss-deployment-structure.xml中显式依赖:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="com.custom.xerces" export="true"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

需在WildFly的modules目录下创建对应模块目录,放入Xerces JAR并编写module.xml配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:09:09