以前遇到过这个问题,今天再次遇到,又有了点新的收获。还是先看看问题吧,在SSH项目中,启动tomcat时报错:
严重: Exception sending context initialized event to listener instance of class
org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file
[D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ShoppingCart\WEB-INF\classes\applicationContext-beans.xml]:
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;
[Ljava/lang/String;Ljava/lang/String;)V
at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)
at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:173)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file
[D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ShoppingCart\WEB-INF\classes\applicationContext-beans.xml]:
Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;
[Ljava/lang/String;Ljava/lang/String;)V
at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77)
at net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:173)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
记得以前遇到过这个问题,当时就把我折腾得够呛。后来,发现了问题的所在(由于Spring中的“asm-2.2.3.jar”和Hibernate中的“asm.jar”包冲突),也就很容易就解决了(移除Spring AOP Libraries中的“asm-2.2.3.jar”即可)。由于当时使用的是我自建的User Libraries类库,所以操作上很简单,
Window-->Preferences-->Java-->Build Path-->User Libraries-->
找到自己建的spring库中的asm-2.2.3.jar,"remove"掉即可。
可是几天我使用的是myeclipse自带的类库,怎么能随便编辑IDE自带的类库呢?!开始我觉得不太现实,可最终试出了一个办法,还真能办到:
myeclipse-->Preferences-->MyEclipse EnterpriseWorkbench-->Project Capabilities-->Spring-->Spring2.5-->Spring2.5 AOP Libraries-->
找到asm-2.2.3.jar,"remove"掉。本来很得意,可重启了tomcat发现问题依旧!我又把spring的asm-2.2.3.jar添加上,而把hibernate的asm.jar去掉,问题依旧!
最后,翻了半天资料,原来是cglib包要用到asm包,我发现spring2.5 AOP Libraries里有个cglib-nodep-2.1_3.jar和hibernate3.2 Core Libraries里都有个cglib-2.1.3.jar,问题的根肯定是cglib和asm的版本对应上,而不只在asm!于是,我把hibernate中所有和cglib,asm有关的三个包asm.jar,asm-attrs.jar,cglib-2.1.3.jar都"remove"掉,而只保留spring中的这些包。重启tomcat,问题解决!
当然,知道了问题的所在,解决途径可能不唯一,不过关于SSH包版本的问题耽误这么多功夫,我觉得实在不应该。既然大家是协同工作的,在各自版本升级的过程中,为什么就不能协调一下呢?可能是缺乏这样的国际组织,又或是其它?在此轻声的呼吁一小下下,嘎嘎。
本文转自NightWolves 51CTO博客,原文链接:
http://blog.51cto.com/yangfei520/309119
,如需转载请自行联系原作者