web-dev-qa-db-fra.com

Erreur: Java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <Init> (I) V

Je développe une petite application Spring. Je dois stocker les détails des informations sur les étudiants dans la base de données. J'ai développé un SimpleFormController. J'ai utilisé la cartographie NetBeans + Hibernate + Spring. Lorsque je déploie le projet, les erreurs suivantes se produisent.

Mon spring-config-db-applicationContext.xml est affiché ci-dessous:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- Hibernate session factory -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <constructor-arg index="0">
        <value>${driverClassName}</value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>${url}</value>
    </constructor-arg>
    <constructor-arg index="2">
        <value>${username}</value>
    </constructor-arg>
    <constructor-arg index="3">
        <value>${password}</value>
    </constructor-arg>
  </bean>


  <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
    <!-- <property name="configLocation">
        <value>WEB-INF/classes/hibernate.cfg.xml</value>
    </property> -->
    <property  name="mappingResources" >
        <list>
            <value>hibernate.cfg.xml</value>
        </list>
    </property>

  <!--  <property  name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property> -->

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
  <!--<prop key="hibernate.hbm2ddl.auto">create</prop>-->
        </props>
    </property>
  </bean>
  <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>
    </property>
  </bean>
  <bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>
    </property>
  </bean>
</beans>

L'erreur suivante est survenue:

ERROR (org.springframework.web.context.ContextLoader:213) - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in URL [jndi:/localhost/Student/WEB-INF/classes/config/spring-db-applicationContext.xml]: Invocation of init method failed; nested exception is Java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1395)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:512)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:450)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:289)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:286)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:188)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:526)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:730)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:387)
        at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.Java:270)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:197)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:47)
        at org.Apache.catalina.core.StandardContext.listenerStart(StandardContext.Java:3843)
        at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:4342)
        at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.Java:791)
        at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:771)
        at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:525)
        at org.Apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.Java:627)
        at org.Apache.catalina.startup.HostConfig.deployApps(HostConfig.Java:511)
        at org.Apache.catalina.startup.HostConfig.check(HostConfig.Java:1231)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
        at Java.lang.reflect.Method.invoke(Method.Java:597)
        at org.Apache.Tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.Java:297)
        at com.Sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.Java:836)
        at com.Sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.Java:761)
        at org.Apache.catalina.manager.ManagerServlet.check(ManagerServlet.Java:1471)
        at org.Apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.Java:824)
        at org.Apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.Java:350)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:290)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.Java:196)
        at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:235)
        at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
        at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:233)
        at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:191)
        at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:525)
        at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:128)
        at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:102)
        at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:109)
        at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:286)
        at org.Apache.coyote.http11.Http11Processor.process(Http11Processor.Java:845)
        at org.Apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.Java:583)
        at org.Apache.Tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.Java:447)
        at Java.lang.Thread.run(Thread.Java:619)
Caused by: Java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
        at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.Java:47)
        at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.Java:30)
        at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.Java:24)
        at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.Java:216)
        at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.Java:144)
        at net.sf.cglib.core.KeyFactory.create(KeyFactory.Java:116)
        at net.sf.cglib.core.KeyFactory.create(KeyFactory.Java:108)
        at net.sf.cglib.core.KeyFactory.create(KeyFactory.Java:104)
        at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.Java:69)
        at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.Java:117)
        at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.Java:43)
        at org.hibernate.Tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.Java:162)
        at org.hibernate.Tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.Java:135)
        at org.hibernate.Tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.Java:55)
        at org.hibernate.Tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.Java:56)
        at org.hibernate.Tuple.entity.EntityMetamodel.<init>(EntityMetamodel.Java:302)
        at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.Java:434)
        at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.Java:108)
        at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.Java:61)
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.Java:238)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1304)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.Java:813)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.Java:731)
        at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.Java:211)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1454)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1392)
        ... 48 more
Mar 12, 2010 5:32:28 PM org.Apache.catalina.core.StandardContext start
SEVERE: Error listenerStart
28
Hitesh Solanki

Vous avez une incompatibilité entre la version d'ASM requise par Hibernate (asm-1.5.3.jar) et celle requise par Spring. Mais en réalité, je me demande pourquoi vous avez asm-2.2.3.jar sur votre chemin de classe (ASM est fourni dans les fichiers spring.jar et spring-core.jar pour éviter ces problèmes autant que je sache). Voir HHH-2222

37
Pascal Thivent
16
Rob Hufschmitt

Le NoSuchMethodError javadoc dit ceci:

Lancé si une application tente d'appeler une méthode spécifiée d'une classe (statique ou instance) et que cette classe n'a plus de définition de cette méthode.

Normalement, cette erreur est interceptée par le compilateur. cette erreur ne peut se produire au moment de l'exécution que si la définition d'une classe a été modifiée de manière incompatible.

Dans votre cas, cette erreur est une indication strong que votre application Web utilise la mauvaise version du fichier JAR définissant les classes org.objectweb.asm.*.

7
Stephen C

pour résoudre ce genre de problème, vous devez ajouter deux jar dans votre POM de dépendance (si vous utilisez Maven)

<dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
</dependency>

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.1</version>
</dependency>

Je change mes API en tant que * cglib --- en ---> cglib-nodep-2.2.jar * cglib-asm --- en ---> cglib asm.jar (c'est-à-dire le dernier)

3
Narendra Choyal

J'ai eu la même erreur lors de l'initialisation de Spring au démarrage, en utilisant différentes versions de bibliothèque, mais tout a fonctionné lorsque mes versions ont été classées dans cet ordre dans le chemin de classe (les autres bibliothèques du cp n'étaient pas importantes):

  1. asm-3.1.jar
  2. cglib-nodep-2.1_3.jar
  3. asm-attrs-1.5.3.jar
3
Jason

Il y a beaucoup d'incompatibilités entre les différentes versions de cglib et beaucoup de mauvais conseils que l'on peut trouver sur Google à ce sujet (utilisez les anciennes versions de cglib-nodeb, etc.). Après avoir lutté avec ce non-sens pendant 3 jours avec une version ancienne de Spring (2.5.6), j'ai découvert:

  • si Spring génère des exceptions à propos de NoSuchMethodError basées sur Enhancer de cglib manquant setInterceptDuringConstruction (boolean), vérifiez vos dépendances dans maven (l'onglet Hiérarchie des dépendances doit répertorier toutes les versions de cglib par lesquelles votre projet est pollué). Vous avez probablement une dépendance qui introduit une version de cglib antérieure à la version 2.2, dont Spring Cglib2AopProxy saisira Enhancer pour effectuer le remplacement par proxy. Ajoutez la version 2.2+ à vos dépendances mais assurez-vous de mettre des exclusions pour ces autres versions. Si vous ne le faites pas, ça continuera à exploser.
  • Assurez-vous que vous avez une version suffisamment élevée de cglib dans les dépendances maven du projet actuel mais méfiez-vous des versions trop élevées, car vous obtiendrez plutôt IncompatibleClassChangeError. 
  • Vérifiez que vos modifications de pom ont été correctement intégrées au projet en effectuant une mise à jour maven sur le projet en question, puis en consultant Projet> Préférences> Chemin de construction Java> Bibliothèques> Dépendances Maven. Si vous voyez les mauvaises versions de cglib ici, il est temps de modifier le pom à nouveau. 
0
Jim W

Mettez à jour votre pom.xml

<dependency>
  <groupId>asm</groupId>
  <artifactId>asm</artifactId>
  <version>3.1</version>
</dependency>

J'ai rencontré la même erreur lors de l'ajout de http-builder à des dépendances.
Dans mon cas, je pourrais résoudre en excluant simplement asm comme ceci: 

compile('org.codehaus.groovy.modules.http-builder:http-builder:0.7'){
    excludes 'xml-apis'
    exclude(group:'xerces', module: 'xercesImpl')
    excludes 'asm'
}
0
toshi