こんにちは、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)
これを回避する方法は2つあります。
1)重複の1つに名前を変更します:Mavenプロジェクトに関しては、この問題を頻繁に見ています。これらの2つのクラスが2つの異なるモジュールにある場合でも、2つの異なるクラスに同じ名前を付けることは実際には良い考えではありません。
2)そのうちの1つを除外します:詳細については、 this SOスレッドを参照してください。
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つしかなかったにもかかわらず、同じことを行う2つのjarがプロジェクトフォルダーにあったことがわかりました。コードに複数のhamcrestjarがあるかどうかを確認してください。