javax.xml.parsers.SAXParserFactory ClassCastException

时间:2011-11-18 08:02:58

标签: java xml saxparser

通过maven(mvn test)运行测试时,我的本地计算机出现以下异常。

ch.qos.logback.core.joran.event.SaxEventRecorder@195ed659 - Parser configuration error occured 
java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory

在谷歌搜索后,我遇到了几个页面,描述了它背后的主要问题(在不同的类加载器中有几个SAXParserFactoryImpl)。

- > http://www.xinotes.org/notes/note/702/

我的问题是,如何确定哪个库也提供了SAXParserFactoryImpl,以便我可以将其排除。我正在使用Maven,IntelliJ和JDK 1.6.0_23。问题出现在命令行以及从IntelliJ运行测试时。

但奇怪的是,在构建服务器上,这个问题不会发生。

更新1

当我在mvn clean之后第一次运行mvn测试时,我发现错误没有出现。但是一旦我再次运行mvn test(没有干净,就会发生异常)(当我从IntelliJ运行它时)。

当我在cmd行上运行它时,几个mvn测试调用就可以了。

3 个答案:

答案 0 :(得分:41)

我发现了这个问题。它与试图加载SAXParserFactory的PowerMockito有关。我之所以没有想到这一点是因为堆栈跟踪仅包含两次PowerMockito,而中间是: - )

因此,如果您在IntelliJ中找出此问题并且确实使用了PowerMockito,请使用以下注释注释您的测试类:

@PowerMockIgnore(["javax.management.*", "javax.xml.parsers.*",
         "com.sun.org.apache.xerces.internal.jaxp.*", "ch.qos.logback.*", "org.slf4j.*"])

这解决了我的问题。

答案 1 :(得分:1)

您的JDK可能有自己的SAXParserFactoryImpl。

检查xercesImpl,xml / xml-api和sax等罐子。

可能会使用服务器中的一台服务器。

您可以使用jarfinder:http://www.jarfinder.com/index.php/java/search/~SAXParserFactoryImpl~

答案 2 :(得分:0)

我今天遇到了同样的错误。经过大量的挖掘,我发现此处或其他地方的解决方案没有帮助。

但是,在玩耍之后,我发现了一种确定性的解决方案,与并非所有情况都适用的公认答案不同。

答案是,浏览堆栈跟踪以查找任何ClassCast异常,然后将它们添加到\ @PowerMockIgnore列表中。不断重复直到问题解决。对我来说就像魔术一样。