Add a module extension for registering local/remote jdks (#312)
Closes #312
COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/rules_java/pull/312 from bazelbuild:hvd_java_repos_module_ext d11e12e2eda5b3cfb5e1075d03f095ef5ebe3871
PiperOrigin-RevId: 796756819
Change-Id: I7d672490bcb47e64c6dbb2f5138d261bee9fa52d
diff --git a/java/extensions.bzl b/java/extensions.bzl
index f456f3f..ad7978b 100644
--- a/java/extensions.bzl
+++ b/java/extensions.bzl
@@ -23,6 +23,7 @@
"remote_jdk21_repos",
"remote_jdk8_repos",
)
+load("//toolchains:extensions.bzl", _java_repository = "java_repository")
def _toolchains_impl(module_ctx):
java_tools_repos()
@@ -38,3 +39,5 @@
return None
toolchains = module_extension(_toolchains_impl)
+
+java_repository = _java_repository
diff --git a/test/repo/BUILD.bazel b/test/repo/BUILD.bazel
index ca41439..b0fb612 100644
--- a/test/repo/BUILD.bazel
+++ b/test/repo/BUILD.bazel
@@ -53,4 +53,9 @@
name = "my_funky_toolchain",
bootclasspath = ["@bazel_tools//tools/jdk:platformclasspath"],
configuration = NONPREBUILT_TOOLCHAIN_CONFIGURATION,
+ exec_compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:x86_64",
+ ],
+ java_runtime = "@my_funky_jdk//:jdk",
)
diff --git a/test/repo/MODULE.bazel b/test/repo/MODULE.bazel
index 1faec90..6210933 100644
--- a/test/repo/MODULE.bazel
+++ b/test/repo/MODULE.bazel
@@ -49,6 +49,25 @@
"remotejdk21_win",
)
+custom_jdk = use_extension("@rules_java//java:extensions.bzl", "java_repository")
+custom_jdk.remote(
+ name = "my_funky_jdk",
+ prefix = "funky",
+ strip_prefix = "zulu24.32.13-ca-jdk24.0.2-linux_x64",
+ target_compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:x86_64",
+ ],
+ urls = [
+ "https://cdn.azul.com/zulu/bin/zulu24.32.13-ca-jdk24.0.2-linux_x64.tar.gz",
+ ],
+ version = "24",
+)
+use_repo(custom_jdk, "my_funky_jdk", "my_funky_jdk_toolchain_config_repo")
+
+register_toolchains("@my_funky_jdk_toolchain_config_repo//:all")
+
register_toolchains("//:all")
bazel_dep(name = "rules_shell", version = "0.4.0", dev_dependency = True)
+bazel_dep(name = "platforms", version = "0.0.11", dev_dependency = True)
diff --git a/test/repo/WORKSPACE b/test/repo/WORKSPACE
index c272975..a6055e2 100644
--- a/test/repo/WORKSPACE
+++ b/test/repo/WORKSPACE
@@ -47,3 +47,21 @@
rules_shell_dependencies()
rules_shell_toolchains()
+
+load("@rules_java//toolchains:remote_java_repository.bzl", "remote_java_repository")
+
+remote_java_repository(
+ name = "my_funky_jdk",
+ prefix = "funky",
+ strip_prefix = "zulu24.32.13-ca-jdk24.0.2-linux_x64",
+ target_compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:x86_64",
+ ],
+ urls = [
+ "https://cdn.azul.com/zulu/bin/zulu24.32.13-ca-jdk24.0.2-linux_x64.tar.gz",
+ ],
+ version = "24",
+)
+
+register_toolchains("@my_funky_jdk_toolchain_config_repo//:all")
diff --git a/toolchains/extensions.bzl b/toolchains/extensions.bzl
new file mode 100644
index 0000000..330c707
--- /dev/null
+++ b/toolchains/extensions.bzl
@@ -0,0 +1,59 @@
+"""Module extensions for local and remote java repositories"""
+
+load(":local_java_repository.bzl", "local_java_repository")
+load(":remote_java_repository.bzl", "remote_java_repository")
+
+visibility(["//java"])
+
+def _java_repository_impl(mctx):
+ for mod in mctx.modules:
+ if not mod.is_root:
+ fail(
+ """This module extension may only be used in the root module. {name}
+ must set `dev_dependency` = True on it's usage of this extension,
+ if {name} can be dependency of other modules.""".format(name = mod.name),
+ )
+ for local in mod.tags.local:
+ local_java_repository(
+ local.name,
+ java_home = local.java_home,
+ version = local.version,
+ build_file = local.build_file,
+ build_file_content = local.build_file_content,
+ )
+ for remote in mod.tags.remote:
+ remote_java_repository(
+ remote.name,
+ remote.version,
+ target_compatible_with = remote.target_compatible_with,
+ prefix = remote.prefix,
+ sha256 = remote.sha256,
+ strip_prefix = remote.strip_prefix,
+ urls = remote.urls,
+ )
+
+_local = tag_class(attrs = {
+ "name": attr.string(mandatory = True),
+ "build_file": attr.label(default = None),
+ "build_file_content": attr.string(default = ""),
+ "java_home": attr.string(default = ""),
+ "version": attr.string(default = ""),
+})
+
+_remote = tag_class(attrs = {
+ "name": attr.string(mandatory = True),
+ "version": attr.string(mandatory = True),
+ "urls": attr.string_list(mandatory = True),
+ "prefix": attr.string(default = ""),
+ "sha256": attr.string(default = ""),
+ "strip_prefix": attr.string(default = ""),
+ "target_compatible_with": attr.string_list(default = []),
+})
+
+java_repository = module_extension(
+ _java_repository_impl,
+ tag_classes = {
+ "local": _local,
+ "remote": _remote,
+ },
+)