проблема cobertura с asm на пути к классам - PullRequest
2 голосов
/ 31 марта 2011

У меня есть настройка проекта с использованием maven, Spring 2.5.6, Hibernate 3.2.6 и недавно добавленной cobertura 1.9rc1 для анализа покрытия кода.

Первой проблемой, с которой я столкнулся, были ошибки, связанные с classpath из-за двух разных версий asm.jar на classpath. Эта проблема возникает только при запуске тестов JUnit и попытке загрузить контекст приложения Spring.

Согласно часто задаваемым вопросам на домашней странице проекта cobertura:

Почему Cobertura вызывает у меня конфликты между классами и ASM?

Cobertura использует ASM для изменения вашего байт-кода. Есть несколько других популярных программ, которые используют ASM; Groovy и Hibernate, чтобы назвать два. У вас могут возникнуть проблемы, если Cobertura использует другую версию asm, и вы добавляете обе версии в ваш путь к классам.

Cobertura использует ASM только для инструментов. Cobertura не нуждается в ASM в вашем classpath при выполнении тестов. Если вы видите конфликты путей к классам, просто убедитесь, что фляга asm, поставляемая с Cobertura, используется только 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 находится на пути к классам. Но как еще я могу разрешить этот конфликт путей к классам, как указано в faq cobertura?

1 Ответ

3 голосов
/ 31 марта 2011

Чтобы настроить плагин 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>
...