2013-02-04 74 views
1

我想在我的web應用程序中使用Cobertura代碼覆蓋錄製,但無法使其工作。我懷疑,這個問題是Spring或Hibernate和Cobertura之間的一些衝突,因爲三者都使用ASM庫來執行它們的字節碼操作。爲什麼Cobertura不能在我的Spring/Hibernate Webapp中工作?

我做了以下內容:

  • 我使用的Cobertura Ant任務的儀器我的罐子在 「WEB-INF/lib目錄」,併產生 「cobertura.ser」 文件
  • 我添加了「的Cobertura的.jar」到 「WEB-INF/lib目錄」
  • 我啓動tomcat提供的Cobertura文件位置(net.sourceforge.cobertura.datafile = cobertura.ser)

當我啓動Tomcat,我得到以下錯誤當春天的消息繼續EXT初始化:

java.lang.NoSuchMethodException: com.foo.MyClass.setInstance($Proxy28) 
    at com.foo.common.runtime.spring.PluginInjector.findBestMatchingMethod(PluginInjector.java:252) 
    at com.foo.common.runtime.spring.PluginInjector.invokeMethod(PluginInjector.java:198) 
    at com.foo.common.runtime.spring.PluginInjector.afterPropertiesSet(PluginInjector.java:174) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 

我已經知道,這是自帶的Cobertura的asm.jar不應該在classpath中,因此我只複製cobertura.jar到WEB-INF \ lib中。

此外,我也試過艾瑪,它的工作。然而,cobertura看起來更現代化,活躍(最後更新從2010年而不是2005年),並生成更好的報告,所以我更喜歡它比艾瑪。

回答

0

我不得不做出兩處修改,以使這項工作:

  1. 我必須設置proxy-target-class="true"在Spring配置,所以Spring使用CGLIB來生成的代理,而不是使用JDK動態代理(見Spring Proxying mechanisms) 。

  2. 我必須設置JVM參數-XX:-UseSplitVerifier,這會導致JVM使用舊的字節碼驗證程序。這似乎是必要的,因爲Cobertura的字節碼操作與Java 7不兼容。

相關問題