jacocoRootReport 仅显示多项目 gradle 构建的最后一个项目的覆盖率

jacocoRootReport only shows coverage from last project of multi-project gradle build

我正在将我的 Gradle 4 多项目设置升级到 Gradle 6。我已按照此处的说明进行操作:

而且我已经将 jacoco 版本提高到 0.8.5。现在唯一的问题是人类可读的覆盖率报告似乎缺少它在旧版本下显示的大部分覆盖率数据。覆盖率报告似乎只反映了最后(最近测试的)项目。它曾经在 Gradle 4 下工作正常。我正在使用 Java 8.

我 运行 gradle 使用 --debug 构建,我注意到 test.exec 文件被重复删除,每个有测试的子项目一次。我认为这是问题所在,但我不知道如何防止删除此文件。

2020-04-16T09:16:21.048-0600 [DEBUG] [org.gradle.internal.file.impl.DefaultDeleter] Deleting /Users/bishop/dev/aep/edge-profile-lookup-target/build/jacoco/test.exec

有人可以帮我解决这个问题,以便所有覆盖率(来自针对每个子项目的 运行 的每个测试)都出现在一个覆盖率报告中吗?

以下是主要 build.gradle 文件中似乎相关的部分:

buildscript {
    ext {
        jacocoVersion = '0.8.5'
        ...
    }
    ...
}

allprojects {
    ...
    apply plugin: 'jacoco'
    ...
}

subprojects {
    tasks.withType(Test) {
        // redirect all coverage data to one file
        jacoco {
            destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
        }
    }
    jacoco {
        toolVersion = jacocoVersion
    }

    jacocoTestReport {
        additionalSourceDirs.from = files(sourceSets.main.allSource.srcDirs)
        sourceDirectories.from = files(sourceSets.main.allSource.srcDirs)
        classDirectories.from = files(sourceSets.main.output.collect {
            fileTree(dir: it, exclude: project.properties['BUILD_COVERAGE_EXCLUSIONS'].tokenize(','))
        })
        reports {
            html.enabled = true
            xml.enabled = true
            csv.enabled = false
        }
    }
}

task jacocoRootReport(type: JacocoReport) {
    dependsOn = subprojects.test
    additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories.from = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories.from = files(subprojects.jacocoTestReport.classDirectories)
    executionData.from = files(subprojects.jacocoTestReport.executionData)
    reports {
        html.enabled = true
        xml.enabled = true
        csv.enabled = false
    }
    onlyIf = {
        true
    }
    doFirst {
        executionData.from = files(executionData.findAll {
            it.exists()
        })
    }
}

...
apply plugin: 'jacoco'

configurations.create("jacoco")

configurations {
    jacoco
}

dependencies {
    jacocoAnt group: 'org.jacoco', name: 'org.jacoco.ant', version: jacocoVersion
    jacocoAnt group: 'org.ow2.asm', name: 'asm', version: asmVersion
}

task copyRuntimeLibs(type: Copy) {
    from configurations.jacoco
    into "$rootProject.buildDir/libs"
}

build.dependsOn copyRuntimeLibs

以下:

jacoco {
    destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
}

将 Jacoco 配置为始终使用相同的输出文件。

所以问题很可能是更新的 Gradle 版本在分离冲突输出方面起作用。

我建议查看 recently published sample 如何在多项目中设置 Jacoco,而不是尝试依赖冲突输出。