Run the bootclasspath through ijar (#324)

This reduces disk space and cache usage and should speed up Turbine actions.

```
ls -lah bazel-out/darwin_arm64-fastbuild/bin/external/rules_java+/toolchains/platformclasspath*.jar
-r-xr-xr-x@ 1 fmeum    24M Sep 25 11:36 bazel-out/darwin_arm64-fastbuild/bin/external/rules_java+/toolchains/platformclasspath.jar
-r-xr-xr-x@ 1 fmeum   133M Sep 25 11:36 bazel-out/darwin_arm64-fastbuild/bin/external/rules_java+/toolchains/platformclasspath_unstripped.jar
```

Closes #324

COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/rules_java/pull/324 from fmeum:ijar-bootclasspath 25b0af0de4cc8464f6fc24dd3fd46475e65bdc1e
PiperOrigin-RevId: 816643474
Change-Id: I27082108be70825ca691c17a0d1eedc7342ad064
diff --git a/test/toolchains/bootclasspath_tests.bzl b/test/toolchains/bootclasspath_tests.bzl
index 5eb436a..e7ad1ca 100644
--- a/test/toolchains/bootclasspath_tests.bzl
+++ b/test/toolchains/bootclasspath_tests.bzl
@@ -13,6 +13,9 @@
 
 def _test_utf_8_environment_impl(env, target):
     for action in target.actions:
+        if action.mnemonic == "Ijar":
+            # ijar isn't sensitive to locales
+            continue
         env_subject = env.expect.where(action = action).that_dict(action.env)
         env_subject.keys().contains("LC_CTYPE")
         env_subject.get("LC_CTYPE", factory = subjects.str).contains("UTF-8")
diff --git a/toolchains/bootclasspath.bzl b/toolchains/bootclasspath.bzl
index d89aa17..5b4187c 100644
--- a/toolchains/bootclasspath.bzl
+++ b/toolchains/bootclasspath.bzl
@@ -101,6 +101,21 @@
     ],
 )
 
+def _run_ijar(*, actions, label, ijar, input, output):
+    args = actions.args()
+    args.add(input)
+    args.add(output)
+    args.add("--target_label", label)
+    actions.run(
+        inputs = [input],
+        outputs = [output],
+        executable = ijar,
+        arguments = [args],
+        progress_message = "Extracting interfaces from %{input}",
+        execution_requirements = _SUPPORTS_PATH_MAPPING,
+        mnemonic = "Ijar",
+    )
+
 _JAVA_BOOTSTRAP_RUNTIME_TOOLCHAIN_TYPE = Label("@bazel_tools//tools/jdk:bootstrap_runtime_toolchain_type")
 
 # Opt the Java bootstrap actions into path mapping:
@@ -138,7 +153,7 @@
         use_default_shell_env = True,
     )
 
-    bootclasspath = ctx.outputs.output_jar
+    unstripped_bootclasspath = ctx.actions.declare_file("%s_unstripped.jar" % ctx.label.name)
 
     args = ctx.actions.args()
     args.add("-XX:+IgnoreUnrecognizedVMOptions")
@@ -148,7 +163,7 @@
     args.add("--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED")
     args.add_all("-cp", [class_dir], expand_directories = False)
     args.add("DumpPlatformClassPath")
-    args.add(bootclasspath)
+    args.add(unstripped_bootclasspath)
 
     if ctx.attr.language_version_bootstrap_runtime:
         # The attribute is subject to a split transition.
@@ -201,12 +216,22 @@
         executable = str(exec_javabase.java_executable_exec_path),
         mnemonic = "JavaToolchainCompileBootClasspath",
         inputs = inputs,
-        outputs = [bootclasspath],
+        outputs = [unstripped_bootclasspath],
         arguments = [args],
         env = env,
         execution_requirements = _SUPPORTS_PATH_MAPPING,
         use_default_shell_env = True,
     )
+
+    bootclasspath = ctx.outputs.output_jar
+    _run_ijar(
+        actions = ctx.actions,
+        label = ctx.label,
+        ijar = ctx.executable._ijar,
+        input = unstripped_bootclasspath,
+        output = bootclasspath,
+    )
+
     return [
         DefaultInfo(files = depset([bootclasspath])),
         java_common.BootClassPathInfo(
@@ -234,6 +259,11 @@
         "_allowlist_function_transition": attr.label(
             default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
         ),
+        "_ijar": attr.label(
+            default = "//toolchains:ijar",
+            cfg = "exec",
+            executable = True,
+        ),
         "_utf8_environment": attr.label(
             default = ":utf8_environment",
             cfg = "exec",