cobertura问题与类路径上的asm

时间:2011-03-31 12:06:46

标签: java hibernate spring maven cobertura

我使用maven,Spring 2.5.6,Hibernate 3.2.6进行了项目设置,最近添加了cobertura 1.9rc1进行代码覆盖分析。

我遇到的第一个问题是与类路径相关的错误,因为类路径上有两个不同版本的asm.jar。只有在运行JUnit测试并尝试加载spring应用程序上下文时,才会出现此问题。

根据cobertura项目主页的常见问题解答:

  

为什么Cobertura导致我与ASM发生类路径冲突?

     

Cobertura使用ASM修改您的字节码。还有一些其他流行的程序使用ASM; Groovy和Hibernate,两个名字。如果Cobertura使用不同版本的asm并且您将两个版本添加到类路径中,则可能会出现问题。

     

Cobertura在仪表时仅使用ASM。运行测试时,Cobertura在类路径中不需要ASM。如果您看到类路径冲突,只需确保Cobertura附带的asm jar仅由Cobertura使用,并且仅在检测时使用。

所以在我的项目pom中,我按如下方式配置了依赖项:

<dependency>
                <groupId>net.sourceforge.cobertura</groupId>
        <artifactId>cobertura</artifactId>
        <version>1.9rc1</version>
        <exclusions>
            <exclusion>
                <groupId>asm</groupId>
                <artifactId>asm</artifactId>
            </exclusion>
            <exclusion>
                <groupId>asm</groupId>
                <artifactId>asm-attrs</artifactId>
            </exclusion>
        </exclusions>
</dependency>

现在我可以从eclipse运行我的单元测试,我的应用程序也可以在服务器上正常运行。

但是,当我在我的项目上运行mvn cobertura:cobertura时,我收到以下错误: java.lang.NoClassDefFoundError:net / sourceforge / cobertura / coveragedata / TouchCollector

我认为这是因为错误的asm.jar在类路径上。但是,我如何才能解决这个类路径冲突,如cobertura faq中所述?

1 个答案:

答案 0 :(得分:3)

要配置maven-cobertura-plugin,您应该将其添加到<plugins>部分,而不是<dependency> - 我假设您的项目代码不需要cobertura进行编译。

运行mvn cobertura:cobertura时,您引用的<dependency>部分根本不会被引用。

例如:

<plugins>
  ...
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        ...
    </configuration>
  </plugin>
</plugins>