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 8da333c..6fe894a 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
@@ -284,7 +284,6 @@
     builder.setClasspathEntries(attributes.getCompileTimeClassPath());
     builder.setBootclasspathEntries(getBootclasspathOrDefault());
     builder.setSourcePathEntries(attributes.getSourcePath());
-    builder.setExtdirInputs(getExtdirInputs());
     builder.setToolsJars(javaToolchain.getTools());
     builder.setJavaBuilder(javaToolchain.getJavaBuilder());
     if (!turbineAnnotationProcessing) {
@@ -496,11 +495,7 @@
     builder.setSourceFiles(attributes.getSourceFiles());
     builder.setSourceJars(attributes.getSourceJars());
     builder.setClasspathEntries(attributes.getCompileTimeClassPath());
-    builder.setBootclasspathEntries(
-        NestedSetBuilder.<Artifact>stableOrder()
-            .addTransitive(getBootclasspathOrDefault())
-            .addTransitive(getExtdirInputs())
-            .build());
+    builder.setBootclasspathEntries(getBootclasspathOrDefault());
     // Exclude any per-package configured data (see JavaCommon.computePerPackageData).
     // It is used to allow Error Prone checks to load additional data,
     // and Error Prone doesn't run during header compilation.
@@ -843,11 +838,6 @@
     return javaToolchain.getBootclasspath();
   }
 
-  /** Returns the extdir artifacts. */
-  private final NestedSet<Artifact> getExtdirInputs() {
-    return javaToolchain.getExtclasspath();
-  }
-
   /**
    * Creates the Action that creates ijars from Jar files.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java
index 05e8578..827b373 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java
@@ -158,7 +158,6 @@
   private NestedSet<Artifact> bootclasspathEntries =
       NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
   private ImmutableList<Artifact> sourcePathEntries = ImmutableList.of();
-  private NestedSet<Artifact> extdirInputs = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
   private FilesToRunProvider javaBuilder;
   private NestedSet<Artifact> toolsJars = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
   private PathFragment sourceGenDirectory;
@@ -241,8 +240,7 @@
         .addAll(sourceFiles)
         .addTransitive(javabaseInputs)
         .addTransitive(bootclasspathEntries)
-        .addAll(sourcePathEntries)
-        .addTransitive(extdirInputs);
+        .addAll(sourcePathEntries);
     if (coverageArtifact != null) {
       mandatoryInputs.add(coverageArtifact);
     }
@@ -332,7 +330,6 @@
       result.add("--compress_jar");
     }
     result.addExecPath("--output_deps_proto", outputs.depsProto());
-    result.addExecPaths("--extclasspath", extdirInputs);
     result.addExecPaths("--bootclasspath", bootclasspathEntries);
     result.addExecPaths("--sourcepath", sourcePathEntries);
     result.addExecPaths("--processorpath", plugins.processorClasspath());
@@ -469,11 +466,6 @@
     return this;
   }
 
-  public JavaCompileActionBuilder setExtdirInputs(NestedSet<Artifact> extdirEntries) {
-    this.extdirInputs = extdirEntries;
-    return this;
-  }
-
   /** Sets the directory where source files generated by annotation processors should be stored. */
   public JavaCompileActionBuilder setSourceGenDirectory(PathFragment sourceGenDirectory) {
     this.sourceGenDirectory = sourceGenDirectory;
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 52c1ea8..9d46758 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
@@ -59,8 +59,6 @@
     ImmutableList<String> javacopts = getJavacOpts(ruleContext);
     NestedSet<Artifact> bootclasspath =
         PrerequisiteArtifacts.nestedSet(ruleContext, "bootclasspath", Mode.HOST);
-    NestedSet<Artifact> extclasspath =
-        PrerequisiteArtifacts.nestedSet(ruleContext, "extclasspath", Mode.HOST);
     boolean javacSupportsWorkers =
         ruleContext.attributes().get("javac_supports_workers", Type.BOOLEAN);
     Artifact javac = ruleContext.getPrerequisiteArtifact("javac", Mode.HOST);
@@ -142,7 +140,6 @@
             turbineJvmOpts,
             javacSupportsWorkers,
             bootclasspath,
-            extclasspath,
             javac,
             tools,
             javabuilder,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
index b8c5df0..66e577e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java
@@ -78,7 +78,6 @@
       ImmutableList<String> turbineJvmOptions,
       boolean javacSupportsWorkers,
       NestedSet<Artifact> bootclasspath,
-      NestedSet<Artifact> extclasspath,
       @Nullable Artifact javac,
       NestedSet<Artifact> tools,
       FilesToRunProvider javaBuilder,
@@ -103,7 +102,6 @@
     return new JavaToolchainProvider(
         label,
         bootclasspath,
-        extclasspath,
         javac,
         tools,
         javaBuilder,
@@ -134,7 +132,6 @@
 
   private final Label label;
   private final NestedSet<Artifact> bootclasspath;
-  private final NestedSet<Artifact> extclasspath;
   @Nullable private final Artifact javac;
   private final NestedSet<Artifact> tools;
   private final FilesToRunProvider javaBuilder;
@@ -166,7 +163,6 @@
   JavaToolchainProvider(
       Label label,
       NestedSet<Artifact> bootclasspath,
-      NestedSet<Artifact> extclasspath,
       @Nullable Artifact javac,
       NestedSet<Artifact> tools,
       FilesToRunProvider javaBuilder,
@@ -197,7 +193,6 @@
 
     this.label = label;
     this.bootclasspath = bootclasspath;
-    this.extclasspath = extclasspath;
     this.javac = javac;
     this.tools = tools;
     this.javaBuilder = javaBuilder;
@@ -236,11 +231,6 @@
     return bootclasspath;
   }
 
-  /** @return the target Java extclasspath */
-  public NestedSet<Artifact> getExtclasspath() {
-    return extclasspath;
-  }
-
   /** Returns the {@link Artifact} of the javac jar */
   @Nullable
   public Artifact getJavac() {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
index 40d1ae7..65f2ba0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java
@@ -73,11 +73,9 @@
             attr("bootclasspath", LABEL_LIST)
                 .value(ImmutableList.of())
                 .allowedFileTypes(FileTypeSet.ANY_FILE))
-        /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(extclasspath) -->
-        The Java target extdir entries. Corresponds to javac's -extdir flag.
-        <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
         .add(
             attr("extclasspath", LABEL_LIST)
+                .undocumented("internal")
                 .value(ImmutableList.of())
                 .allowedFileTypes(FileTypeSet.ANY_FILE))
         /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(xlint) -->
