ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration can cast to org.apache.xerces.xni.parser.XMLParserConfiguration

2022-09-04 02:39:03

我正在 Eclipse 中开发一个 GWT 应用程序,并使用 jdom2 读取一些自定义 xml 属性文件。

在最近的更新之后,我的应用程序现在在尝试读取xml文件时失败并出现上述错误。相关的堆栈跟踪为:

org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration
org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
org.apache.xerces.parsers.SAXParser.<init>(Unknown Source)
org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.<init>(Unknown Source)
org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source)
org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source)
org.jdom2.input.sax.XMLReaders.createXMLReader(XMLReaders.java:165)
org.jdom2.input.SAXBuilder.createParser(SAXBuilder.java:871)
org.jdom2.input.SAXBuilder.buildEngine(SAXBuilder.java:854)
org.jdom2.input.SAXBuilder.getEngine(SAXBuilder.java:904)
org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1116)
uk.co.platosys.db.jdbc.DatabaseProperties.loadProperties(DatabaseProperties.java:78)

研究这个问题表明,当类路径上存在不兼容版本的xerces jar时,可能会出现错误。

gwt-dev-2.6.1.jar包含xerces软件包,我的直觉是这个最新版本的gwt-dev捆绑了一个不兼容的版本。然而,当前版本jdom2.0.5与Xerces的2.11版本一起发布,这似乎是Apache最新发布的。将这些jar放在我的类路径上似乎并不能解决问题;我以前能够依赖gwt-dev中的版本。

我对此相当机智,并且大大超出了我的舒适区。


答案 1

当我将我的项目从GWT 2.7升级到GWT 2.8时,我也有同样的例外。我不知道为什么我在GWT 2.7中没有这个问题(也许Eclipse项目的.classpath文件中的不同位置可能会影响它)。

该异常的原因是以前使用这样的代码,例如:

DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();
DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
baseLayoutXmlDocument = newDocumentBuilder.parse( baseLayoutSvgInputStream );

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

使用了JDK package com.sun.org.apache.xerces.internal.jaxp中的实现,但是在升级到GWT2.8之后,我的应用程序选择了gwt-dev.jar中的xerces。我根据Javadoc找到了修复程序,并链接到此处使用的系统属性

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

答案 2

在我的情况下,我通过向引导实体(运行配置中的类路径选项卡)添加两个条目/xml-apis/1.4.01/xml-apis-1.4.01.jar和/xerces/xercesImpl/2.11.0/xercesImpl-2.11.0.jar来自我本地的maven存储库来解决此问题。


推荐