javax.xml.parsers.SAXParserFactory ClassCastException

当我通过maven运行测试时,我在本地机器上遇到以下exception(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(没有干净,就会发生exception)(当我从IntelliJ运行它时)。

当我在cmd行上运行它时,几个mvn测试调用确实有效。

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

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

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

这解决了我的问题。

您的JDK可能有自己的SAXParserFactoryImpl。

检查像xercesImpl,xml / xml-api和sax这样的jar子。

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

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

我今天遇到了同样的错误。 经过大量挖掘后,我发现这里的解决方案或其他地方的解决方案都没有用。

但是,在玩完之后,我找到了一个确定性的解决方案,不像接受的答案不适用于所有情况。

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