为什么Cobertura不在我的Spring / Hibernate Webapp中工作?

时间:2013-02-04 17:23:34

标签: spring hibernate tomcat cobertura java-bytecode-asm

我想在我的网络应用程序中使用Cobertura代码覆盖率记录,但无法使其工作。我怀疑,问题是Spring或Hibernate与Cobertura之间存在一些冲突,因为三者都使用ASM lib来进行字节码操作。

我做了以下事情:

  • 我使用Cobertura Ant任务在“WEB-INF / lib”中检测我的罐子并生成“cobertura.ser”文件
  • 我将“cobertura.jar”添加到“WEB-INF / lib”
  • 我启动tomcat提供cobertura文件位置(net.sourceforge.cobertura.datafile = cobertura.ser)

当我启动Tomcat时,我在初始化Spring上下文时收到以下错误消息:

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不应该在类路径中,因此我只将cobertura.jar复制到WEB-INF \ lib。

此外,我也尝试过艾玛,但它确实奏效了。然而,cobertura看起来更现代,更活跃(从2010年而不是2005年的最后更新)并生成更好的报告,所以我更喜欢它而不是艾玛。

1 个答案:

答案 0 :(得分:0)

我必须进行两项修改才能完成这项工作:

  1. 我必须在Spring配置中设置proxy-target-class="true",因此Spring使用CGLIB生成代理而不是使用JDK动态代理(参见Spring Proxying mechanisms)。

  2. 我必须设置JVM参数-XX:-UseSplitVerifier,这会导致JVM使用旧的字节码验证程序。这似乎是必要的,因为Cobertura的字节码操作与Java 7不兼容。