【问题标题】:JaCoCo Can't add different class with same name: org/hamcrest/BaseDescriptionJaCoCo 无法添加具有相同名称的不同类:org/hamcrest/BaseDescription
【发布时间】:2022-01-26 06:12:36
【问题描述】:

您好,我在运行 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)

【问题讨论】:

标签: jacoco


【解决方案1】:

有两种方法可以避免这种情况:

1) 重命名其中一个重复项:当涉及到 maven 项目时,我经常看到这个问题。即使这两个类位于两个不同的模块中,两个不同的类具有相同的名称也不是一个好主意。

2)排除其中之一:更多信息请参考this SO线程。

【讨论】:

  • 正确。另一个领域是在编译过程中,如果我们使用 JIBX/etc 创建动态类文件(编译时),我们没有有效的相应源文件(.java/.groovy 等)。在这种情况下,当 jacoco 将尝试生成报告时,它会因重复出现相同的错误而出错......在这种情况下,如果您找到任何重复的源文件,您将找不到任何(因为没有源文件第一手)。要解决这个问题,您必须在运行 jacoco 报告之前删除所有类文件。
【解决方案2】:

我同意 rb512。另一个可能出现此错误的情况/区域是,在编译过程中,如果我们使用 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')
  }

【讨论】:

  • 比删除重复的类更好的选择是从 classDirectories 中删除它们: doFirst { classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: ['some/包/到/排除/**', '一些/其他/包/到/排除/**']) }) }
【解决方案3】:

target-文件夹中的某些 jar 或项目文件通常会导致此问题。这就是在我们的 maven 项目中解决问题的方法(请参阅Sanjay's answer for gradle):

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

请注意,这是适用于我们特定项目的最简单的解决方案。如果您需要进行额外的排除,请包装多个&lt;exclude&gt;-commands,如下所示:

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

注意此配置部分不会故意将 JaCoCo 附加到任何 &lt;execution&gt;-goals。这样,当 JaCoCo 跌倒时,默认打包过程不会中断,并且运行速度也稍快一些。只有在发出 mvn org.jacoco:jacoco-maven-plugin:prepare-agent test jacoco:report 时才会生成报告,例如我们在 gitlab CI 管道中执行此操作。

【讨论】:

    【解决方案4】:

    我遇到了和你一样的问题。事实证明,我的项目文件夹中有两个 jars 做了同样的事情,即使其中只有一个在构建路径中。检查您的代码中是否有多个 hamcrest jar。

    【讨论】:

      【解决方案5】:

      在我的情况下,问题是由于项目 Jar artefact 中的类而发生的。

          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-03-30
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        相关资源
        最近更新 更多