【问题标题】:JaCoCo and MR JarsJaCoCo 和 MR 罐子
【发布时间】:2017-12-07 16:47:15
【问题描述】:

JaCoCo 和MultiRelease JAR files 存在问题。由于两个地方存在相同的类名,JaCoCo 抱怨:

Caused by: java.lang.IllegalStateException: Can't add different class with same name: jodd/core/JavaBridge
        at org.jacoco.core.analysis.CoverageBuilder.visitCoverage(CoverageBuilder.java:107)
        at org.jacoco.core.analysis.Analyzer$1.visitEnd(Analyzer.java:96)

我们如何告诉 JaCoCo(在 Gradle 中)跳过 META-INF 路径中的类?或者表现得像它应该的那样(使用正确的类并忽略其他版本),取决于 JVM 版本?

【问题讨论】:

    标签: java jacoco java-9 java-platform-module-system


    【解决方案1】:

    正如@nullpointer 所解释的,JaCoCo 不支持 Multi-Release JAR 文件。

    我的解决方法是忽略版本类。我无法通过显式设置其名称来仅忽略该类,看起来 JaCoCo 正在扫描所有这些类,然后才应用过滤器进行排除(但也许我错了)。

    因此,删除版本类的唯一方法是排除所有资源 - 因为它们无论如何都不会被使用。像这样:

    task codeCoverage(type: JacocoReport) {
        executionData fileTree("${buildDir}/jacoco/").include("*.exec")
    
        //sourceSets it.sourceSets.main  <--- REPLACED WITH FOLLOWING LINES!!!
        sourceDirectories = it.sourceSets.main.java
        classDirectories = it.sourceSets.main.output.classesDirs
    
        reports {
            xml.enabled true
            html.enabled true
        }
    }
    

    所以我改变了这个:

    sourceSets it.sourceSets.main
    

    到这里:

    sourceDirectories = it.sourceSets.main.java
    classDirectories = it.sourceSets.main.output.classesDirs
    

    我们明确声明的区别:sourceSets.main.output.classesDirs 不包括资源。

    Source

    【讨论】:

      【解决方案2】:

      JaCoCo 尚未提供对 Java 9 Multi-Release JAR 文件的支持。

      这似乎在他们的计划中,尽管在 jacoco/issues#407 上跟踪。

      【讨论】:

      • @igr 跳过 (exclusion) META-INF/*.class 目录开始怎么样?
      • 尝试一下 :) 事情是,这听起来很简单,但它相当复杂(或者我在 atm 看不到它)。分析引擎在实际报告之前首先获取所有文件,因此出现了问题。到目前为止,我正在尝试删除所有 resources 文件夹,因为报告不需要它们。
      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2013-11-11
      相关资源
      最近更新 更多