Merge pull request #39 from comius:fix-java_toolchain-4.1.0

PiperOrigin-RevId: 353593184
Change-Id: I5df36089f4e99e43554065539afebf670cbdb7e6
diff --git a/BUILD b/BUILD
index f59256b..b87a792 100644
--- a/BUILD
+++ b/BUILD
@@ -7,8 +7,8 @@
     srcs = [
         "BUILD",
         "LICENSE",
-    ] + glob([
-        "*.bzl",
-    ]),
+        "//java:srcs",
+        "//toolchains:srcs",
+    ],
     visibility = ["@//distro:__pkg__"],
 )
diff --git a/distro/BUILD b/distro/BUILD
index 475697a..71352e8 100644
--- a/distro/BUILD
+++ b/distro/BUILD
@@ -9,10 +9,7 @@
 # Build the artifact to put on the github release page.
 pkg_tar(
     name = "rules_java-%s" % version,
-    srcs = [
-        "//:distribution",
-        "//java:distribution",
-    ],
+    srcs = ["//:distribution"],
     extension = "tar.gz",
     # It is all source code, so make it read-only.
     mode = "0444",
diff --git a/java/BUILD b/java/BUILD
index abf9526..103b99a 100644
--- a/java/BUILD
+++ b/java/BUILD
@@ -2,15 +2,12 @@
 
 licenses(["notice"])
 
-# TODO(aiuto): Find a way to strip this rule from the distribution tarball.
 filegroup(
-    name = "distribution",
+    name = "srcs",
     srcs = glob([
         "**",
     ]) + [
         "//java/constraints:srcs",
     ],
-    visibility = [
-        "@//distro:__pkg__",
-    ],
+    visibility = ["@//:__pkg__"],
 )
diff --git a/java/defs.bzl b/java/defs.bzl
index 5ea8c19..4c179a5 100644
--- a/java/defs.bzl
+++ b/java/defs.bzl
@@ -15,7 +15,7 @@
 
 _MIGRATION_TAG = "__JAVA_RULES_MIGRATION_DO_NOT_USE_WILL_BREAK__"
 
-version = "4.0.0"
+version = "4.1.0"
 
 def _add_tags(attrs):
     if "tags" in attrs and attrs["tags"] != None:
diff --git a/java/repositories.bzl b/java/repositories.bzl
index 9beaf20..c093fe9 100644
--- a/java/repositories.bzl
+++ b/java/repositories.bzl
@@ -25,6 +25,7 @@
 
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
+load("//toolchains:remote_java_repository.bzl", "remote_java_repository")
 
 def java_tools_javac11_repos():
     maybe(
@@ -64,48 +65,64 @@
     https://mirror.bazel.build/openjdk/azul-zulu-8.50.0.51-ca-jdk8.0.275/zsrc8.50.0.53-ca-fx-jdk8.0.275.zip
     """
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk8_linux_aarch64",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:aarch64",
+        ],
         sha256 = "f4072e82faa5a09fab2accf2892d4684324fc999d614583c3ff785e87c03963f",
         strip_prefix = "zulu8.50.51.263-ca-jdk8.0.275-linux_aarch64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-8.50.0.51-ca-jdk8.0.275/zulu8.50.51.263-ca-jdk8.0.275-linux_aarch64.tar.gz",
             "https://cdn.azul.com/zulu-embedded/bin/zulu8.50.51.263-ca-jdk8.0.275-linux_aarch64.tar.gz",
         ],
+        version = "8",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk8_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "1db6b2fa642950ee1b4b1ec2b6bc8a9113d7a4cd723f79398e1ada7dab1c981c",
         strip_prefix = "zulu8.50.0.51-ca-jdk8.0.275-linux_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-8.50.0.51-ca-jdk8.0.275/zulu8.50.0.51-ca-jdk8.0.275-linux_x64.tar.gz",
             "https://cdn.azul.com/zulu/bin/zulu8.50.0.51-ca-jdk8.0.275-linux_x64.tar.gz",
         ],
+        version = "8",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk8_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "b03176597734299c9a15b7c2cc770783cf14d121196196c1248e80c026b59c17",
         strip_prefix = "zulu8.50.0.51-ca-jdk8.0.275-macosx_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-8.50.0.51-ca-jdk8.0.275/zulu8.50.0.51-ca-jdk8.0.275-macosx_x64.tar.gz",
             "https://cdn.azul.com/zulu/bin/zulu8.50.0.51-ca-jdk8.0.275-macosx_x64.tar.gz",
         ],
+        version = "8",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk8_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "49759b2bd2ab28231a21ff3a3bb45824ddef55d89b5b1a05a62e26a365da0774",
         strip_prefix = "zulu8.50.0.51-ca-jdk8.0.275-win_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-8.50.0.51-ca-jdk8.0.275/zulu8.50.0.51-ca-jdk8.0.275-win_x64.zip",
             "https://cdn.azul.com/zulu/bin/zulu8.50.0.51-ca-jdk8.0.275-win_x64.zip",
         ],
+        version = "8",
     )
 
 def remote_jdk9_repos():
@@ -117,9 +134,12 @@
     https://mirror.bazel.build/openjdk/azul-zulu-9.0.7.1-jdk9.0.7/zsrc9.0.7.1-jdk9.0.7.zip
     """
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk9_linux_aarch64",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:aarch64",
+        ],
         sha256 = "72e7843902b0395e2d30e1e9ad2a5f05f36a4bc62529828bcbc698d54aec6022",
         strip_prefix = "jdk9-server-release-1708",
         urls = [
@@ -127,35 +147,48 @@
             "https://mirror.bazel.build/openjdk.linaro.org/releases/jdk9-server-release-170bazel_skylib8.tar.xz",
             "http://openjdk.linaro.org/releases/jdk9-server-release-1708.tar.xz",
         ],
+        version = "9",
     )
 
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk9_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "45f2dfbee93b91b1468cf81d843fc6d9a47fef1f831c0b7ceff4f1eb6e6851c8",
         strip_prefix = "zulu9.0.7.1-jdk9.0.7-linux_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-9.0.7.1-jdk9.0.7/zulu9.0.7.1-jdk9.0.7-linux_x64.tar.gz",
         ],
+        version = "9",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk9_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         strip_prefix = "zulu9.0.7.1-jdk9.0.7-macosx_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-9.0.7.1-jdk9.0.7/zulu9.0.7.1-jdk9.0.7-macosx_x64.tar.gz",
         ],
+        version = "9",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk9_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         strip_prefix = "zulu9.0.7.1-jdk9.0.7-win_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu-9.0.7.1-jdk9.0.7/zulu9.0.7.1-jdk9.0.7-win_x64.zip",
         ],
+        version = "9",
     )
 
 def remote_jdk10_repos():
@@ -168,9 +201,12 @@
     """
 
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk10_linux_aarch64",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:aarch64",
+        ],
         sha256 = "b7098b7aaf6ee1ffd4a2d0371a0be26c5a5c87f6aebbe46fe9a92c90583a84be",
         strip_prefix = "jdk10-server-release-1804",
         urls = [
@@ -178,36 +214,49 @@
             "https://mirror.bazel.build/openjdk.linaro.org/releases/jdk10-server-release-1804.tar.xz",
             "http://openjdk.linaro.org/releases/jdk10-server-release-1804.tar.xz",
         ],
+        version = "10",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk10_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "b3c2d762091a615b0c1424ebbd05d75cc114da3bf4f25a0dec5c51ea7e84146f",
         strip_prefix = "zulu10.2+3-jdk10.0.1-linux_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu10.2+3-jdk10.0.1/zulu10.2+3-jdk10.0.1-linux_x64.tar.gz",
         ],
+        version = "10",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk10_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "7394d5f41804cfbdb47c609879c4e738bf53358484ea0995076190915b94c702",
         strip_prefix = "zulu10.2+3-jdk10.0.1-macosx_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu10.2+3-jdk10.0.1/zulu10.2+3-jdk10.0.1-macosx_x64.tar.gz",
         ],
+        version = "10",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk10_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "fd9456b53dab8b9f504ed0f0e2f6305bd0815978d0e02a41643d111290bf940c",
         strip_prefix = "zulu10.2+3-jdk10.0.1-win_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu10.2+3-jdk10.0.1/zulu10.2+3-jdk10.0.1-win_x64.zip",
         ],
+        version = "10",
     )
 
 def remote_jdk11_repos():
@@ -220,67 +269,90 @@
     """
 
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk11_linux_aarch64",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
         sha256 = "a452f1b9682d9f83c1c14e54d1446e1c51b5173a3a05dcb013d380f9508562e4",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:aarch64",
+        ],
         strip_prefix = "zulu11.37.48-ca-jdk11.0.6-linux_aarch64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu11.37.48-ca-jdk11.0.6/zulu11.37.48-ca-jdk11.0.6-linux_aarch64.tar.gz",
         ],
+        version = "11",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk11_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
         sha256 = "360626cc19063bc411bfed2914301b908a8f77a7919aaea007a977fa8fb3cde1",
-        strip_prefix = "zulu11.37.17-ca-jdk11.0.6-linux_x64",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-linux_x64.tar.gz",
         ],
+        version = "11",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk11_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
         sha256 = "e1fe56769f32e2aaac95e0a8f86b5a323da5af3a3b4bba73f3086391a6cc056f",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         strip_prefix = "zulu11.37.17-ca-jdk11.0.6-macosx_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-macosx_x64.tar.gz",
         ],
+        version = "11",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk11_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
         sha256 = "a9695617b8374bfa171f166951214965b1d1d08f43218db9a2a780b71c665c18",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         strip_prefix = "zulu11.37.17-ca-jdk11.0.6-win_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64.zip",
         ],
+        version = "11",
     )
 
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk11_linux_ppc64le",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:ppc",
+        ],
         sha256 = "a417db0295b1f4b538ecbaf7c774f3a177fab9657a665940170936c0eca4e71a",
         strip_prefix = "jdk-11.0.7+10",
         urls = [
             "https://mirror.bazel.build/openjdk/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.7+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.7_10.tar.gz",
             "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.7+10/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.7_10.tar.gz",
         ],
+        version = "11",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk11_linux_s390x",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:s390x",
+        ],
         sha256 = "d9b72e87a1d3ebc0c9552f72ae5eb150fffc0298a7cb841f1ce7bfc70dcd1059",
         strip_prefix = "jdk-11.0.7+10",
         urls = [
             "https://mirror.bazel.build/github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.7+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.7_10.tar.gz",
             "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.7+10/OpenJDK11U-jdk_s390x_linux_hotspot_11.0.7_10.tar.gz",
         ],
+        version = "11",
     )
 
 def remote_jdk12_repos():
@@ -290,99 +362,135 @@
     https://mirror.bazel.build/openjdk/azul-zulu12.2.3-ca-jdk12.0.1/zsrc12.2.3-jdk12.0.1.zip
     """
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk12_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "529c99841d69e11a85aea967ccfb9d0fd40b98c5b68dbe1d059002655e0a9c13",
         strip_prefix = "zulu12.2.3-ca-jdk12.0.1-linux_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu12.2.3-ca-jdk12.0.1/zulu12.2.3-ca-jdk12.0.1-linux_x64.tar.gz",
         ],
+        version = "12",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk12_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "67ca9d285056132ebb19fa237a14affda52132142e1171fe1c20e18974b3b8a5",
         strip_prefix = "zulu12.2.3-ca-jdk12.0.1-macosx_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu12.2.3-ca-jdk12.0.1/zulu12.2.3-ca-jdk12.0.1-macosx_x64.tar.gz",
         ],
+        version = "12",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk12_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "cf28404c23c3aa1115363ba6e796c30580a768e1d7d6681a7d053e516008e00d",
         strip_prefix = "zulu12.2.3-ca-jdk12.0.1-win_x64",
         urls = [
             "https://mirror.bazel.build/openjdk/azul-zulu12.2.3-ca-jdk12.0.1/zulu12.2.3-ca-jdk12.0.1-win_x64.zip",
         ],
+        version = "12",
     )
 
 def remote_jdk14_repos():
     """Imports OpenJDK 14 repositories."""
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk14_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "48bb8947034cd079ad1ef83335e7634db4b12a26743a0dc314b6b861480777aa",
         strip_prefix = "zulu14.28.21-ca-jdk14.0.1-linux_x64",
         urls = [
             "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-linux_x64.tar.gz",
         ],
+        version = "14",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk14_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "088bd4d0890acc9f032b738283bf0f26b2a55c50b02d1c8a12c451d8ddf080dd",
         strip_prefix = "zulu14.28.21-ca-jdk14.0.1-macosx_x64",
         urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-macosx_x64.tar.gz"],
+        version = "14",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk14_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "9cb078b5026a900d61239c866161f0d9558ec759aa15c5b4c7e905370e868284",
         strip_prefix = "zulu14.28.21-ca-jdk14.0.1-win_x64",
         urls = ["https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu14.28.21-ca-jdk14.0.1-win_x64.zip"],
+        version = "14",
     )
 
 def remote_jdk15_repos():
     """Imports OpenJDK 15 repositories."""
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk15_linux",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:linux",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "0a38f1138c15a4f243b75eb82f8ef40855afcc402e3c2a6de97ce8235011b1ad",
         strip_prefix = "zulu15.27.17-ca-jdk15.0.0-linux_x64",
         urls = [
             "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-linux_x64.tar.gz",
             "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-linux_x64.tar.gz",
         ],
+        version = "15",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk15_macos",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:macos",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "f80b2e0512d9d8a92be24497334c974bfecc8c898fc215ce0e76594f00437482",
         strip_prefix = "zulu15.27.17-ca-jdk15.0.0-macosx_x64",
         urls = [
             "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-macosx_x64.tar.gz",
             "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-macosx_x64.tar.gz",
         ],
+        version = "15",
     )
     maybe(
-        http_archive,
+        remote_java_repository,
         name = "remote_jdk15_windows",
-        build_file = "@bazel_tools//tools/jdk:jdk.BUILD",
+        exec_compatible_with = [
+            "@platforms//os:windows",
+            "@platforms//cpu:x86_64",
+        ],
         sha256 = "f535a530151e6c20de8a3078057e332b08887cb3ba1a4735717357e72765cad6",
         strip_prefix = "zulu15.27.17-ca-jdk15.0.0-win_x64",
         urls = [
             "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-win_x64.zip",
             "https://cdn.azul.com/zulu/bin/zulu15.27.17-ca-jdk15.0.0-win_x64.zip",
         ],
+        version = "15",
     )
 
 def bazel_skylib():
diff --git a/toolchains/BUILD b/toolchains/BUILD
new file mode 100644
index 0000000..67d2c89
--- /dev/null
+++ b/toolchains/BUILD
@@ -0,0 +1,9 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+    visibility = ["@//:__pkg__"],
+)
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")