2017-12-06 5 views
3

Es gibt ein Problem mit JaCoCo und MultiRelease JAR files. Da die gleichnamige Klasse an zwei Stellen vorhanden sind, JaCoCo klagt:JaCoCo und MR Jars

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) 

Wie wir JaCoCo (in Gradle) sagen können, um die Klassen von META-INF Pfad zu überspringen? ODER sich so zu verhalten, wie es sollte (korrekte Klasse verwenden und andere Versionen ignorieren), abhängig von der JVM-Version?

Antwort

2

Wie von @nullpointer erklärt, unterstützt JaCoCo keine Multi-Release-JAR-Dateien.

Meine Problemumgehung besteht darin, die Versionen Klassen zu ignorieren. Ich konnte nicht nur die Klasse ignorieren, indem ich explizit ihren Namen festlegte, es sieht so aus, als ob JaCoCo alle von ihnen scannt und erst später die Filter für den Ausschluss anwendet (aber vielleicht irre ich mich).

Daher war die einzige Möglichkeit zum Entfernen von Versionen Klassen, alle Ressourcen auszuschließen - da sie sowieso nicht verwendet werden. Wie folgt aus:

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 
    } 
} 

Also änderte ich dies:

sourceSets it.sourceSets.main 

dazu:

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

Der Unterschied ist hier, dass wir ausdrücklich Zustand: sourceSets.main.output.classesDirs die Ressourcen ausschließt.

Source

2

JaCoCo bietet noch keine Unterstützung für Java 9 Dateien.

Dies scheint jedoch in ihren Plänen zu sein, wie bei jacoco/issues#407 verfolgt.

+0

Ja ... versuchen, Abhilfe zu schaffen ... – igr

+1

@igr Wie wäre das Überspringen ('exclusion') der META-INF/*. Klasse Verzeichnis mit zu beginnen? – nullpointer

+0

versuchen, dass :) die Sache ist, es klingt einfach, aber es ist ziemlich komplex (oder ich sehe es nicht atm). Die Analyse-Engine nimmt zuerst alle Dateien vor der eigentlichen Berichterstellung, daher das Problem. Bisher versuche ich, alle 'Ressourcen'-Ordner zu entfernen, da sie für die Berichte nicht benötigt werden. – igr