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
相关产品推荐
相关产品推荐

