THRIFT-5274: Enforce Java 8 compatibility
Client: Java
Patch: Christopher Tubbs

This closes #2325

* Enforce Java 8 compatibility using the new `--release` flag introduced
  in JDK9, so that all generated bytecode follows Java 8 strict
  compatibility, even when building with newer JDK versions (9 or later)
  (this fixes NoSuchMethodError with ByteBuffer, and other potential
  incompatibilities in bytecode generation that would make the code
  unable to run on a Java 8 JRE)
* Also strictly enforce the JDK version used to build the project by
  ensuring it is at least version 1.8, and will fail fast when building
  the Java libraries if this condition is not met.
diff --git a/lib/java/gradle/sourceConfiguration.gradle b/lib/java/gradle/sourceConfiguration.gradle
index 07c2a7f..d15c117 100644
--- a/lib/java/gradle/sourceConfiguration.gradle
+++ b/lib/java/gradle/sourceConfiguration.gradle
@@ -46,6 +46,9 @@
 // ----------------------------------------------------------------------------
 // Compiler configuration details
 
+// These two properties are still needed on JDK8, and possibly used directly by
+// plugins. However, the '--release' option added below makes these two
+// properties redundant when building with JDK9 or later.
 sourceCompatibility = '1.8'
 targetCompatibility = '1.8'
 
@@ -53,6 +56,10 @@
     options.encoding = 'UTF-8'
     options.debug = true
     options.deprecation = true
+    // the following is to build with Java 8 specifications, even when building with JDK9 or later
+    if (JavaVersion.current() > JavaVersion.VERSION_1_8) {
+        options.compilerArgs.addAll(['--release', '8'])
+    }
     // options.compilerArgs.addAll('-Xlint:unchecked')
 }