web-dev-qa-db-ja.com

JaCoCo同じ名前の異なるクラスを追加することはできません:org / hamcrest / BaseDescription

こんにちは、JaCoCoカバレッジを実行すると、次の例外が発生します。

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.5.8.201207111220</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>report</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Error while creating report: Can't add different class with same name: org/hamcrest/BaseDescription
Java.lang.IllegalStateException: Can't add different class with same name: org/hamcrest/BaseDescription
    at org.jacoco.core.analysis.CoverageBuilder.visitCoverage(CoverageBuilder.Java:89)
    at org.jacoco.core.analysis.Analyzer$1.visitEnd(Analyzer.Java:79)
    at org.objectweb.asm.ClassAdapter.visitEnd(Unknown Source)
    at org.jacoco.core.internal.flow.ClassProbesAdapter.visitEnd(ClassProbesAdapter.Java:128)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.Java:94)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.Java:115)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.Java:155)
    at org.jacoco.core.analysis.Analyzer.analyzeArchive(Analyzer.Java:135)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.Java:158)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.Java:183)
    at org.jacoco.maven.ReportMojo.createBundle(ReportMojo.Java:280)
    at org.jacoco.maven.ReportMojo.createReport(ReportMojo.Java:256)
    at org.jacoco.maven.ReportMojo.executeReport(ReportMojo.Java:230)
    at org.jacoco.maven.ReportMojo.execute(ReportMojo.Java:208)
    at org.Apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.Java:490)
    at org.Apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.Java:694)
    at org.Apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.Java:556)
    at org.Apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.Java:535)
    at org.Apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.Java:387)
    at org.Apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.Java:348)
    at org.Apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.Java:180)
    at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:328)
    at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:138)
    at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:362)
    at org.Apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.Java:60)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.Java:315)
    at org.codehaus.classworlds.Launcher.launch(Launcher.Java:255)
    at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.Java:430)
    at org.codehaus.classworlds.Launcher.main(Launcher.Java:375)
27
DarVar

これを回避する方法は2つあります。

1)重複の1つに名前を変更します:Mavenプロジェクトに関しては、この問題を頻繁に見ています。これらの2つのクラスが2つの異なるモジュールにある場合でも、2つの異なるクラスに同じ名前を付けることは実際には良い考えではありません。

2)そのうちの1つを除外します:詳細については、 this SOスレッドを参照してください。

10
rb512

Rb512に同意します。このエラーが発生する可能性のあるもう1つのケース/領域は、コンパイルプロセス中に、JIBX/WSTなどを使用している場合、または動的クラスファイルを作成する同様の他のステップ/プロセス(コンパイル時に)、つまり対応する有効なものがない場合です。ワークスペース内のソースファイル(.Java/.groovyなど)。

その場合、ワークスペースには追加のクラスファイルがあり、jacocoがレポートを生成しようとすると、重複するクラスに対して同じエラーでエラーが発生します。このケースが原因でこのエラーが見つかった場合は、jacocoレポートを実行する前にクラスファイルを削除する必要があります

Gradleを使用している場合(Mavenの場合は、Maven pom .xmlファイルでも同じことを行います)、以下のdoFirstブロックを参照してください。

  jacocoTestReport {
      //cleaning up the JiBx classes to jacoco will not cause problems for CareDiscovery
      doFirst {
             delete fileTree (dir: "${buildDir}/classes", include: "**/JiBX_*.class")
      }
      group = "Reporting"
      description = "Generate Jacoco coverage reports after running tests."

      executionData = fileTree(dir: 'build/jacoco', include: '**/*.exec')

      reports {
             xml{
                 enabled true
                 //Following value is a file
                 destination "${buildDir}/reports/jacoco/xml/jacoco.xml"
             }
             csv.enabled false
             html {
                 enabled true
                 //Following value is a folder
                 destination "${buildDir}/reports/jacoco/html"
             }
      }

      sourceDirectories = files(['src/Java','src/main/Java', 'src/main/groovy'])
      classDirectories =  files('build/classes/main')
  }
1
Arun Sangal

私はあなたと同じ問題にぶつかった。ビルドパスに1つしかなかったにもかかわらず、同じことを行う2つのjarがプロジェクトフォルダーにあったことがわかりました。コードに複数のhamcrestjarがあるかどうかを確認してください。

0
Phil