Fix path mapping logic in `bootclasspath` for generated files Copybara Import from https://github.com/bazelbuild/rules_java/pull/195 BEGIN_PUBLIC Fix path mapping logic in `bootclasspath` for generated files (#195) If the files comprising the Java runtime are not source files, the path to the Java home needs to be path mapped. Work towards bazelbuild/bazel#22366 Closes #195 END_PUBLIC COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/rules_java/pull/195 from fmeum:java-home-path-map 43323b73d0f1bfc5ee24de64c2a9037746780879 PiperOrigin-RevId: 648662342 Change-Id: Idba93798982878d3f542b54d69c9536efd721db2
diff --git a/toolchains/default_java_toolchain.bzl b/toolchains/default_java_toolchain.bzl index 020b101..b3d4d28 100644 --- a/toolchains/default_java_toolchain.bzl +++ b/toolchains/default_java_toolchain.bzl
@@ -214,6 +214,9 @@ # https://github.com/bazelbuild/bazel/commit/a239ea84832f18ee8706682145e9595e71b39680 _SUPPORTS_PATH_MAPPING = {"supports-path-mapping": "1"} +def _java_home(java_executable): + return java_executable.dirname[:-len("/bin")] + def _bootclasspath_impl(ctx): exec_javabase = ctx.attr.java_runtime_alias[java_common.JavaRuntimeInfo] @@ -252,10 +255,18 @@ args.add(bootclasspath) any_javabase = ctx.toolchains[_JAVA_BOOTSTRAP_RUNTIME_TOOLCHAIN_TYPE].java_runtime - args.add(any_javabase.java_home) + any_javabase_files = any_javabase.files.to_list() + + # If possible, add the Java executable to the command line as a File so that it can be path + # mapped. + java_executable = [f for f in any_javabase_files if f.path == any_javabase.java_executable_exec_path] + if len(java_executable) == 1: + args.add_all(java_executable, map_each = _java_home) + else: + args.add(any_javabase.java_home) system_files = ("release", "modules", "jrt-fs.jar") - system = [f for f in any_javabase.files.to_list() if f.basename in system_files] + system = [f for f in any_javabase_files if f.basename in system_files] if len(system) != len(system_files): system = None