Remove support for --javabase=<absolute path>.

If an absolute javabase is desired, the following set of rules can be used:

java_runtime_suite(name="suite", default=":runtime")
java_runtime(name="runtime", java_home=<path to the JDK>)

Then --javabase can be pointed to the java_runtime_suite() rule.

Alternatively, the java_runtime rule can reference a Make variable:

java_runtime(name="runtime", java_home="$(ABSOLUTE_JAVABASE)")

Then the Javabase can be specified on the command line like this:

--javabase=<your package>:suite --define=ABSOLUTE_JAVABASE=<path to the JDK>

RELNOTES[INC]: --javabase=<absolute path> and --host_javabase=<absolute path>
are not supported anymore. If you need this functionality java_runtime_suite(name="suite", default=":runtime") java_runtime(name="runtime", java_home=<path to the JDK>) is an alternative.

PiperOrigin-RevId: 171798416
diff --git a/scripts/bootstrap/bootstrap.sh b/scripts/bootstrap/bootstrap.sh
index eeac8d1..3f8ba74 100755
--- a/scripts/bootstrap/bootstrap.sh
+++ b/scripts/bootstrap/bootstrap.sh
@@ -58,7 +58,6 @@
     shift
     run_bazel_jar $command \
         ${_BAZEL_ARGS} --verbose_failures \
-        "--javabase=${JAVA_HOME}" "--host_javabase=${JAVA_HOME}" \
         --javacopt="-g -source ${JAVA_VERSION} -target ${JAVA_VERSION}" "${@}"
   }
 else
@@ -67,7 +66,6 @@
     shift
     ${BAZEL} --bazelrc=${BAZELRC} ${BAZEL_DIR_STARTUP_OPTIONS} $command \
         ${_BAZEL_ARGS} --verbose_failures \
-        "--javabase=${JAVA_HOME}" "--host_javabase=${JAVA_HOME}" \
         --javacopt="-g -source ${JAVA_VERSION} -target ${JAVA_VERSION}" "${@}"
   }
 fi
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index bed8b35..b32e243 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -531,12 +531,14 @@
       javaRuntime = javabaseTarget.get(JavaRuntimeInfo.PROVIDER);
       builder.addTransitiveArtifacts(javaRuntime.javaBaseInputs());
 
-      // Add symlinks to the C++ runtime libraries under a path that can be built
-      // into the Java binary without having to embed the crosstool, gcc, and grte
-      // version information contained within the libraries' package paths.
-      for (Artifact lib : dynamicRuntimeActionInputs) {
-        PathFragment path = CPP_RUNTIMES.getRelative(lib.getExecPath().getBaseName());
-        builder.addSymlink(path, lib);
+      if (!javaRuntime.javaHome().isAbsolute()) {
+        // Add symlinks to the C++ runtime libraries under a path that can be built
+        // into the Java binary without having to embed the crosstool, gcc, and grte
+        // version information contained within the libraries' package paths.
+        for (Artifact lib : dynamicRuntimeActionInputs) {
+          PathFragment path = CPP_RUNTIMES.getRelative(lib.getExecPath().getBaseName());
+          builder.addSymlink(path, lib);
+        }
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
index dfc01bd..21b9ef4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
@@ -21,7 +21,6 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelMapConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsConverter;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
-import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode;
@@ -34,7 +33,6 @@
 import com.google.devtools.common.options.OptionMetadataTag;
 import com.google.devtools.common.options.TriState;
 import java.util.HashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -72,6 +70,7 @@
     name = "javabase",
     defaultValue = "@bazel_tools//tools/jdk:jdk",
     category = "version",
+    converter = LabelConverter.class,
     documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
     effectTags = {OptionEffectTag.UNKNOWN},
     help =
@@ -79,7 +78,7 @@
             + "java_runtime_suite which will be used to execute "
             + "external Java commands."
   )
-  public String javaBase;
+  public Label javaBase;
 
   @Option(
     name = "java_toolchain",
@@ -106,6 +105,7 @@
   @Option(
     name = "host_javabase",
     defaultValue = "@bazel_tools//tools/jdk:jdk",
+    converter = LabelConverter.class,
     category = "version",
     documentationCategory = OptionDocumentationCategory.UNCATEGORIZED,
     effectTags = {OptionEffectTag.UNKNOWN},
@@ -113,7 +113,7 @@
         "JAVABASE used for the host JDK. This is the java_runtime_suite which is used to execute "
             + "tools during a build."
   )
-  public String hostJavaBase;
+  public Label hostJavaBase;
 
   @Option(
     name = "javacopt",
@@ -519,15 +519,6 @@
   public boolean jplPropagateCcLinkParamsStore;
 
   @Option(
-      name = "experimental_disable_absolute_javabase",
-      defaultValue = "false",
-      documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
-      effectTags = {OptionEffectTag.AFFECTS_OUTPUTS, OptionEffectTag.LOADING_AND_ANALYSIS},
-      metadataTags = {OptionMetadataTag.INCOMPATIBLE_CHANGE}
-  )
-  public boolean disableAbsoluteJavabase;
-
-  @Option(
       name = "experimental_enable_jvm_configuration_make_variables",
       defaultValue = "true",
       documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
@@ -559,7 +550,6 @@
   public FragmentOptions getHost() {
     JavaOptions host = (JavaOptions) getDefault();
 
-    host.disableAbsoluteJavabase = disableAbsoluteJavabase;
     host.javaBase = hostJavaBase;
     host.jvmOpts = ImmutableList.of("-XX:ErrorFile=/dev/stderr");
 
@@ -589,11 +579,8 @@
 
   @Override
   public Map<String, Set<Label>> getDefaultsLabels(BuildConfiguration.Options commonOptions) {
-    Set<Label> jdkLabels = new LinkedHashSet<>();
-    DefaultsPackage.parseAndAdd(jdkLabels, javaBase);
-    DefaultsPackage.parseAndAdd(jdkLabels, hostJavaBase);
     Map<String, Set<Label>> result = new HashMap<>();
-    result.put("JDK", jdkLabels);
+    result.put("JDK", ImmutableSet.of(javaBase, hostJavaBase));
     result.put("JAVA_TOOLCHAIN", ImmutableSet.of(javaToolchain));
 
     return result;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
index a43088c..b2d00e8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
@@ -24,7 +24,6 @@
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.NoSuchPackageException;
@@ -57,20 +56,11 @@
       // TODO(bazel-team): Instead of returning null here, add another method to the interface.
       return null;
     }
-    String javaHome = javaOptions.javaBase;
+
     String cpu = buildOptions.get(BuildConfiguration.Options.class).cpu;
 
-    try {
-      return createFromJavaRuntimeSuite(env, javaHome, cpu, javaOptions.enableMakeVariables);
-    } catch (LabelSyntaxException e) {
-      // Try again with legacy
-    }
-
-    if (javaOptions.disableAbsoluteJavabase) {
-      throw new InvalidConfigurationException("Absolute --javabase is disabled");
-    }
-
-    return createFromAbsoluteJavabase(javaHome, javaOptions.enableMakeVariables);
+    return createFromJavaRuntimeSuite(env, javaOptions.javaBase, cpu,
+        javaOptions.enableMakeVariables);
   }
 
   @Override
@@ -85,15 +75,14 @@
 
   @Nullable
   private static Jvm createFromJavaRuntimeSuite(
-      ConfigurationEnvironment lookup, String javaHome, String cpu, boolean enableMakeVariables)
-      throws InvalidConfigurationException, LabelSyntaxException, InterruptedException {
+      ConfigurationEnvironment lookup, Label javaBase, String cpu, boolean enableMakeVariables)
+      throws InvalidConfigurationException, InterruptedException {
     try {
-      Label label = Label.parseAbsolute(javaHome);
-      label = RedirectChaser.followRedirects(lookup, label, "jdk");
-      if (label == null) {
+      javaBase = RedirectChaser.followRedirects(lookup, javaBase, "jdk");
+      if (javaBase == null) {
         return null;
       }
-      Target javaHomeTarget = lookup.getTarget(label);
+      Target javaHomeTarget = lookup.getTarget(javaBase);
       if (javaHomeTarget instanceof Rule) {
         if (!((Rule) javaHomeTarget).getRuleClass().equals("java_runtime_suite")) {
           throw new InvalidConfigurationException(
@@ -104,7 +93,7 @@
         return createFromRuntimeSuite(lookup, (Rule) javaHomeTarget, cpu, enableMakeVariables);
       }
       throw new InvalidConfigurationException(
-          "No JVM target found under " + javaHome + " that would work for " + cpu);
+          "No JVM target found under " + javaBase + " that would work for " + cpu);
     } catch (NoSuchThingException e) {
       lookup.getEventHandler().handle(Event.error(e.getMessage()));
       throw new InvalidConfigurationException(e.getMessage(), e);
diff --git a/src/test/shell/integration/java_integration_test.sh b/src/test/shell/integration/java_integration_test.sh
index 82e0bb3..984eca7 100755
--- a/src/test/shell/integration/java_integration_test.sh
+++ b/src/test/shell/integration/java_integration_test.sh
@@ -251,9 +251,17 @@
     local -r javabase="${BAZEL_RUNFILES}/${runfiles_relative_javabase}"
   fi
 
+  mkdir -p "$pkg/jvm"
+  cat > "$pkg/jvm/BUILD" <<EOF
+package(default_visibility=["//visibility:public"])
+java_runtime_suite(name='suite', default=':runtime')
+java_runtime(name='runtime', java_home='$javabase')
+EOF
+
+
   # Set javabase to an absolute path.
   bazel build //$pkg/java/hello:hello //$pkg/java/hello:hello_deploy.jar \
-      "$stamp_arg" --javabase="$javabase" "$embed_label" >&"$TEST_log" \
+      "$stamp_arg" --javabase="//$pkg/jvm:suite" "$embed_label" >&"$TEST_log" \
       || fail "Build failed"
 
   mkdir $pkg/ugly/ || fail "mkdir failed"