JaCoCo和MR Jars

时间:2017-12-06 00:06:23

标签: java jacoco java-9 jigsaw

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版本?

2 个答案:

答案 0 :(得分:3)

正如@nullpointer所解释的那样,JaCoCo不支持多版本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

答案 1 :(得分:1)

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

这似乎是在他们的计划中,但跟踪jacoco/issues#407