ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration 无法转换为 org.apache.xerces.xni.parser.XMLParserConfiguration。

15

我正在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 jars 版本时,可能会出现错误。

gwt-dev-2.6.1.jar 包含 xerces packages,我猜测这个最新版本的 gwt-dev 已经捆绑了一个不兼容的版本。然而,当前版本的 jdom2.0.5 是与 Xerces 2.11 版本一起发布的,它似乎是由 Apache 最新发布的版本。将这些 jars 加入到我的类路径中似乎无法解决问题;我以前一直能够依赖于 gwt-dev 中的版本。

我对此非常苦恼,感觉自己已经超出了舒适区。


尝试从项目中删除GWT,然后再添加回来。同时,请确保您的WEB-INF/lib文件夹中没有重复的JAR(旧版和新版)。 - Andrei Volgin
7个回答

13

当我将项目从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();

升级至GWT2.8后,我的应用程序选择了gwt-dev.jar中的xerces,而不是之前使用的JDK包com.sun.org.apache.xerces.internal.jaxp中的实现。 根据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

谢谢,我也遇到了同样的问题,你提出的解决方案很好用。 - Massi
你应该在Eclipse的哪个位置添加这些代码,以便它能够启动这个属性呢?我尝试将它们添加到我的运行配置、GWT Dev Mode参数中,但它们并没有被识别。 - user1207381

3

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


2

虽然有点晚了,但在阅读答案后,我找到了一种解决这个问题的方法。而不是使用正常的DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();来构建文档工厂,你可以使用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"));

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

0

WebLogic 12c的默认JAXB实现会导致问题,您需要在WebLogic服务器启动时覆盖jaxb。在echo CLASSPATH=%CLASSPATH%之前,将以下classpath添加到startWebLogic.cmd中:

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

为了支持WebLogic 12c,添加了两个JAR文件。

  1. jaxb-core.jar
  2. jaxb-impl.jar

0
类路径上的JAR包顺序很重要。您是否尝试将Xerces 2.11 JAR包添加到类路径的开头,以便首先加载它?

0

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

话虽如此,即使有单个项目,如果在运行时类路径中确实包含gwt-dev,则说明POM出了问题。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接