[build] Add a test coverage report to the Java build

This patch adds a jacoco test coverage report to the Java build.
The report can be generated by running
`./gradlew jacocoAggregatedReport` and looking at
`java/build/reports/jacoco/jacocoAggregatedReport/html/index.html`

A follow on patch will add this coverage run to the build-and-test.sh
“COVERAGE” type build.

Change-Id: I0f2a2b1836b5ade72a757a8d7e2c518858ec48bb
Reviewed-on: http://gerrit.cloudera.org:8080/16954
Tested-by: Kudu Jenkins
Reviewed-by: Alexey Serbin <aserbin@cloudera.com>
diff --git a/java/build.gradle b/java/build.gradle
index 7514176..686a5d5 100755
--- a/java/build.gradle
+++ b/java/build.gradle
@@ -25,6 +25,7 @@
 // Plugins and scripts applied at the root level only, instead of per module.
 apply plugin: "idea"
 apply plugin: "eclipse"
+apply plugin: "org.barfuin.gradle.jacocolog"
 apply from: "$rootDir/gradle/properties.gradle"
 apply from: "$rootDir/gradle/dependencies.gradle"
 apply from: "$rootDir/gradle/wrapper.gradle"
diff --git a/java/buildSrc/build.gradle b/java/buildSrc/build.gradle
index e9d9b7c..840a936 100644
--- a/java/buildSrc/build.gradle
+++ b/java/buildSrc/build.gradle
@@ -30,6 +30,7 @@
 dependencies {
   compile "com.github.ben-manes:gradle-versions-plugin:0.36.0"
   compile "com.github.jengelman.gradle.plugins:shadow:6.1.0"
+  compile "gradle.plugin.org.barfuin.gradle.jacocolog:gradle-jacoco-log:1.2.3"
   compile "gradle.plugin.com.google.gradle:osdetector-gradle-plugin:1.6.2"
   compile "com.google.protobuf:protobuf-gradle-plugin:0.8.14"
   compile "com.netflix.nebula:nebula-clojure-plugin:9.4.3"
diff --git a/java/gradle/dependencies.gradle b/java/gradle/dependencies.gradle
index 911c5e9..10aef8b 100755
--- a/java/gradle/dependencies.gradle
+++ b/java/gradle/dependencies.gradle
@@ -40,6 +40,7 @@
     hdrhistogram   : "2.1.12",
     hive           : "3.1.2",
     httpClient     : "4.5.13",
+    jacoco         : "0.8.6",
     jepsen         : "0.1.5",
     jetty          : "9.4.35.v20201120",
     jmh            : "1.27",
diff --git a/java/gradle/quality.gradle b/java/gradle/quality.gradle
index 69d3759..f4ca7a8 100644
--- a/java/gradle/quality.gradle
+++ b/java/gradle/quality.gradle
@@ -101,6 +101,25 @@
   }
 }
 
+// Don't enable code coverage for kudu-proto given it is exclusively generated code.
+// Don't enable code coverage for kudu-jepsen given it is exclusively test code.
+if (project.name != "kudu-proto" && project.name != "kudu-jepsen") {
+  apply plugin: "jacoco" // Provides code coverage metrics for Java code.
+  jacoco {
+    toolVersion = versions.jacoco
+  }
+  tasks.withType(JacocoReport) {
+    reports {
+      csv.enabled false
+      xml.enabled true
+      html.enabled true
+    }
+  }
+  jacocoTestReport {
+    dependsOn test // tests are required to run before generating the report
+  }
+}
+
 // Define a Java API signature for use by animal-sniffer. It'll enforce that all
 // Java API usage adheres to this signature.
 dependencies {