Java JaCoCo和Jars先生

Java JaCoCo和Jars先生,java,jacoco,java-9,java-platform-module-system,Java,Jacoco,Java 9,Java Platform Module System,JaCoCo和客户之间存在问题。由于两个地方存在相同的类名,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

JaCoCo和客户之间存在问题。由于两个地方存在相同的类名,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版本的不同,按照它应该的方式运行(使用正确的类并忽略其他版本)?

JaCoCo尚未提供对Java 9文件的支持


这似乎在他们的计划中,但正如@nullpointer所解释的,JaCoCo不支持多版本JAR文件

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

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

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
    }
}
为此:

sourceDirectories = it.sourceSets.main.java
classDirectories = it.sourceSets.main.output.classesDirs
这里的区别是我们明确声明:
sourceset.main.output.classesDirs
,它排除了资源

@igr跳过(
排除
)META-INF/*.class目录怎么样?试试看:)事情是,听起来很简单,但相当复杂(或者我看不到)。在实际报告之前,分析引擎首先获取所有文件,因此存在问题。到目前为止,我正在尝试删除所有
资源
文件夹,因为报告不需要这些资源。
sourceDirectories = it.sourceSets.main.java
classDirectories = it.sourceSets.main.output.classesDirs