java-coverage
JaCoCo code coverage configuration for Java/Gradle projects. Covers report generation, coverage thresholds, multi-module aggregation, and SonarQube integration. Use when setting up or troubleshooting code coverage.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Java Coverage
JaCoCo code coverage configuration for Java/Gradle projects.
When to use this skill
- Setting up code coverage reporting
- Configuring coverage thresholds
- Aggregating coverage across modules
- Integrating with SonarQube
- Troubleshooting coverage reports
Skill Contents
Sections
- When to use this skill (L23-L30)
- Quick Start (L56-L93)
- Coverage Thresholds (L94-L118)
- Exclusions (L119-L138)
- Multi-Module Aggregation (L139-L189)
- SonarQube Integration (L190-L200)
- References (L201-L207)
- Related Rules (L208-L211)
- Related Skills (L212-L218)
Available Resources
📚 references/ - Detailed documentation
Quick Start
1. Apply JaCoCo Plugin
plugins {
id 'jacoco'
}
jacoco {
toolVersion = "0.8.14"
}
2. Configure Report Task
jacocoTestReport {
dependsOn test
reports {
xml.required = true // For SonarQube
html.required = true // For local viewing
}
}
test {
finalizedBy jacocoTestReport
}
3. Run Coverage
./gradlew test jacocoTestReport
# Report at: build/reports/jacoco/test/html/index.html
Coverage Thresholds
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
minimum = 0.80 // 80% minimum coverage
}
}
rule {
element = 'CLASS'
excludes = ['*.generated.*', '*.config.*']
limit {
counter = 'LINE'
minimum = 0.70
}
}
}
}
check.dependsOn jacocoTestCoverageVerification
Exclusions
Common patterns to exclude from coverage:
jacocoTestReport {
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'**/generated/**',
'**/config/**',
'**/*Config.class',
'**/*Properties.class',
'**/Application.class'
])
}))
}
}
Multi-Module Aggregation
For aggregated reports across modules, use the modern jacoco-report-aggregation plugin (Gradle 7.4+):
// In root build.gradle
plugins {
id 'base'
id 'jacoco-report-aggregation'
}
// Ensure subprojects are evaluated first
subprojects.each { evaluationDependsOn(it.path) }
dependencies {
subprojects.each { jacocoAggregation it }
}
reporting {
reports {
testCodeCoverageReport(JacocoCoverageReport) {
testType = TestSuiteType.UNIT_TEST
}
}
}
For older Gradle versions, use a manual task with defensive filtering:
// In root build.gradle (Gradle < 7.4)
task jacocoRootReport(type: JacocoReport) {
dependsOn subprojects*.test
// Use defensive filtering to avoid missing-directory errors
def srcDirs = files(subprojects*.sourceSets*.main*.allSource*.srcDirs).filter { it.exists() }
def classDirs = files(subprojects*.sourceSets*.main*.output).filter { it.exists() }
def execData = files(subprojects*.jacocoTestReport*.executionData).filter { it.exists() }
additionalSourceDirs.from(srcDirs)
sourceDirectories.from(srcDirs)
classDirectories.from(classDirs)
executionData.from(execData)
reports {
xml.required = true
html.required = true
}
}
SonarQube Integration
sonar {
properties {
property 'sonar.coverage.jacoco.xmlReportPaths',
"${projectDir}/build/reports/jacoco/test/jacocoTestReport.xml"
}
}
References
| Reference | Description |
|---|---|
| references/exclusion-patterns.md | Common exclusion patterns |
| references/multi-module.md | Multi-module aggregation |
Related Rules
-
.cursor/rules/java-jacoco-coverage.mdc- Full JaCoCo reference
Related Skills
| Skill | Purpose |
|---|---|
| java-testing | Test configuration |
| sonarqube-integration | SonarQube setup |
| gradle-standards | Gradle configuration |
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-28
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!