Add remote_java_repository macro.
diff --git a/toolchains/BUILD b/toolchains/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/toolchains/BUILD
diff --git a/toolchains/remote_java_repository.bzl b/toolchains/remote_java_repository.bzl
new file mode 100644
index 0000000..050903c
--- /dev/null
+++ b/toolchains/remote_java_repository.bzl
@@ -0,0 +1,88 @@
+# Copyright 2020 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Rules for importing and registering JDKs from http archive.
+
+Rule remote_java_repository imports and registers JDK with the toolchain resolution.
+"""
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+def _toolchain_config_impl(ctx):
+    ctx.file("WORKSPACE", "workspace(name = \"{name}\")\n".format(name = ctx.name))
+    ctx.file("BUILD.bazel", ctx.attr.build_file)
+
+_toolchain_config = repository_rule(
+    local = True,
+    implementation = _toolchain_config_impl,
+    attrs = {
+        "build_file": attr.string(),
+    },
+)
+
+def remote_java_repository(name, version, exec_compatible_with, prefix = "remotejdk", **kwargs):
+    """Imports and registers a JDK from a http archive.
+
+    Toolchain resolution is determined with exec_compatible_with
+    parameter and constrained with --java_runtime_version flag either having value
+    of "version" or "{prefix}_{version}" parameters.
+
+    Args:
+      name: A unique name for this rule.
+      version: Version of the JDK imported.
+      exec_compatible_with: Platform constraints (CPU and OS) for this JDK.
+      prefix: Optional alternative prefix for configuration flag value used to determine this JDK.
+      **kwargs: Refer to http_archive documentation
+    """
+    http_archive(
+        name = name,
+        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        **kwargs
+    )
+    _toolchain_config(
+        name = name + "_toolchain_config_repo",
+        build_file = """
+config_setting(
+    name = "prefix_version_setting",
+    values = {{"java_runtime_version": "{prefix}_{version}"}},
+    visibility = ["//visibility:private"],
+)
+config_setting(
+    name = "version_setting",
+    values = {{"java_runtime_version": "{version}"}},
+    visibility = ["//visibility:private"],
+)
+alias(
+    name = "version_or_prefix_version_setting",
+    actual = select({{
+        ":version_setting": ":version_setting",
+        "//conditions:default": ":prefix_version_setting",
+    }}),
+    visibility = ["//visibility:private"],
+)
+toolchain(
+    name = "toolchain",
+    exec_compatible_with = {exec_compatible_with},
+    target_settings = [":version_or_prefix_version_setting"],
+    toolchain_type = "@bazel_tools//tools/jdk:runtime_toolchain_type",
+    toolchain = "{toolchain}",
+)
+""".format(
+            prefix = prefix,
+            version = version,
+            exec_compatible_with = exec_compatible_with,
+            toolchain = "@{repo}//:jdk".format(repo = name),
+        ),
+    )
+    native.register_toolchains("@" + name + "_toolchain_config_repo//:toolchain")