Check local version detection result Copybara Import from https://github.com/bazelbuild/rules_java/pull/171 BEGIN_PUBLIC Check local version detection result (#171) In case the local Java version detection fails, e.g. due to a corrupt installation, skip further processing, as it results in a type error. Closes #170 Closes #171 END_PUBLIC COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/rules_java/pull/171 from bertschneider:fix_local_version_detection 6943c45156edcd521aec87b5080c3cfc8c40f1e5 PiperOrigin-RevId: 607694805 Change-Id: Ib8005f6d40e15034f168121cdee8cebcc4a029f2
diff --git a/toolchains/local_java_repository.bzl b/toolchains/local_java_repository.bzl index a49dde2..0a68f19 100644 --- a/toolchains/local_java_repository.bzl +++ b/toolchains/local_java_repository.bzl
@@ -191,12 +191,17 @@ if not java_bin.exists: # Java binary does not exist + message = ("Cannot find Java binary {java_binary} in {java_home}; either correct your JAVA_HOME, " + + "PATH or specify Java from remote repository (e.g. " + + "--java_runtime_version=remotejdk_11)") repository_ctx.file( "BUILD.bazel", - _NOJDK_BUILD_TPL.format( + _AUTO_CONFIG_ERROR_BUILD_TPL.format( local_jdk = local_java_runtime_name, - java_binary = _with_os_extension(repository_ctx, "bin/java"), - java_home = java_home, + message = repr(message.format( + java_binary = _with_os_extension(repository_ctx, "bin/java"), + java_home = java_home, + )), ), False, ) @@ -204,6 +209,21 @@ # Detect version version = repository_ctx.attr.version if repository_ctx.attr.version != "" else _detect_java_version(repository_ctx, java_bin) + if version == None: + # Java version could not be detected + message = "Cannot detect Java version of {java_binary} in {java_home}; make sure it points to a valid Java executable" + repository_ctx.file( + "BUILD.bazel", + _AUTO_CONFIG_ERROR_BUILD_TPL.format( + local_jdk = local_java_runtime_name, + message = repr(message.format( + java_binary = _with_os_extension(repository_ctx, "bin/java"), + java_home = java_home, + )), + ), + False, + ) + return # Prepare BUILD file using "local_java_runtime" macro if repository_ctx.attr.build_file_content and repository_ctx.attr.build_file: @@ -239,14 +259,12 @@ for file in repository_ctx.path(java_home).readdir(): repository_ctx.symlink(file, file.basename) -# Build file template, when JDK does not exist -_NOJDK_BUILD_TPL = '''load("@rules_java//toolchains:fail_rule.bzl", "fail_rule") +# Build file template, when JDK could not be detected +_AUTO_CONFIG_ERROR_BUILD_TPL = '''load("@rules_java//toolchains:fail_rule.bzl", "fail_rule") fail_rule( name = "jdk", header = "Auto-Configuration Error:", - message = ("Cannot find Java binary {java_binary} in {java_home}; either correct your JAVA_HOME, " + - "PATH or specify Java from remote repository (e.g. " + - "--java_runtime_version=remotejdk_11)") + message = {message}, ) config_setting( name = "localjdk_setting",