【问题标题】:javax.xml.parsers.SAXParserFactory ClassCastExceptionjavax.xml.parsers.SAXParserFactory ClassCastException
【发布时间】:2012-01-01 00:55:43
【问题描述】:

通过 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 test 时,错误没有出现。但是一旦我再次运行 mvn test (没有清理,就会发生异常)(当我从 IntelliJ 运行它时)。

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

【问题讨论】:

  • 你能指定你正在使用哪些 jars,以便我知道哪个会产生冲突吗?
  • 我将maven pom.xml上传到heypasteit.com/clip/039L
  • 查看你的依赖可能是间接依赖。

标签: java xml saxparser


【解决方案1】:

您的 JDK 可能有自己的 SAXParserFactoryImpl。

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

您的服务器中的一个可能会被使用。

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

【讨论】:

    【解决方案2】:

    我发现了问题。它与试图加载 SAXParserFactory 的 PowerMockito 有关。我还没有想出一个的原因是因为堆栈跟踪只包含两次 PowerMockito,而这个在中间:-)

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

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

    这解决了我的问题。

    【讨论】:

    • 对于未来的读者:如果由于日志记录而发生这种情况,那么(推荐)使用@MockPolicy(Slf4jMockPolicy.class)@MockPolicy(Log4jMockPolicy.class),或者使用@PowerMockIgnore("org.apache.log4j.*")@PowerMockIgnore("org.apache.commons.logging.*") 排除日志记录框架可能会有所帮助。见the PowerMock FAQ
    • 这个答案对我不起作用,实际上它使问题变得更糟,添加此注释后,我的测试失败并出现不连贯的错误com.sun.org.apache.xerces.internal.impl.dv.DVFactoryException: DTD factory class com.sun.org.apache.xerces.internal.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory.
    • 我应该知道的。 PowerMock 毁了一切。
    【解决方案3】:

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

    但是,在玩弄之后,我发现了一个确定性地工作的解决方案,不像接受的答案不适用于所有情况。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2020-08-16
      • 2013-02-10
      • 2021-12-05
      • 2012-02-08
      相关资源
      最近更新 更多