Incredible: you cannot distinguish class X from its superclass

I had a very strange problem with Spring (3.0.1.RELEASE), TestNG (5.11) and Maven Surefire (2.5). I have a test class that extends the Spring helper class for testNG, so the test context can be loaded from an XML file (which contains some bean definitions). My project was imported into eclipse using m2eclipse (using Import Maven Project). The class works fine in Eclipse TestNG. However, this throws this exception with 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) 

I removed all the related dependencies in my pom so that the two classes com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl and javax.xml.parsers.DocumentBuilderFactory come only from JRE (rt.jar).

So it looks incredible to me.

I wonder if there is any mechanism in the loading class that can explain this behavior?

Thanks.

Updated: Here is my dependency tree:

 [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 

I am sure that I eliminated all possible banks, because when I use Open Type for Eclipse, it offers only 1 class for each of DocumentBuilderFactory and DocumentBuilderFactoryImpl

+4
source share
3 answers

I had a similar problem with DocumentBuilderFactoryImpl. I also suggested that the cause is a conflict in the classpath, but in fact it was the result of PowerMock creating the instrumental version of the class (and the presence of two incompatible versions of the class in the class loader). I was not lucky with @PowerMockIgnore, but ended up fixing the problem by moving any object using JAXP to non-static methods (like using @Before and not @BeforeClass to create an object).

+3
source

Most likely, you will encounter a class loader problem. Run the tests with -verbose:class to find out where the classes are loading from.

+1
source

I had the same problem with SAXParserFactoryImpl and 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 

I was able to fix the problem by ignoring the appropriate classes from Powermock as follows:

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

Source: https://habr.com/ru/post/1306552/


All Articles