2017-12-06 25 views
3

JaCoCo 및 MultiRelease JAR files에 문제가 있습니다. 같은 클래스 이름이 두 장소에 존재하기 때문에, JaCoCo는 불평 :JaCoCo 및 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) 

우리는 META-INF 경로에서 클래스를 건너 (Gradle을에서) JaCoCo 말할 수 있습니까? 그렇지 않으면 JVM 버전에 따라 올바른 클래스를 사용하고 다른 버전은 무시해야합니다.

답변

2

@nullpointer에서 설명한 것처럼 JaCoCo는 다중 릴리스 JAR 파일을 지원하지 않습니다.

제 해결 방법은 버전 클래스를 무시하는 것입니다. 나는 클래스를 명시 적으로 설정하여 클래스를 무시할 수 없었습니다. JaCoCo가 모든 클래스를 스캔 한 다음 나중에 필터를 제외 용으로 적용합니다 (하지만 어쩌면 틀 렸습니다).

따라서 버전 클래스를 제거하는 유일한 방법은 모든 리소스를 제외하는 것이 었습니다. 어쨌든 사용되지 않았기 때문입니다. 이처럼이에

sourceSets it.sourceSets.main 

:

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 

우리가 명시 적으로 상태 여기의 차이 : sourceSets.main.output.classesDirs 자원을 제외한다.

Source

2

JaCoCo는 아직 Java 9 Multi-Release JAR 파일을 지원하지 않습니다.

이것은 jacoco/issues#407으로 추적되었지만 계획에있는 것 같습니다.

+0

예 ... 생략에 대해 ('exclusion')에 META-INF/*. 클래스 디렉토리로 시작하는 방법 @igr 해결 ... – igr

+1

을 찾기 위해 노력? – nullpointer

+0

그걸 시도 :) 일이 쉽지만, 그것은 꽤 복잡합니다 (또는 내가 그것을 볼 수 없습니다 atm). 분석 엔진은 실제로보고하기 전에 모든 파일을 먼저 취하므로 문제가됩니다. 지금까지 모든'resources' 폴더를 제거하려고합니다. 보고서에 필요하지 않기 때문입니다. – igr