【问题标题】:Unbelievable: Cannot cast from class X to its super class难以置信:不能从 X 类转换到它的超类
【发布时间】:2011-02-06 20:56:36
【问题描述】:

我在使用 Spring (3.0.1.RELEASE)、TestNG (5.11) 和 Maven Surefire (2.5) 时遇到了一个非常奇怪的问题。 我有一个测试类,它扩展了 testNG 的 Spring 助手类,以便可以从 xml 文件(包含一些 bean 定义)加载测试上下文。 我的项目是使用 m2eclipse(使用 Import Maven Project)导入到 eclipse 中的。 该类在 Eclipse TestNG 运行器中运行良好。 但是,它会在 Maven Surefire 中引发此异常:

Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory
 at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:123)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:89)
 at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:70)
 at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)

我已经消除了我的 pom 中所有涉及的依赖项,以便这两个类 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpljavax.xml.parsers.DocumentBuilderFactory 仅来自 JRE(rt.jar)。

所以,我觉得这太不可思议了。

我想知道加载类中是否有任何机制可以解释这种行为?

谢谢。

更新:这是我的依赖树:

[INFO] org.seamoo:seamoo-webapp:war:1.0-SNAPSHOT
[INFO] +- com.google.appengine:appengine-api-1.0-sdk:jar:1.3.1:compile
[INFO] +- com.google.gwt:gwt-servlet:jar:2.0.3:compile
[INFO] +- com.google.gwt:gwt-user:jar:2.0.3:provided
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_2.5_spec:jar:1.2:provided
[INFO] +- org.slf4j:slf4j-api:jar:1.5.6:compile
[INFO] +- ch.qos.logback:logback-classic:jar:0.9.15:compile
[INFO] |  \- ch.qos.logback:logback-core:jar:0.9.15:compile
[INFO] +- org.springframework:spring-webmvc:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-asm:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:3.0.1.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-aop:jar:3.0.1.RELEASE:compile
[INFO] |  +- org.springframework:spring-core:jar:3.0.1.RELEASE:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] |  +- org.springframework:spring-expression:jar:3.0.1.RELEASE:compile
[INFO] |  \- org.springframework:spring-web:jar:3.0.1.RELEASE:compile
[INFO] |     \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-context-support:jar:3.0.1.RELEASE:compile
[INFO] +- org.apache.tiles:tiles-jsp:jar:2.1.4:compile
[INFO] |  \- org.apache.tiles:tiles-servlet:jar:2.1.4:compile
[INFO] +- org.apache.tiles:tiles-portlet:jar:2.1.4:compile
[INFO] |  \- org.apache.tiles:tiles-core:jar:2.1.4:compile
[INFO] |     +- org.apache.tiles:tiles-api:jar:2.1.4:compile
[INFO] |     +- commons-digester:commons-digester:jar:1.8.1:compile
[INFO] |     |  \- commons-beanutils:commons-beanutils:jar:1.8.0:compile
[INFO] |     \- commons-logging:commons-logging-api:jar:1.1:compile
[INFO] +- org.apache.tomcat:jasper-el:jar:6.0.26:compile
[INFO] |  \- org.apache.tomcat:el-api:jar:6.0.26:compile
[INFO] +- org.freemarker:freemarker:jar:2.3.16:compile
[INFO] +- org.tuckey:urlrewritefilter:jar:3.1.0:compile
[INFO] +- org.seamoo.utils:converter:jar:0.1:compile
[INFO] +- junit:junit:jar:4.6:test
[INFO] +- org.springframework:spring-test:jar:3.0.1.RELEASE:test
[INFO] +- org.testng:testng:jar:jdk15:5.11:test
[INFO] +- net.sourceforge.htmlunit:htmlunit:jar:2.7:test
[INFO] |  +- commons-collections:commons-collections:jar:3.2.1:test
[INFO] |  +- commons-lang:commons-lang:jar:2.4:test
[INFO] |  +- commons-httpclient:commons-httpclient:jar:3.1:test
[INFO] |  +- commons-codec:commons-codec:jar:1.4:test
[INFO] |  +- net.sourceforge.htmlunit:htmlunit-core-js:jar:2.7:test
[INFO] |  +- net.sourceforge.nekohtml:nekohtml:jar:1.9.14:test
[INFO] |  +- net.sourceforge.cssparser:cssparser:jar:0.9.5:test
[INFO] |  |  \- org.w3c.css:sac:jar:1.3:test
[INFO] |  \- commons-io:commons-io:jar:1.4:test
[INFO] +- org.jbehave:jbehave-core:jar:2.5:test
[INFO] |  +- junit:junit-dep:jar:4.4:test
[INFO] |  \- org.hamcrest:hamcrest-all:jar:1.1:test
[INFO] +- org.mockito:mockito-all:jar:1.8.4:test
[INFO] +- org.powermock.modules:powermock-module-testng:jar:1.3.7:test
[INFO] |  \- org.powermock:powermock-core:jar:1.3.7:test
[INFO] |     +- org.powermock.reflect:powermock-reflect:jar:1.3.7:test
[INFO] |     |  \- org.objenesis:objenesis:jar:1.2:test
[INFO] |     \- javassist:javassist:jar:3.10.0.GA:test
[INFO] +- org.powermock.api:powermock-api-mockito:jar:1.3.7:test
[INFO] |  \- org.powermock.api:powermock-api-support:jar:1.3.7:test
[INFO] +- org.workingonit:gwtbridge:jar:0.1:compile
[INFO] +- org.seleniumhq.selenium.client-drivers:selenium-java-testng-helper:jar:1.0.1:test
[INFO] |  \- org.seleniumhq.selenium.client-drivers:selenium-java-client-driver:jar:1.0.1:test
[INFO] +- com.dyuproject:dyuproject-util:jar:1.1-SNAPSHOT:compile
[INFO] +- com.dyuproject:dyuproject-openid:jar:1.1-SNAPSHOT:compile
[INFO] +- org.mortbay.jetty:jetty-util:jar:6.1.22:compile
[INFO] +- org.seamoo:seamoo-model:jar:1.0-SNAPSHOT:compile
[INFO] |  +- javax.jdo:jdo2-api:jar:2.3-eb:compile
[INFO] |  +- javax.transaction:jta:jar:1.1:compile
[INFO] |  \- com.google.appengine:geronimo-jpa_3.0_spec:jar:1.1.1:compile
[INFO] +- org.seamoo:seamoo-persistence:jar:1.0-SNAPSHOT:compile
[INFO] |  +- com.google.appengine.orm:datanucleus-appengine:jar:1.0.5.final:compile
[INFO] |  +- org.datanucleus:datanucleus-core:jar:1.1.5:compile
[INFO] |  \- com.google.appengine:datanucleus-jpa:jar:1.1.5:runtime
[INFO] +- org.seamoo:seamoo-theme:jar:1.0-SNAPSHOT:compile
[INFO] \- org.seamoo:seamoo-test-resources:jar:1.0-SNAPSHOT:test
[INFO]    +- com.google.appengine:appengine-api-labs:jar:1.3.1:test
[INFO]    +- com.google.appengine:appengine-api-stubs:jar:1.3.1:test
[INFO]    \- com.google.appengine:appengine-testing:jar:1.3.1:test

我可以确定我已经消除了所有可能的 jar,因为当我使用 Eclipse 的 Open Type 功能时,它建议 DocumentBuilderFactoryDocumentBuilderFactoryImpl 中的每一个都只有一个类

【问题讨论】:

  • 您说这两个类都来自 JRE,但是由于这个错误,看起来 DocumentBuilderFactory 确实来自其他地方。您可以转储类路径以确保没有您不知道的 jar 文件吗?
  • 我不知道如何转储类路径,但我将我的依赖关系树包含在问题中(想知道它是否有帮助?)。我使用 eclipse+m2eclipse 并通过在 Open Types 对话框中输入名称来确定一个类来自哪个 jar。
  • 哎哟!看起来 PowerMock(在 Mockito 上)不能很好地与 Spring Autowiring 配合使用。我正在将问题提交给 PowerMock。
  • 感谢您发现它是 PowerMock。遇到了同样的问题,但我可以在上面使用@PowerMockIgnore。

标签: spring testng maven-2 maven-surefire-plugin


【解决方案1】:

我在 DocumentBuilderFactoryImpl 上遇到了类似的问题。我最初还假设原因是类路径中的冲突,但它实际上是 PowerMock 创建类的检测版本(并且在类加载器中有两个不兼容的类版本)的结果。我在使用@PowerMockIgnore 时运气不佳,但最终通过将使用 JAXP 的任何对象移动到非静态方法中来解决了这个问题(例如,使用 @Before 而不是 @BeforeClass 来实例化对象)。

【讨论】:

  • +1 谢谢!这是我的问题:我有一些带有静态的继承模型,显然是通过 @Before 和 PowerMock 的黑魔法重新创建的。
【解决方案2】:

您很可能遇到了类加载器问题。使用-verbose:class 运行测试以查看从何处加载类。

【讨论】:

  • 这是我得到的:
    $mvn test -verbose:class
    Apache Maven 2.2.1 (r801777; 2009-08-07 02:16:01+0700)
    Java 版本:1.6.0_18
    Java 主页:/home/phuongnd08/app/jvm/jdk1.6.0_18/jre
    默认语言环境:en_US,平台编码:UTF-8
    操作系统名称:“linux” 版本:“2.6.31-20-generic” 架构:“amd64” 系列:“unix”
    看来我没找到你。请指教。
  • @Phuong : 也许MAVEN_OPTS='-verbose:class' mvn test 会起作用。
  • 我尝试了你的命令,它显示了几个类以及从哪个 jars 类加载。但是,令我惊讶的是,在抛出异常之前不会列出 DocumentBuilderFactory 和 DocumentBuilderFactoryImpl。请您在此处查看我上传的日志:docs.google.com/…
【解决方案3】:

SAXParserFactoryImpl 和 Powemock 也有同样的问题。

javax.xml.parsers.FactoryConfigurationError: Provider com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl could not be instantiated: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory

我可以通过忽略 Powermock 中的相应类来解决问题,如下所示:

@PowerMockIgnore({ "org.apache.xerces.*", "javax.xml.parsers.*", "org.xml.sax.*" })

【讨论】:

  • 我也不得不忽略一些 org.w3c.dom @PowerMockIgnore({"org.apache.log4j.*", "org.apache.xerces.*", "javax.xml.parsers.*", "org.w3c.dom.*", "org.xml.sax.*", "com.sun.org.apache.xerces.*"})
【解决方案4】:

Alternative

@PowerMockIgnore({ "org.apache.xerces.*", "javax.xml.parsers.*", "org.xml.sax.*" })

test/resources/org/powermock/extensions/ 中创建configuration.properties 文件,内容为:

powermock.global-ignore=org.apache.xerces.*,javax.xml.parsers.*,org.xml.sax.*

注意:属性值中逗号分隔,不能有空格,否则无效!
包列表取决于您的项目的依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 2014-01-07
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    相关资源
    最近更新 更多