Skip to content

Aggregate report for multi-JPMS: Can't add different class with same name: module-info #858

@vlsi

Description

@vlsi

Steps to reproduce

JaCoCo version: 0.8.3
Tool integration: Gradle 5.2.1

Multiple modules, JacocoReport Gradle task (note, there's no option to configure "exclude file").
Source directory list all the directories of project submodules. Each of them happens to have module-info.class which confuses JaCoCo

val jacocoReport by tasks.registering(JacocoReport::class) {
    group = "Coverage reports"
    description = "Generates an aggregate report from all subprojects"
}

allprojects {
    plugins.withType<JacocoPlugin> {
        val testTasks = tasks.withType<Test>()
        testTasks.configureEach {
            extensions.configure<JacocoTaskExtension> {
                // We don't want to collect coverage for third-party classes
                includes?.add("org.apache.jmeter.*")
            }
        }

        jacocoReport {
            // Note: this creates a lazy collection
            // Some of the projects might fail to create a file (e.g. no tests or no coverage),
            // So we check for file existence. Otherwise JacocoMerge would fail
            val execFiles = files(testTasks).filter { it.exists() && it.name.endsWith(".exec") }
            executionData(execFiles)
        }

        // Add each project to combined report
        configure<SourceSetContainer> {
            val mainCode = main.get()
            jacocoReport.configure {
                additionalSourceDirs.from(mainCode.allJava.srcDirs)
                sourceDirectories.from(mainCode.allSource.srcDirs)
                // IllegalStateException: Can't add different class with same name: module-info
                classDirectories.from(mainCode.output)  // <-- this fails
            }
        }
    }

Expected behaviour

module-info.class should be just ignored or attributed properly

Actual behaviour

....
Caused by: java.io.IOException: Error while analyzing .../domain/build/classes/kotlin/main/module-info.class.
        at org.jacoco.core.analysis.Analyzer.analyzerError(Analyzer.java:168)
        at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:140)
        at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:163)
        at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:199)
        at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:232)
        at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:227)
        at org.jacoco.ant.ReportTask.createBundle(ReportTask.java:567)
        at org.jacoco.ant.ReportTask.createReport(ReportTask.java:542)
        at org.jacoco.ant.ReportTask.execute(ReportTask.java:495)
        ... 107 more
Caused by: java.lang.IllegalStateException: Can't add different class with same name: module-info
        at org.jacoco.core.analysis.CoverageBuilder.visitCoverage(CoverageBuilder.java:105)
        at org.jacoco.core.analysis.Analyzer$1.visitEnd(Analyzer.java:98)
        at org.objectweb.asm.ClassVisitor.visitEnd(ClassVisitor.java:326)
        at org.jacoco.core.internal.flow.ClassProbesAdapter.visitEnd(ClassProbesAdapter.java:98)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:683)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:391)
        at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:122)
        at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:138)
        ... 114 more

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

Status
Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions