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版本?
答案 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
,它排除了资源。
答案 1 :(得分:1)
JaCoCo尚未提供对Java 9 Multi-Release JAR文件的支持。
这似乎是在他们的计划中,但跟踪jacoco/issues#407。