# Merge Jacoco coverage reports for multiproject setups

**URL:** https://discuss.gradle.org/t/merge-jacoco-coverage-reports-for-multiproject-setups/12100
**Category:** Help/Discuss
**Created:** [October 8, 2015, 10:31pm UTC](https://discuss.gradle.org/t/merge-jacoco-coverage-reports-for-multiproject-setups/12100 "2015-10-08T22:31:17Z")
**Posts on this page:** 1
**Showing post:** 6

<div class="post-metadata">

### Author: ![Benjamin\_Manes](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/benjamin_manes/32/112_2.png) [@Benjamin\_Manes](https://discuss.gradle.org/u/Benjamin_Manes)
#### Post date: [November 11, 2015, 4:18am UTC](https://discuss.gradle.org/t/merge-jacoco-coverage-reports-for-multiproject-setups/12100/6 "2015-11-11T04:18:03Z")

</div>

The `JacocoMerge` is probably more correct, but a common alternative is the `jacocoRootReport` style task. The example below is how you can create an aggregate report and publish to Coveralls. You can dig into the usage [here](https://github.com/ben-manes/caffeine/blob/master/build.gradle) if you run into problems.

```gradle
task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') {
  description = 'Generates an aggregate report from all subprojects'
  dependsOn(subprojects.test)

  additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
  sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
  classDirectories = files(subprojects.sourceSets.main.output)
  executionData = files(subprojects.jacocoTestReport.executionData)

  reports {
    html.enabled = true
    xml.enabled = true
  }

  doFirst {
    executionData = files(executionData.findAll { it.exists() })
  }
}

coveralls {
  sourceDirs = subprojects.sourceSets.main.allSource.srcDirs.flatten()
  jacocoReportPath = "${buildDir}/reports/jacoco/jacocoRootReport/jacocoRootReport.xml"
}

```

---

_[View the full topic](https://discuss.gradle.org/t/merge-jacoco-coverage-reports-for-multiproject-setups/12100)._
