ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration 不能转换为 org.apache.xerc

Posted

技术标签:

【中文标题】ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration 不能转换为 org.apache.xerces.xni.parser.XMLParserConfiguration【英文标题】:ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration 【发布时间】:2014-09-08 10:22:24 【问题描述】:

我正在 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 发布的最新版本。将这些罐子放在我的类路径上似乎并不能解决问题;我以前能够依赖 gwt-dev 中的版本。

我对此相当束手无策,并且大大超出了我的舒适区。

【问题讨论】:

尝试从您的项目中删除 GWT,然后将其添加回来。另外,请确保您的 WEB-INF/lib 文件夹中没有重复的 jars(旧的和新的)。 【参考方案1】:

类路径上 jar 的顺序很重要。您是否尝试在类路径的开头添加 Xerces 2.11 jar 以便首先加载它?

【讨论】:

【参考方案2】:

不要与 Maven 争吵:如果不一起使用,它们应该放在单独的 Maven 模块中。在您的情况下,JDom(可能)在服务器端使用,不需要 gwt-dev。所以解决方案是将您的项目拆分为几个 Maven 模块:一个用于依赖 GWT 的客户端,另一个用于不依赖 GWT 的服务器端(或者如果您使用 GWT-RPC,可能在 gwt-servlet 上,或者如果您使用 RequestFactory,则在 requestfactory-server 上)。

也就是说,即使只有一个项目,如果您在运行时的类路径中确实有 gwt-dev,那么您的 POM 中就有问题。

...除非您在构建时读取 XML 文件?

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

在我的情况下,通过删除我的本地 sbt 缓存(如果您使用 maven,则为本地 maven 存储库)中的 xerces 目录并重建项目来解决此问题。

【讨论】:

【参考方案5】:

当我将项目从 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 包 com.sun.org.apache.xerces.internal.jaxp 的实现,但是在升级到 GWT2.8 后,我的应用程序选择了来自 gwt-dev.jar 的 xerces。 我根据 Javadoc 和 link here 找到了解决方法 到使用的系统属性

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

【讨论】:

谢谢,遇到了完全相同的问题,并且您提出的修复工作正常。 您在 Eclipse 中究竟在哪里添加这些行,以便它以该属性开头?我尝试将它们添加到我的运行配置 GWT Dev Mode Arguments 中,但它们无法识别这些行。【参考方案6】:

这有点晚了,但是在阅读完答案后,我确实找到了解决此问题的一种方法。您可以使用newInstance 中的参数来专门选择,而不是使用普通的DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 构建文档工厂。这样您就不必像上面的 Svarog 的回答那样添加 JVM 参数,也不必添加或删除库。我的解决方案如下:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance("com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl", this.getClass().getClassLoader());
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new FileInputStream("path/to/file.xml"));

【讨论】:

【参考方案7】:

导致问题的 WebLogic 12c 的默认 JAXB 实现,您需要在 weblogic 服务器启动时覆盖 jaxb。在 echo CLASSPATH=%CLASSPATH%

之前将以下类路径添加到 startWebLogic.cmd

SET CLASSPATH=C:\Oracle\Middleware\Oracle_Home\wlserver\modules\databinding.override.jar;%CLASSPATH%

添加了两个 JARS 以支持 weblogic 12c。

    jaxb-core.jar jaxb-impl.jar

【讨论】:

以上是关于ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration 不能转换为 org.apache.xerc的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:java.lang.ClassCastException

应用 PathProperties 后的 ClassCastException

MIUI 11/12 主题切换导致 LifeCycleException、ClassCastException

ClassCastException 发生在 onRestoreInstanceState

Java HashMap导致ClassCastException

用 Java Lambda 编写的 Spark UDF 引发 ClassCastException