天天看點

再遇asm問題

   以前遇到過這個問題,今天再次遇到,又有了點新的收獲。還是先看看問題吧,在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)

    記得以前遇到過這個問題,當時就把我折騰得夠嗆。後來,發現了問題的所在(由于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部落格,原文連結:<b>http://blog.51cto.com/yangfei520/309119</b>,如需轉載請自行聯系原作者