After upgrade, tests pass in Eclipse, fail in Maven, Spring throws BeanCreationException / NoClassDefFoundError $proxy10

StackOverflow https://stackoverflow.com/questions/23090350

Question

After doing a Spring / Hibernate upgrade to the latest versions, I hit problems running my tests under maven.

org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'protoEntityManager' defined in class path resource [test_config/ioc.xml]: 
    Invocation of init method failed; 
    nested exception is java.lang.NoClassDefFoundError: 
    Could not initialize class $Proxy10
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:610)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
at org.permacode.atomic.AtomicConfigurationBean.getEntityManagerFactory(AtomicConfigurationBean.java:191)
at org.permacode.atomic.ContextManager.getEntityManagerFactory(ContextManager.java:168)
at org.permacode.atomic.ContextManagerTest.test2InstantiateEntityManagerFactory(ContextManagerTest.java:77)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class $Proxy10
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:588)
at org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:119)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:111)
at org.springframework.aop.framework.AbstractSingletonProxyFactoryBean.afterPropertiesSet(AbstractSingletonProxyFactoryBean.java:174)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
... 45 more

This is my Spring context config:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  <bean class="org.permacode.atomic.web.AtomicStrutsWrapper"
    id="httpServletAccess" autowire="constructor"/>
  <bean class="org.permacode.atomic.web.DefaultExceptionHandler"
    id="exceptionHandler" autowire="constructor" />
  <bean class="org.permacode.atomic.web.ResourceBundleI18nEngine"
    id="i18nEngine">
    <constructor-arg>
      <bean class="org.permacode.atomic.web.StrutsResourceBundleProvider" />
    </constructor-arg>
  </bean>
  <bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory">
      <bean class="org.permacode.atomic.ContextManager"
        factory-method="getEntityManagerFactory" />
    </property>
  </bean>
  <bean id="protoDao" class="org.permacode.atomic.jpa.JpaProtoDao"></bean>
  <bean id="targetProxyProtoEM" class="org.permacode.atomic.domain.BasicProtoEntityManager">
    <constructor-arg ref="protoDao"/>
  </bean>
  <bean id="baseTransactionProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
      <props>
        <prop key="create*">PROPAGATION_REQUIRED</prop>
        <prop key="update*">PROPAGATION_REQUIRED</prop>
        <prop key="delete*">PROPAGATION_REQUIRED</prop>
        <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
      </props>
    </property>
  </bean>
  <bean id="protoEntityManager" parent="baseTransactionProxy">
    <property name="target" ref="targetProxyProtoEM" />
  </bean>
</beans>

Spring is trying to autowire the Spring beans in the context together but falls over while attempting to create either the transaction manager or the transaction proxy manager factory, it's not clear.

I'm using the following dependencies:

[INFO] The following files have been resolved:
[INFO]    antlr:antlr:jar:2.7.7:compile
[INFO]    aopalliance:aopalliance:jar:1.0:compile
[INFO]    cglib:cglib:jar:3.1:compile
[INFO]    cglib:cglib-nodep:jar:2.1_3:test
[INFO]    com.h2database:h2:jar:1.0.64:test
[INFO]    com.opensymphony:xwork:jar:2.1.2:compile
[INFO]    com.sun:tools:jar:1.5.0:system
[INFO]    commons-beanutils:commons-beanutils:jar:1.8.0:compile
[INFO]    commons-collections:commons-collections:jar:3.2:compile
[INFO]    commons-configuration:commons-configuration:jar:1.5:compile
[INFO]    commons-dbutils:commons-dbutils:jar:1.1:compile
[INFO]    commons-digester:commons-digester:jar:1.8:compile
[INFO]    commons-fileupload:commons-fileupload:jar:1.2.1:compile
[INFO]    commons-io:commons-io:jar:1.3.1:compile
[INFO]    commons-lang:commons-lang:jar:2.4:compile
[INFO]    commons-logging:commons-logging:jar:1.1.1:compile
[INFO]    commons-logging:commons-logging-api:jar:1.1:compile
[INFO]    commons-pool:commons-pool:jar:1.5.4:compile
[INFO]    dom4j:dom4j:jar:1.6.1:compile
[INFO]    hsqldb:hsqldb:jar:1.8.0.7:test
[INFO]    httpunit:httpunit:jar:1.6.2:test
[INFO]    javax.servlet:jstl:jar:1.1.2:compile
[INFO]    javax.servlet:servlet-api:jar:2.5:provided
[INFO]    javax.servlet.jsp:jsp-api:jar:2.1:provided
[INFO]    javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO]    jtidy:jtidy:jar:4aug2000r7-dev:test
[INFO]    junit:junit:jar:4.8.2:test
[INFO]    mysql:mysql-connector-java:jar:5.0.5:test
[INFO]    net.sourceforge.serp:serp:jar:1.14.1:compile
[INFO]    opensymphony:ognl:jar:2.6.11:compile
[INFO]    org.apache.derby:derby:jar:10.3.2.1:test
[INFO]    org.apache.geronimo.specs:geronimo-jms_1.1_spec:jar:1.1.1:compile
[INFO]    org.apache.geronimo.specs:geronimo-jpa_2.0_spec:jar:1.1:compile
[INFO]    org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1:compile
[INFO]    org.apache.openjpa:openjpa:jar:2.3.0:compile
[INFO]    org.apache.struts:struts2-core:jar:2.1.6:compile
[INFO]    org.apache.struts:struts2-tiles-plugin:jar:2.1.6:compile
[INFO]    org.apache.tiles:tiles-api:jar:2.0.6:compile
[INFO]    org.apache.tiles:tiles-core:jar:2.0.6:compile
[INFO]    org.apache.tiles:tiles-jsp:jar:2.0.6:runtime
[INFO]    org.apache.tomcat:annotations-api:jar:6.0.13:test
[INFO]    org.apache.tomcat:catalina:jar:6.0.13:test
[INFO]    org.apache.tomcat:el-api:jar:6.0.13:test
[INFO]    org.apache.tomcat:jasper:jar:6.0.13:test
[INFO]    org.apache.tomcat:jasper-el:jar:6.0.13:test
[INFO]    org.apache.tomcat:jasper-jdt:jar:6.0.13:test
[INFO]    org.apache.tomcat:jsp-api:jar:6.0.13:test
[INFO]    org.apache.tomcat:juli:jar:6.0.13:test
[INFO]    org.apache.tomcat:servlet-api:jar:6.0.13:test
[INFO]    org.apache.xbean:xbean-asm4-shaded:jar:3.14:compile
[INFO]    org.aspectj:aspectjrt:jar:1.7.4:compile
[INFO]    org.easymock:easymock:jar:2.3:test
[INFO]    org.easymock:easymockclassextension:jar:2.2.2:test
[INFO]    org.eclipse.persistence:javax.persistence:jar:2.0.0:compile
[INFO]    org.freemarker:freemarker:jar:2.3.13:compile
[INFO]    org.hibernate:hibernate-core:jar:4.2.11.Final:compile
[INFO]    org.hibernate:hibernate-entitymanager:jar:4.2.11.Final:compile
[INFO]    org.hibernate.common:hibernate-commons-annotations:jar:4.0.2.Final:compile
[INFO]    org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile
[INFO]    org.javassist:javassist:jar:3.18.1-GA:compile
[INFO]    org.jboss.logging:jboss-logging:jar:3.1.0.GA:compile
[INFO]    org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:jar:1.0.1.Final:compile
[INFO]    org.ow2.asm:asm:jar:4.2:compile
[INFO]    org.ow2.easybeans:easybeans-jpa-eclipselink:pom:1.2.1:compile
[INFO]    org.permacode:permacode:jar:1.0.0:compile
[INFO]    org.slf4j:jcl-over-slf4j:jar:1.7.6:runtime
[INFO]    org.slf4j:slf4j-api:jar:1.7.6:compile
[INFO]    org.slf4j:slf4j-simple:jar:1.6.1:compile
[INFO]    org.springframework:spring-aop:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-beans:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-context:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-core:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-expression:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-jdbc:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-orm:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework:spring-test:jar:2.5.6:compile
[INFO]    org.springframework:spring-tx:jar:3.2.8.RELEASE:compile
[INFO]    org.springframework.data:spring-data-commons:jar:1.7.1.RELEASE:compile
[INFO]    org.springframework.data:spring-data-jpa:jar:1.5.1.RELEASE:compile
[INFO]    p6spy:p6spy:jar:2.0.1:test
[INFO]    postgresql:postgresql:jar:8.2-507.jdbc3:test
[INFO]    taglibs:standard:jar:1.1.2:compile

All the classes in the org.permacode project are relatively simple and the whole testing here is aimed around validating the application's implementation and management of the Spring context and transaction handling, hence the local classes in this project like AtomicConfigurationBean and ContextManager. These aren't actually doing anything treacherous other than wrapping the JPA entity manager factory or Spring application context.

I have more than one JPA provider dependency in there, because the project allows swapping between them - it's not an error. I assume it's not a source of the problem since I suspect that cglib or something else to do with proxying is the issue here.

I struggled to find a solution to this yesterday, sifting through a great number of cries for help with BeanCreationException and NoClassDefFoundErrors but generally always some solid class was missing from the victim's classpath. In this situation though Spring is complaining about $proxy10 which I assume is meant to be the name of one or other of the beans configured via IOC.

I'm not just looking for a solution, I would also upvote or accept as an answer good advice on an approach I should take to resolve this from scratch, assuming any epiphany will late in coming.

Was it helpful?

Solution 4

I stripped out most dependencies and removed large amounts of code until it worked and then started adding the latest version of dependencies back in as I uncommented the code and they became necessary for compilation and testing.

I reached the end of this process without the error resurfacing.

These are the differences in my dependency list:

$ diff.exe orig.txt new.txt
3,4c3
< [INFO]    cglib:cglib:jar:3.1:compile
< [INFO]    cglib:cglib-nodep:jar:2.1_3:test
---
> [INFO]    cglib:cglib-nodep:jar:2.2.2:test
14,15c13,14
< [INFO]    commons-io:commons-io:jar:1.3.1:compile
< [INFO]    commons-lang:commons-lang:jar:2.4:compile
---
> [INFO]    commons-io:commons-io:jar:1.3.2:compile
> [INFO]    commons-lang:commons-lang:jar:2.3:compile
47d45
< [INFO]    org.apache.tomcat:jsp-api:jar:6.0.13:test
49d46
< [INFO]    org.apache.tomcat:servlet-api:jar:6.0.13:test
51,54c48,49
< [INFO]    org.aspectj:aspectjrt:jar:1.7.4:compile
< [INFO]    org.easymock:easymock:jar:2.3:test
< [INFO]    org.easymock:easymockclassextension:jar:2.2.2:test
< [INFO]    org.eclipse.persistence:javax.persistence:jar:2.0.0:compile
---
> [INFO]    org.easymock:easymock:jar:3.2:test
> [INFO]    org.eclipse.persistence:eclipselink:jar:2.3.0:test
63,68c58,61
< [INFO]    org.ow2.asm:asm:jar:4.2:compile
< [INFO]    org.ow2.easybeans:easybeans-jpa-eclipselink:pom:1.2.1:compile
< [INFO]    org.permacode:permacode:jar:1.0.0:compile
< [INFO]    org.slf4j:jcl-over-slf4j:jar:1.7.6:runtime
< [INFO]    org.slf4j:slf4j-api:jar:1.7.6:compile
< [INFO]    org.slf4j:slf4j-simple:jar:1.6.1:compile
---
> [INFO]    org.objenesis:objenesis:jar:1.3:test
> [INFO]    org.ow2.easybeans:easybeans-jpa-eclipselink-dependency:pom:1.2.4:test
> [INFO]    org.permacode:atomic-test-jar:jar:1.0.1:test
> [INFO]    org.permacode:permacode:jar:1.0.1:compile
76c69
< [INFO]    org.springframework:spring-test:jar:2.5.6:compile
---
> [INFO]    org.springframework:spring-test:jar:3.2.8.RELEASE:test
78,79d70
< [INFO]    org.springframework.data:spring-data-commons:jar:1.7.1.RELEASE:compile
< [INFO]    org.springframework.data:spring-data-jpa:jar:1.5.1.RELEASE:compile

This is the maven dependency:list output so these are all my dependencies plus the resolved dependencies.

So cglib.jar is out and cglib-nodep is a later version.

Suspiciously, spring-test.jar is also updated because I explicitly depend on it now, otherwise it reverts to that older version. However that on its own doesn't create problems.

It's obviously not my priority to go back now and work out which of these changes solved the issue, I guess it could have been either or both of @raphw or @jhadesdev 's answers.

OTHER TIPS

I think the problem could be related to this part of the dependency:tree:

[INFO]    cglib:cglib:jar:3.1:compile
[INFO]    cglib:cglib-nodep:jar:2.1_3:test

In the test scope (so when running tests), there are two versions of cglib in the classpath, one more recent 3.1 and cglib-nodep, which is a version of cglib without it's dependencies.

Try to either upgrade cglib-nodep in test scope or remove it altogether if not needed, or keep cglib only. Either way having multiple version of the same classes in different jars is a common cause of NoClassDefFoundError.

Sometimes this is a problem with existing compiled classes as eclipse can use another build folder than maven does.

So the tests can run on different versions a a compiled class I have had these Problems last week and i was able to solve to do following steps:

  • Eclipse: Project --> clean --> select project/projects --> ok
  • Maven: goal: clean

That solved my problems. And don't forget to recompile all projects after clean.

With the additional information from your comment on @jhadesdev's answer:

You should not remove the cglib-nodep version from your class path but the cglib version that still has dependencies. Cglib runs on top of ASM. You have an explicit dependency on this framework (what is bad).

As it is stated in ASM's FAQ, one should always repackage a dependency onto this project since the API is not necessarily compatible between different versions. The conflict you are experiencing is most likely because of

[INFO]    cglib:cglib:jar:3.1:compile
[INFO]    org.ow2.asm:asm:jar:4.2:compile

where the cglib v3.1 dependency requires the latter ASM v4.2 dependency. There is a chance that you have another test dependency on your class path that works with another non-repackaged ASM version. Probably some mocking framework. Instead of using this version, you should use a cglib version with repackaged ASM.

However, I wonder what your java.lang.NoClassDefFoundError says. I understand that you get such an error if you are removing cglib entirely from the project because then the verifier will complain that some classes are referencing cglib without it being on the class path. But if you want a follow up, please run your code with only the no-dependency version and post the stack trace of the java.lang.NoClassDefFoundError.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top