JaCoCo 和 MR Jars

JaCoCo and MR Jars

JaCoCo 和 MultiRelease JAR files 存在问题。由于两个地方存在相同的 class 名称,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.visitEnd(Analyzer.java:96)

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

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

这似乎在他们的计划中,尽管在 jacoco/issues#407.

进行了跟踪。

如@nullpointer 所述,JaCoCo 不支持多版本 JAR 文件。

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

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

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