Deprecate top-level Java toolchain flags in favour of java_toolchain

This change disables --java_langtools, --javabuilder_top, --singlejar_top,
--genclass_top, and --ijar_top, and finishes replacing them with
java_toolchain.{javac,javabuilder,singlejar,genclass,ijar}.

RELNOTES: Replace --java_langtools, --javabuilder_top, --singlejar_top,
--genclass_top, and --ijar_top with
java_toolchain.{javac,javabuilder,singlejar,genclass,ijar}

--
MOS_MIGRATED_REVID=120154954
diff --git a/scripts/bootstrap/bootstrap.sh b/scripts/bootstrap/bootstrap.sh
index 2fea800..1394b62 100755
--- a/scripts/bootstrap/bootstrap.sh
+++ b/scripts/bootstrap/bootstrap.sh
@@ -30,10 +30,7 @@
 
 : ${JAVA_VERSION:="1.8"}
 
-: ${BAZEL_ARGS:=--singlejar_top=//src/java_tools/singlejar:bootstrap_deploy.jar \
-      --javabuilder_top=//src/java_tools/buildjar:bootstrap_deploy.jar \
-      --genclass_top=//src/java_tools/buildjar:bootstrap_genclass_deploy.jar \
-      --ijar_top=//third_party/ijar \
+: ${BAZEL_ARGS:=--java_toolchain=//src/java_tools/buildjar:bootstrap_toolchain \
       --strategy=Javac=worker --worker_quit_after_build \
       --genrule_strategy=standalone --spawn_strategy=standalone \
       "${EXTRA_BAZEL_ARGS:-}"}
diff --git a/site/docs/bazel-user-manual.html b/site/docs/bazel-user-manual.html
index 0fb1fa2..2f24233 100644
--- a/site/docs/bazel-user-manual.html
+++ b/site/docs/bazel-user-manual.html
@@ -686,8 +686,7 @@
     <code class='flag'>--compiler</code>,
     <code class='flag'>--thin_archives</code>,
     <code class='flag'>--use_ijars</code>,
-    <code class='flag'>--java_langtools</code>,
-    <code class='flag'>--javabuilder_top</code>.
+    <code class='flag'>--java_toolchain</code>,
     If <code class='flag'>--host_crosstool_top</code> is used, then the value of
     <code class='flag'>--host_cpu</code> is used to look up a
     <code>default_toolchain</code> in the Crosstool
@@ -1714,18 +1713,12 @@
   glibc version, and target CPU are allowed.
 </p>
 
-<h4 id='flag--javabuilder_top'><code class='flag'>--javabuilder_top <var>label</var></code></h4>
+<h4 id='flag--java_toolchain'><code class='flag'>--java_toolchain <var>label</var></code></h4>
 <p>
-  This option specifies the label of the JavaBuilder used to compile Java
+  This option specifies the label of the java_toolchain used to compile Java
   source files.
 </p>
 
-<h4 id='flag--java_langtools'><code class='flag'>--java_langtools <var>label</var></code></h4>
-<p>
-  This option specifies the label of the Java langtools jar (used by
-  Java compilation tools, for example JavaBuilder).
-</p>
-
 <h4 id='flag--javabase'><code class='flag'>--javabase (<var>path</var>|<var>label</var>)</code></h4>
 <p>
   This options set the label or the path of the base Java installation to use
@@ -1739,26 +1732,8 @@
 <p>
   This does not select the Java compiler that is used to compile Java
   source files. The compiler can be selected by settings the
-  <a href="#flag--java_langtools"><code class='flag'>--java_langtools</code></a>
-  and the
-  <a href="#flag--javabuilder_top"><code class='flag'>--javabuilder_top</code></a>
-  options.
-</p>
-
-<h4 id='flag--javac_bootclasspath'><code class='flag'>--javac_bootclasspath <var>label</var></code></h4>
-<p>
-  This option specifies the label of the bootstrap classes that Java code
-  should be compiled against. This option should always be set together with
-  <a href="#flag--javac_extdir"><code class='flag'>--javac_extdir</code></a>
-  when cross-compiling to a different Java platform version.
-</p>
-
-<h4 id='flag--javac_extdir'><code class='flag'>--javac_extdir <var>label</var></code></h4>
-<p>
-  This option specifies the label of the extension classes that Java code
-  should be compiled against. This option should always be set together with
-  <a href="#flag--javac_bootclasspath"><code class='flag'>--javac_bootclasspath</code></a>
-  when cross-compiling to a different Java platform version.
+  <a href="#flag--java_toolchain"><code class='flag'>--java_toolchain</code></a>
+  option.
 </p>
 
 <h3 id='strategy-options'>Build strategy options</h3>
diff --git a/src/java_tools/buildjar/BUILD b/src/java_tools/buildjar/BUILD
index 4871bfc..f7f53a7 100644
--- a/src/java_tools/buildjar/BUILD
+++ b/src/java_tools/buildjar/BUILD
@@ -36,3 +36,19 @@
     ],
     visibility = ["//src:__pkg__"],
 )
+
+java_toolchain(
+    name = "bootstrap_toolchain",
+    bootclasspath = ["//tools/jdk:bootclasspath"],
+    encoding = "UTF-8",
+    extclasspath = ["//tools/jdk:extdir"],
+    genclass = ["bootstrap_genclass_deploy.jar"],
+    ijar = ["//third_party/ijar"],
+    javabuilder = ["bootstrap_deploy.jar"],
+    javac = ["//third_party/java/jdk/langtools:javac_jar"],
+    jvm_opts = ["-client"],
+    singlejar = ["//src/java_tools/singlejar:bootstrap_deploy.jar"],
+    source_version = "8",
+    target_version = "8",
+    visibility = ["//visibility:public"],
+)
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
index c724c95..c9c6b24 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
@@ -96,7 +96,7 @@
         "//third_party:jsr305-jars",
         "//third_party/protobuf:protobuf-jars",
     ],
-    neverlink_jars = ["//tools/defaults:java_langtools"],
+    neverlink_jars = ["//third_party/java/jdk/langtools:javac_jar"],
     srcjars = [
         "//src/main/protobuf:deps_java_proto_srcjar",
         "//src/main/protobuf:worker_protocol_java_proto_srcjar",
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index fdae707..ecf9acf 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -986,7 +986,7 @@
 bootstrap_java_library(
     name = "shell-skylark",
     srcs = glob(["shell/*.java"]),
-    jars = ["//third_party:guava"],
+    jars = ["//third_party:guava-jars"],
 )
 
 ########################################################################
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
index 96f9a1c..c0b5bfc 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
@@ -94,15 +94,12 @@
     JavaOptions javaOptions = options.getOptions(JavaOptions.class);
     ImmutableList.Builder<String> labelsToLoad = new ImmutableList.Builder<String>()
         .addAll(options.getResidue());
-    if (String.valueOf(javaOptions.javaLangtoolsJar).equals(
-        runtime.getRuleClassProvider().getToolsRepository() + JavaOptions.DEFAULT_LANGTOOLS)) {
-      labelsToLoad.add(javaOptions.javaBase);
-    } else {
-      // TODO(kchodroow): Remove this when OS X isn't as hacky about finding the JVM. Our test
-      // framework currently doesn't set up the JDK normally on OS X, so attempting to fetch
-      // tools/jdk:jdk will cause errors.
-      labelsToLoad.add(String.valueOf(javaOptions.javaToolchain));
-    }
+
+    // TODO(kchodorow): Remove this when OS X isn't as hacky about finding the JVM. Our test
+    // framework currently doesn't set up the JDK normally on OS X, so attempting to fetch
+    // tools/jdk:jdk will cause errors.
+    labelsToLoad.add(String.valueOf(javaOptions.javaToolchain));
+
     String query = Joiner.on(" union ").join(labelsToLoad.build());
     query = "deps(" + query + ")";
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
index 0cfe2bd..f88bff8 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
@@ -74,7 +74,6 @@
     @Override
     public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
       return builder
-          .add(attr("$ijar", LABEL).cfg(HOST).exec().value(env.getLabel("//tools/defaults:ijar")))
           .add(
               attr(":java_toolchain", LABEL)
                   .allowedRuleClasses("java_toolchain")
@@ -102,18 +101,6 @@
       return builder
           .add(attr(":jvm", LABEL).cfg(HOST).value(JavaSemantics.JVM))
           .add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.HOST_JDK))
-          .add(attr("$javac_extdir", LABEL).cfg(HOST)
-              .value(env.getLabel(JavaSemantics.JAVAC_EXTDIR_LABEL)))
-          .add(attr("$java_langtools", LABEL).cfg(HOST)
-              .value(env.getLabel("//tools/defaults:java_langtools")))
-          .add(attr("$javac_bootclasspath", LABEL).cfg(HOST)
-              .value(env.getLabel(JavaSemantics.JAVAC_BOOTCLASSPATH_LABEL)))
-          .add(attr("$javabuilder", LABEL).cfg(HOST)
-              .value(env.getLabel(JavaSemantics.JAVABUILDER_LABEL)))
-          .add(attr("$singlejar", LABEL).cfg(HOST)
-              .value(env.getLabel(JavaSemantics.SINGLEJAR_LABEL)))
-          .add(attr("$genclass", LABEL).cfg(HOST)
-              .value(env.getLabel(JavaSemantics.GENCLASS_LABEL)))
           .add(attr("$jacoco_instrumentation", LABEL).cfg(HOST))
           .build();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 159f00d..e3e10c7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -370,10 +370,6 @@
               attr(":java_toolchain", LABEL)
                   .allowedRuleClasses("java_toolchain")
                   .value(JavaSemantics.JAVA_TOOLCHAIN))
-          .add(
-              attr("$javac_bootclasspath", LABEL)
-                  .cfg(HOST)
-                  .value(environment.getLabel(JavaSemantics.JAVAC_BOOTCLASSPATH_LABEL)))
           .build();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BaseJavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/BaseJavaCompilationHelper.java
index ea59767..6bc5bc9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BaseJavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BaseJavaCompilationHelper.java
@@ -57,33 +57,6 @@
     return AnalysisUtils.getMiddlemanFor(ruleContext, ":host_jdk" + implicitAttributesSuffix);
   }
 
-  /** Returns the langtools jar Artifact. */
-  protected final Artifact getLangtoolsJar() {
-    Artifact javac = javaToolchain.getJavac();
-    if (javac != null) {
-      return javac;
-    }
-    return ruleContext.getHostPrerequisiteArtifact("$java_langtools" + implicitAttributesSuffix);
-  }
-
-  /** Returns the JavaBuilder jar Artifact. */
-  protected final Artifact getJavaBuilderJar() {
-    Artifact javaBuilder = javaToolchain.getJavaBuilder();
-    if (javaBuilder != null) {
-      return javaBuilder;
-    }
-    return ruleContext.getPrerequisiteArtifact(
-        "$javabuilder" + implicitAttributesSuffix, Mode.HOST);
-  }
-
-  protected FilesToRunProvider getIJar() {
-    FilesToRunProvider ijar = javaToolchain.getIjar();
-    if (ijar != null) {
-      return ijar;
-    }
-    return ruleContext.getExecutablePrerequisite("$ijar" + implicitAttributesSuffix, Mode.HOST);
-  }
-
   /**
    * Returns the instrumentation jar in the given semantics.
    */
@@ -105,12 +78,7 @@
       RuleContext ruleContext,
       JavaToolchainProvider javaToolchain,
       String implicitAttributesSuffix) {
-    NestedSet<Artifact> toolchainBootclasspath = javaToolchain.getBootclasspath();
-    if (toolchainBootclasspath != null) {
-      return ImmutableList.copyOf(toolchainBootclasspath);
-    }
-    return ruleContext.getPrerequisiteArtifacts(
-        "$javac_bootclasspath" + implicitAttributesSuffix, Mode.HOST).list();
+    return ImmutableList.copyOf(javaToolchain.getBootclasspath());
   }
 
   /**
@@ -124,12 +92,7 @@
    * Returns the extdir artifacts.
    */
   protected final ImmutableList<Artifact> getExtdirInputs() {
-    NestedSet<Artifact> toolchainExtclasspath = javaToolchain.getExtclasspath();
-    if (toolchainExtclasspath != null) {
-      return ImmutableList.copyOf(toolchainExtclasspath);
-    }
-    return ruleContext.getPrerequisiteArtifacts(
-        "$javac_extdir" + implicitAttributesSuffix, Mode.HOST).list();
+    return ImmutableList.copyOf(javaToolchain.getExtclasspath());
   }
 
   private Artifact getIjarArtifact(Artifact jar, boolean addPrefix) {
@@ -155,7 +118,7 @@
    */
   protected Artifact createIjarAction(Artifact inputJar, boolean addPrefix) {
     Artifact interfaceJar = getIjarArtifact(inputJar, addPrefix);
-    FilesToRunProvider ijarTarget = getIJar();
+    FilesToRunProvider ijarTarget = javaToolchain.getIjar();
     if (!ruleContext.hasErrors()) {
       ruleContext.registerAction(new SpawnAction.Builder()
           .addInput(inputJar)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index 8791145..45377b1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -134,8 +134,8 @@
     builder.addClasspathResources(attributes.getClassPathResources());
     builder.setBootclasspathEntries(getBootclasspathOrDefault());
     builder.setExtdirInputs(getExtdirInputs());
-    builder.setLangtoolsJar(getLangtoolsJar());
-    builder.setJavaBuilderJar(getJavaBuilderJar());
+    builder.setLangtoolsJar(javaToolchain.getJavac());
+    builder.setJavaBuilderJar(javaToolchain.getJavaBuilder());
     builder.addTranslations(getTranslations());
     builder.setOutputJar(outputJar);
     builder.setManifestProtoOutput(manifestProtoOutput);
@@ -280,7 +280,7 @@
     builder.setRuleKind(attributes.getRuleKind());
     builder.setTargetLabel(attributes.getTargetLabel());
     builder.setJavaBaseInputs(getHostJavabaseInputsNonStatic(ruleContext));
-    builder.setJavacJar(getLangtoolsJar());
+    builder.setJavacJar(javaToolchain.getJavac());
     builder.build();
 
     artifactBuilder.setCompileTimeDependencies(headerDeps);
@@ -418,12 +418,12 @@
     builder.addResources(attributes.getResources());
     builder.addClasspathResources(attributes.getClassPathResources());
     builder.setExtdirInputs(getExtdirInputs());
-    builder.setLangtoolsJar(getLangtoolsJar());
+    builder.setLangtoolsJar(javaToolchain.getJavac());
     builder.addTranslations(getTranslations());
     builder.setCompressJar(true);
     builder.setTempDirectory(tempDir(resourceJar));
     builder.setClassDirectory(classDir(resourceJar));
-    builder.setJavaBuilderJar(getJavaBuilderJar());
+    builder.setJavaBuilderJar(javaToolchain.getJavaBuilder());
     builder.setJavacOpts(getDefaultJavacOptsFromRule(getRuleContext()));
     builder.setJavacJvmOpts(javaToolchain.getJavacJvmOptions());
     getAnalysisEnvironment().registerAction(builder.build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
index 151542a..8036b9c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
@@ -126,8 +126,6 @@
 
   private final ImmutableList<String> commandLineJavacFlags;
   private final Label javaLauncherLabel;
-  private final Label javaBuilderTop;
-  private final Label javaLangtoolsJar;
   private final boolean useIjars;
   private final boolean useHeaderCompilation;
   private final boolean generateJavaDeps;
@@ -136,8 +134,6 @@
   private final ImmutableList<String> defaultJvmFlags;
   private final ImmutableList<String> checkedConstraints;
   private final StrictDepsMode strictJavaDeps;
-  private final Label javacBootclasspath;
-  private final Label javacExtdir;
   private final ImmutableList<String> javacOpts;
   private final Label proguardBinary;
   private final ImmutableList<Label> extraProguardSpecs;
@@ -156,8 +152,6 @@
     this.commandLineJavacFlags =
         ImmutableList.copyOf(JavaHelper.tokenizeJavaOptions(javaOptions.javacOpts));
     this.javaLauncherLabel = javaOptions.javaLauncher;
-    this.javaBuilderTop = javaOptions.javaBuilderTop;
-    this.javaLangtoolsJar = javaOptions.javaLangtoolsJar;
     this.useIjars = javaOptions.useIjars;
     this.useHeaderCompilation = javaOptions.headerCompilation;
     this.generateJavaDeps = generateJavaDeps;
@@ -166,8 +160,6 @@
     this.defaultJvmFlags = ImmutableList.copyOf(defaultJvmFlags);
     this.checkedConstraints = ImmutableList.copyOf(javaOptions.checkedConstraints);
     this.strictJavaDeps = javaOptions.strictJavaDeps;
-    this.javacBootclasspath = javaOptions.javacBootclasspath;
-    this.javacExtdir = javaOptions.javacExtdir;
     this.javacOpts = ImmutableList.copyOf(javaOptions.javacOpts);
     this.proguardBinary = javaOptions.proguard;
     this.extraProguardSpecs = ImmutableList.copyOf(javaOptions.extraProguardSpecs);
@@ -213,20 +205,6 @@
   }
 
   /**
-   * Returns the default javabuilder jar
-   */
-  public Label getDefaultJavaBuilderJar() {
-    return javaBuilderTop;
-  }
-
-  /**
-   * Returns the default java langtools jar
-   */
-  public Label getDefaultJavaLangtoolsJar() {
-    return javaLangtoolsJar;
-  }
-
-  /**
    * Returns true iff Java compilation should use ijars.
    */
   public boolean getUseIjars() {
@@ -286,14 +264,6 @@
     return javaLauncherLabel;
   }
 
-  public Label getJavacBootclasspath() {
-    return javacBootclasspath;
-  }
-
-  public Label getJavacExtdir() {
-    return javacExtdir;
-  }
-
   public ImmutableList<String> getJavacOpts() {
     return javacOpts;
   }
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 430ce24..a23f0b4 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
@@ -41,7 +41,6 @@
  * Command-line options for building Java targets
  */
 public class JavaOptions extends FragmentOptions {
-  public static final String DEFAULT_LANGTOOLS = "//tools/jdk:langtools";
 
   /**
    * Converter for the --javawarn option.
@@ -223,54 +222,61 @@
           + "targets as dependencies.")
   public StrictDepsMode strictJavaDeps;
 
-  @Option(name = "javabuilder_top",
-      defaultValue = "@bazel_tools//tools/jdk:JavaBuilder_deploy.jar",
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the filegroup that contains the JavaBuilder jar.")
-  public Label javaBuilderTop;
+  @Option(
+    name = "javabuilder_top",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String javaBuilderTop;
 
-  @Option(name = "singlejar_top",
-      defaultValue = "@bazel_tools//tools/jdk:SingleJar_deploy.jar",
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the filegroup that contains the SingleJar jar.")
-  public Label singleJarTop;
+  @Option(
+    name = "singlejar_top",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String singleJarTop;
 
-  @Option(name = "genclass_top",
-      defaultValue = "@bazel_tools//tools/jdk:GenClass_deploy.jar",
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the filegroup that contains the GenClass jar.")
-  public Label genClassTop;
+  @Option(
+    name = "genclass_top",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String genClassTop;
 
-  @Option(name = "ijar_top",
-      defaultValue = "@bazel_tools//tools/jdk:ijar",
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the filegroup that contains the ijar binary.")
-  public Label iJarTop;
+  @Option(
+    name = "ijar_top",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String iJarTop;
 
-  @Option(name = "java_langtools",
-      defaultValue = "@bazel_tools" + DEFAULT_LANGTOOLS,
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the rule that produces the Java langtools jar.")
-  public Label javaLangtoolsJar;
+  @Option(
+    name = "java_langtools",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String javaLangtoolsJar;
 
-  @Option(name = "javac_bootclasspath",
-      defaultValue = "@bazel_tools//tools/jdk:bootclasspath",
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the rule that produces the bootclasspath jars for javac to use.")
-  public Label javacBootclasspath;
+  @Option(
+    name = "javac_bootclasspath",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String javacBootclasspath;
 
-  @Option(name = "javac_extdir",
-      defaultValue = "@bazel_tools//tools/jdk:extdir",
-      category = "version",
-      converter = LabelConverter.class,
-      help = "Label of the rule that produces the extdir for javac to use.")
-  public Label javacExtdir;
+  @Option(
+    name = "javac_extdir",
+    defaultValue = "null",
+    category = "undocumented",
+    help = "No-op. Kept here for backwards compatibility."
+  )
+  public String javacExtdir;
 
   @Option(name = "java_launcher",
       defaultValue = "null",
@@ -345,16 +351,8 @@
     host.jvmOpts = ImmutableList.of("-client", "-XX:ErrorFile=/dev/stderr");
 
     host.javacOpts = javacOpts;
-    host.javaLangtoolsJar = javaLangtoolsJar;
-    host.javacExtdir = javacExtdir;
-    host.headerCompilation = headerCompilation;
-    host.javaBuilderTop = javaBuilderTop;
     // TODO(cushon): switch to hostJavaToolchain after cl/118829419 makes a blaze release
     host.javaToolchain = javaToolchain;
-    host.singleJarTop = singleJarTop;
-    host.genClassTop = genClassTop;
-    host.iJarTop = iJarTop;
-    host.javacBootclasspath = javacBootclasspath;
 
     // Java builds often contain complicated code generators for which
     // incremental build performance is important.
@@ -373,10 +371,6 @@
     if (javaLauncher != null) {
       labelMap.put("java_launcher", javaLauncher);
     }
-    labelMap.put("javabuilder", javaBuilderTop);
-    labelMap.put("singlejar", singleJarTop);
-    labelMap.put("genclass", genClassTop);
-    labelMap.put("ijar", iJarTop);
     labelMap.put("java_toolchain", javaToolchain);
     labelMap.putAll("translation", getTranslationLabels());
   }
@@ -388,13 +382,6 @@
     DefaultsPackage.parseAndAdd(jdkLabels, hostJavaBase);
     Map<String, Set<Label>> result = new HashMap<>();
     result.put("JDK", jdkLabels);
-    result.put("JAVA_LANGTOOLS", ImmutableSet.of(javaLangtoolsJar));
-    result.put("JAVAC_BOOTCLASSPATH", ImmutableSet.of(javacBootclasspath));
-    result.put("JAVAC_EXTDIR", ImmutableSet.of(javacExtdir));
-    result.put("JAVABUILDER", ImmutableSet.of(javaBuilderTop));
-    result.put("SINGLEJAR", ImmutableSet.of(singleJarTop));
-    result.put("GENCLASS", ImmutableSet.of(genClassTop));
-    result.put("IJAR", ImmutableSet.of(iJarTop));
     result.put("JAVA_TOOLCHAIN", ImmutableSet.of(javaToolchain));
 
     return result;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index cd54d70..12ef7dd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -111,32 +111,6 @@
       OutputGroupProvider.HIDDEN_OUTPUT_GROUP_PREFIX + "gen_jars";
 
   /**
-   * Label of a pseudo-filegroup that contains the boot-classpath entries.
-   */
-  String JAVAC_BOOTCLASSPATH_LABEL = "//tools/defaults:javac_bootclasspath";
-
-  /**
-   * Label of the javac extdir used for compiling Java source code.
-   */
-  String JAVAC_EXTDIR_LABEL = "//tools/defaults:javac_extdir";
-
-  /**
-   * Label of the JavaBuilder JAR used for compiling Java source code.
-   */
-  String JAVABUILDER_LABEL = "//tools/defaults:javabuilder";
-
-  /**
-   * Label of the SingleJar JAR used for creating deploy jars.
-   */
-  String SINGLEJAR_LABEL = "//tools/defaults:singlejar";
-
-  /**
-   * Label of the GenClass JAR used for creating the jar for classes from sources generated from
-   * annotation processors.
-   */
-  String GENCLASS_LABEL = "//tools/defaults:genclass";
-
-  /**
    * Label of pseudo-cc_binary that tells Blaze a java target's JAVABIN is never to be replaced by
    * the contents of --java_launcher; only the JDK's launcher will ever be used.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
index e9eaf7e..651ba7e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
@@ -52,7 +52,7 @@
     Artifact headerCompiler = getArtifact("header_compiler", ruleContext);
     Artifact singleJar = getArtifact("singlejar", ruleContext);
     Artifact genClass = getArtifact("genclass", ruleContext);
-    FilesToRunProvider ijar = getExecutable("ijar", ruleContext);
+    FilesToRunProvider ijar = ruleContext.getExecutablePrerequisite("ijar", Mode.HOST);
     // TODO(cushon): clean up nulls once migration from --javac_bootclasspath and --javac_extdir
     // is complete, and java_toolchain.{bootclasspath,extclasspath} are mandatory
     final JavaToolchainData toolchainData =
@@ -91,14 +91,6 @@
     return artifacts != null ? Artifact.toExecPaths(artifacts) : null;
   }
 
-  private FilesToRunProvider getExecutable(String attributeName, RuleContext ruleContext) {
-    TransitiveInfoCollection prerequisite = ruleContext.getPrerequisite(attributeName, Mode.HOST);
-    if (prerequisite == null) {
-      return null;
-    }
-    return prerequisite.getProvider(FilesToRunProvider.class);
-  }
-
   private Artifact getArtifact(String attributeName, RuleContext ruleContext) {
     TransitiveInfoCollection prerequisite = ruleContext.getPrerequisite(attributeName, Mode.HOST);
     if (prerequisite == null) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index 20b8796..2ac21a7 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -88,8 +88,20 @@
     config.create(
         "/bazel_tools_workspace/tools/jdk/BUILD",
         "package(default_visibility=['//visibility:public'])",
-        "java_toolchain(name = 'toolchain', encoding = 'UTF-8', source_version = '8', ",
-        "  target_version = '8')",
+        "java_toolchain(",
+        "  name = 'toolchain',",
+        "  encoding = 'UTF-8',",
+        "  source_version = '8',",
+        "  target_version = '8',",
+        "  bootclasspath = [':bootclasspath'],",
+        "  extclasspath = [':extclasspath'],",
+        "  javac = [':langtools'],",
+        "  javabuilder = ['JavaBuilder_deploy.jar'],",
+        "  header_compiler = ['turbine_deploy.jar'],",
+        "  singlejar = ['SingleJar_deploy.jar'],",
+        "  genclass = ['GenClass_deploy.jar'],",
+        "  ijar = ['ijar'],",
+        ")",
         "filegroup(name = 'jdk-null')",
         "filegroup(name = 'jdk-default', srcs = [':java'], path = 'jdk/jre')",
         "filegroup(name = 'jdk', srcs = [':jdk-default', ':jdk-null'])",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index d475322..beec598 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -71,6 +71,8 @@
         "  outs = ['d.txt'])",
         "java_library(name = 'jl',",
         "  srcs = ['a.java'])",
+        "android_library(name = 'androidlib',",
+        "  srcs = ['a.java'])",
         "java_import(name = 'asr',",
         "  jars = [ 'asr.jar' ],",
         "  srcjar = 'asr-src.jar',",
@@ -604,26 +606,26 @@
 
   @Test
   public void testGetExecutablePrerequisite() throws Exception {
-    SkylarkRuleContext ruleContext = createRuleContext("//foo:jl");
-    Object result = evalRuleContextCode(ruleContext, "ruleContext.executable._ijar");
-    assertEquals("ijar", ((Artifact) result).getFilename());
+    SkylarkRuleContext ruleContext = createRuleContext("//foo:androidlib");
+    Object result = evalRuleContextCode(ruleContext, "ruleContext.executable._jarjar_bin");
+    assertEquals("jarjar_bin", ((Artifact) result).getFilename());
   }
 
   @Test
   public void testCreateSpawnActionArgumentsWithExecutableFilesToRunProvider() throws Exception {
-    SkylarkRuleContext ruleContext = createRuleContext("//foo:jl");
+    SkylarkRuleContext ruleContext = createRuleContext("//foo:androidlib");
     evalRuleContextCode(
         ruleContext,
         "ruleContext.action(\n"
             + "  inputs = ruleContext.files.srcs,\n"
             + "  outputs = ruleContext.files.srcs,\n"
             + "  arguments = ['--a','--b'],\n"
-            + "  executable = ruleContext.executable._ijar)\n");
+            + "  executable = ruleContext.executable._jarjar_bin)\n");
     SpawnAction action =
         (SpawnAction)
             Iterables.getOnlyElement(
                 ruleContext.getRuleContext().getAnalysisEnvironment().getRegisteredActions());
-    assertThat(action.getCommandFilename()).endsWith("/ijar");
+    assertThat(action.getCommandFilename()).endsWith("/jarjar_bin");
   }
 
   @Test
diff --git a/src/test/shell/bazel/BUILD b/src/test/shell/bazel/BUILD
index 2e66d24..2762c98 100644
--- a/src/test/shell/bazel/BUILD
+++ b/src/test/shell/bazel/BUILD
@@ -3,7 +3,7 @@
 genrule(
     name = "langtools-copy",
     testonly = 1,
-    srcs = ["//tools/defaults:java_langtools"],
+    srcs = ["//third_party/java/jdk/langtools:javac_jar"],
     outs = ["langtools.jar"],
     cmd = "cp $< $@",
 )
diff --git a/src/test/shell/bazel/testenv.sh b/src/test/shell/bazel/testenv.sh
index 0b0054b..82b7203 100755
--- a/src/test/shell/bazel/testenv.sh
+++ b/src/test/shell/bazel/testenv.sh
@@ -38,7 +38,7 @@
 # Tools directory location
 tools_dir="${TEST_SRCDIR}/tools"
 langtools_dir="${TEST_SRCDIR}/third_party/java/jdk/langtools"
-EXTRA_BAZELRC="build --java_langtools=//tools/jdk:test-langtools --ios_sdk_version=8.4"
+EXTRA_BAZELRC="build --ios_sdk_version=8.4"
 
 # Java tooling
 javabuilder_path="${TEST_SRCDIR}/src/java_tools/buildjar/JavaBuilder_deploy.jar"
diff --git a/tools/jdk/BUILD b/tools/jdk/BUILD
index 50feeb0..5e5fc19 100644
--- a/tools/jdk/BUILD
+++ b/tools/jdk/BUILD
@@ -96,8 +96,15 @@
 
 java_toolchain(
     name = "toolchain",
+    bootclasspath = [":bootclasspath"],
     encoding = "UTF-8",
+    extclasspath = [":extdir"],
+    genclass = ["//tools/jdk:GenClass_deploy.jar"],
+    ijar = ["@bazel_tools//tools/jdk:ijar"],
+    javabuilder = ["//tools/jdk:JavaBuilder_deploy.jar"],
+    javac = ["//third_party/java/jdk/langtools:javac_jar"],
     jvm_opts = ["-client"],
+    singlejar = ["//tools/jdk:SingleJar_deploy.jar"],
     source_version = "8",
     target_version = "8",
 )