Add incompatible flags for using the remote Java tools for the default java_toolchain and host_java_toolchain.

This PR introduces the flags:
* `--incompatible_use_remote_host_java_toolchain`
*  `--incompatible_use_remote_java_toolchain`

Progress on #6316 #7196 #7197

Closes #7156.

PiperOrigin-RevId: 230209934
diff --git a/tools/jdk/default_java_toolchain.bzl b/tools/jdk/default_java_toolchain.bzl
index 1197a57..c6a546b 100644
--- a/tools/jdk/default_java_toolchain.bzl
+++ b/tools/jdk/default_java_toolchain.bzl
@@ -18,6 +18,10 @@
     "-Xbootclasspath/p:$(location @bazel_tools//third_party/java/jdk/langtools:javac_jar)",
 ]
 
+JDK8_JVM_OPTS_REMOTE_JAVAC = [
+    "-Xbootclasspath/p:$(location @bazel_tools//tools/jdk:remote-javac_jar)",
+]
+
 JDK9_JVM_OPTS = [
     # In JDK9 we have seen a ~30% slow down in JavaBuilder performance when using
     # G1 collector and having compact strings enabled.
@@ -44,6 +48,32 @@
     "--add-opens=java.base/java.lang=ALL-UNNAMED",
 ]
 
+JDK9_REMOTE_JVM_OPTS = [
+    # In JDK9 we have seen a ~30% slow down in JavaBuilder performance when using
+    # G1 collector and having compact strings enabled.
+    "-XX:+UseParallelOldGC",
+    "-XX:-CompactStrings",
+    # Allow JavaBuilder to access internal javac APIs.
+    "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+    "--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+    "--add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED",
+    "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+    "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED",
+    "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
+    "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+    "--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
+
+    # override the javac in the JDK.
+    "--patch-module=java.compiler=$(location @bazel_tools//tools/jdk:remote-java_compiler_jar)",
+    "--patch-module=jdk.compiler=$(location @bazel_tools//tools/jdk:remote-jdk_compiler_jar)",
+
+    # quiet warnings from com.google.protobuf.UnsafeUtil,
+    # see: https://github.com/google/protobuf/issues/3781
+    # and: https://github.com/bazelbuild/bazel/issues/5599
+    "--add-opens=java.base/java.nio=ALL-UNNAMED",
+    "--add-opens=java.base/java.lang=ALL-UNNAMED",
+]
+
 DEFAULT_JAVACOPTS = [
     "-XDskipDuplicateBridges=true",
     "-g",
@@ -82,6 +112,37 @@
     "bootclasspath": ["@bazel_tools//tools/jdk:platformclasspath"],
 }
 
+DEFAULT_REMOTE_TOOLCHAIN_CONFIGURATION = {
+    "forcibly_disable_header_compilation": 0,
+    "genclass": ["@bazel_tools//tools/jdk:remote-genclass"],
+    "header_compiler": ["@bazel_tools//tools/jdk:remote-turbine"],
+    "header_compiler_direct": ["@bazel_tools//tools/jdk:remote-turbine_direct"],
+    "ijar": ["@bazel_tools//tools/jdk:ijar"],
+    "javabuilder": ["@bazel_tools//tools/jdk:remote-javabuilder"],
+    "javac": ["@bazel_tools//tools/jdk:remote-javac_jar"],
+    "tools": [
+        "@bazel_tools//tools/jdk:remote-java_compiler_jar",
+        "@bazel_tools//tools/jdk:remote-jdk_compiler_jar",
+    ],
+    "javac_supports_workers": 1,
+    "jvm_opts": JDK9_REMOTE_JVM_OPTS,
+    "misc": DEFAULT_JAVACOPTS,
+    "compatible_javacopts": COMPATIBLE_JAVACOPTS,
+    "singlejar": ["@bazel_tools//tools/jdk:singlejar"],
+    "bootclasspath": ["@bazel_tools//tools/jdk:platformclasspath"],
+}
+
+def default_remote_java_toolchain(name, **kwargs):
+    """Defines a remote java_toolchain with appropriate defaults for Bazel."""
+
+    toolchain_args = dict(DEFAULT_REMOTE_TOOLCHAIN_CONFIGURATION)
+    toolchain_args.update(kwargs)
+
+    native.java_toolchain(
+        name = name,
+        **toolchain_args
+    )
+
 def default_java_toolchain(name, **kwargs):
     """Defines a java_toolchain with appropriate defaults for Bazel."""