SonarQube: Cobertura incompleta no projeto de gradiente multimodular com a JaCoCo

Estou construindo um servidor SonarQube 6.2 que já está analisando meus projetos Java 8 / Gradle 3.3. Ao adicionar a JaCoCo a um projeto gradle de múltiplos módulos, percebi que o SonarQube está medindo a cobertura de código em uma base "por módulo":

Se uma classe estiver localizada no móduloA e um teste para esta classe está localizado no móduloB, O SonarQube calcula que a classe énão coberto.

Quero medir a cobertura do código em todos os módulos, não por módulo. Como faço para conseguir isso?

Existem muitas perguntas semelhantes, mas nenhuma resposta útil, embora a situação me pareça bastante comum. Jenkins, por exemplo, faz isso por padrão.

Eu decidi construir umblueprint no github para esclarecer a questão.

O principalbuild.gradle consiste em

plugins { id "org.sonarqube" version "2.2.1" }

subprojects {
    apply plugin: 'java'
    apply plugin: 'jacoco'

    repositories { mavenCentral() }
    dependencies { testCompile "junit:junit:4.12" }
}

modA/build.gradleestá vazia.

Ele contém 3 classes:TestedInModA, TestedInModATest eTestedViaModB.

modB/build.gradleapenas declara uma dependência demodA:

dependencies { compile project(':modA') }

Ele contém apenas uma classe:TestedViaModBTesttestando a classeTestedViaModB localizado emmodA.

Minha instância Jenkins (privada) mostra 100% de cobertura para as duas classes incluídas, enquanto o SonarQube diz apenas a classeTestedInModA (que é testado em seu próprio módulo) é coberto.

Como posso modificar meu processo de construção para ver a "cobertura entre módulos" no SonarQube?

Gostaria de atualizar meu projeto para que futuros visitantes desta pergunta possam encontrar um exemplo de trabalho.

Minha solução de trabalho (obrigado @Godin)

adicione o seguinte aosubprojects fecho

tasks.withType(Test) {
    // redirect all coverage data to one file
    // ... needs cleaning the data prior to the build to avoid accumulating coverage data of different runs.
    // see `task cleanJacoco`
    jacoco {
        destinationFile = file("$rootProject.buildDir/jacoco/test.exec")
    }
}

Adicionar, acrescentar

task cleanJacoco(dependsOn: 'clean') {  delete "$buildDir/jacoco" }

lado de fora asubprojects fecho.

questionAnswers(2)

yourAnswerToTheQuestion