35

こんにちは、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)
4

5 に答える 5

12

これを回避するには、次の 2 つの方法があります。

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

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

于 2012-08-22T07:58:27.640 に答える
2

私は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')
  }
于 2015-11-13T21:59:00.840 に答える
2

target-folder内の特定の jar ファイルまたはプロジェクト ファイルは、通常、この問題を引き起こします。これが私たちのMavenプロジェクトの問題を解決したものです(グラドルに対するSanjayの回答を参照してください):

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.7</version>
            <configuration>
                <excludes>**/*.jar</excludes>
            </configuration>
        </plugin>

これは、特定のプロジェクトで機能する最も簡単なソリューションであることに注意してください。追加の除外を行う必要がある場合は、複数の<exclude>-command を次のようにラップします。

            <configuration>
                <excludes>
                    <exclude>**/*.jar</exclude>
                    <exclude>naughty-dependency/**/*.class</exclude>
                </excludes>
            </configuration>

注意: この構成セクションでは、意図的に JaCoCo を -goals にアタッチしません<execution>。このようにして、デフォルトのパッケージ化プロセスは、JaCoCo が失敗したときに中断せず、実行もわずかに高速になります。レポートは、発行時にのみ生成さmvn org.jacoco:jacoco-maven-plugin:prepare-agent test jacoco:reportれます。これは、たとえば gitlab CI パイプラインで行います。

于 2021-05-13T14:31:43.810 に答える
0

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

于 2016-05-14T18:29:15.473 に答える
0

私の場合、プロジェクト Jar アーティファクトのクラスが原因で問題が発生していました。

    Caused by: java.io.IOException: Error while analyzing /opt/jenkins/workspace/MicroService-M_build/microservice/dev/microservice/build/gen/main/resources/uploadassets/myCustomProject.jar@org/apache/commons/beanutils/BasicDynaBean.class.
Caused by: java.lang.IllegalStateException: Can't add different class with same name: org/apache/commons/beanutils/BasicDynaBean
    at org.jacoco.core.analysis.CoverageBuilder.visitCoverage(CoverageBuilder.java:107)

以下は、jacoco テスト レポートからカスタム jar を除外するための gradle taks です。

jacocoTestReport {
        doFirst {
            delete fileTree (dir: "${buildDir}/gen/main/resources/uploadassets", include: "myCustomProject.jar")
        }
        reports {
            xml.enabled true
        }
    }

これで私の問題は解決しました。

于 2021-01-25T13:12:44.580 に答える