通过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测试调用就可以了。
答案 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列表中。不断重复直到问题解决。对我来说就像魔术一样。