2

我有一个使用 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 常见问题解答中所述,我还能如何解决这个类路径冲突?

4

1 回答 1

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>
于 2011-03-31T12:45:25.190 回答