Automated rollback of commit 7acffaf50c027e38571f64a30b4dd84084d2d8e6.

*** Reason for rollback ***

Breaks internal targets.

PiperOrigin-RevId: 266288093
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
index 84e2a76..bda0b7e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRulesModule.java
@@ -47,18 +47,6 @@
   /** This is where deprecated options go to die. */
   public static class GraveyardOptions extends OptionsBase {
     @Option(
-        name = "incompatible_disallow_legacy_java_provider",
-        defaultValue = "true",
-        documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
-        effectTags = {OptionEffectTag.NO_OP},
-        metadataTags = {
-          OptionMetadataTag.INCOMPATIBLE_CHANGE,
-          OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
-        },
-        help = "Deprecated. No-op.")
-    public boolean incompatibleDisallowLegacyJavaProvider;
-
-    @Option(
         name = "incompatible_disable_legacy_proto_provider",
         defaultValue = "true",
         documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
index e3bdb33..adaf336 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
@@ -321,6 +321,18 @@
   public boolean incompatibleDisallowHashingFrozenMutables;
 
   @Option(
+      name = "incompatible_disallow_legacy_java_provider",
+      defaultValue = "true",
+      documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
+      effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+      metadataTags = {
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+      },
+      help = "If set to true, usages of old .java provider are disallowed.")
+  public boolean incompatibleDisallowLegacyJavaProvider;
+
+  @Option(
       name = "incompatible_disallow_legacy_javainfo",
       defaultValue = "true",
       documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS,
@@ -662,6 +674,7 @@
             .incompatibleDisableDepsetItems(incompatibleDisableDepsetItems)
             .incompatibleDisallowDictPlus(incompatibleDisallowDictPlus)
             .incompatibleDisallowEmptyGlob(incompatibleDisallowEmptyGlob)
+            .incompatibleDisallowLegacyJavaProvider(incompatibleDisallowLegacyJavaProvider)
             .incompatibleDisallowOldStyleArgsAdd(incompatibleDisallowOldStyleArgsAdd)
             .incompatibleDisallowStructProviderSyntax(incompatibleDisallowStructProviderSyntax)
             .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 402cf80..8d2ff78 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -43,6 +43,7 @@
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuntimeInfo;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaToolchainProvider;
@@ -236,6 +237,8 @@
 
     ruleBuilder
         .setFilesToBuild(filesToBuild)
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
         .addNativeDeclaredProvider(
             new AndroidNativeLibsInfo(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 6dbb2e0..929e281 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -64,6 +64,7 @@
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
 import com.google.devtools.build.lib.rules.java.JavaUtil;
@@ -742,6 +743,8 @@
 
     return builder
         .setFilesToBuild(filesToBuild)
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .addProvider(RunfilesProvider.class, RunfilesProvider.simple(getRunfiles()))
         .addNativeDeclaredProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
index 87ea160..8614bf1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java
@@ -58,6 +58,7 @@
 import com.google.devtools.build.lib.rules.java.JavaRuntimeClasspathProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuntimeInfo;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
@@ -370,6 +371,8 @@
 
     return builder
         .setFilesToBuild(filesToBuild)
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .addProvider(
             RunfilesProvider.class,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
index d2b6b07..1c47f8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BUILD
@@ -109,6 +109,7 @@
         "JavaRunfilesProvider.java",
         "JavaRuntimeInfo.java",
         "JavaSemantics.java",
+        "JavaSkylarkApiProvider.java",
         "JavaSkylarkCommon.java",
         "JavaSourceInfoProvider.java",
         "JavaSourceJarsProvider.java",
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 b259030..de9adbf 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
@@ -476,6 +476,8 @@
     return builder
         .setFilesToBuild(filesToBuild)
         .addNativeDeclaredProvider(javaInfo)
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .add(RunfilesProvider.class, runfilesProvider)
         // The executable to run (below) may be different from the executable for runfiles (the one
         // we create the runfiles support object with). On Linux they are the same (it's the same
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index b63b96e..7e39c09 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -152,6 +152,8 @@
 
     return ruleBuilder
         .setFilesToBuild(filesToBuild)
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .addNativeDeclaredProvider(javaInfo)
         .add(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
         .add(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 5322c1e..ecdb68c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -207,6 +207,8 @@
             .build();
 
     builder
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .addProvider(
             RunfilesProvider.simple(
                 JavaCommon.getRunfiles(ruleContext, semantics, javaArtifacts, neverLink)))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
new file mode 100644
index 0000000..a6f467f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -0,0 +1,163 @@
+// Copyright 2015 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.java;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaSkylarkApiProviderApi;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+import javax.annotation.Nullable;
+
+/**
+ * A class that exposes the Java providers to Skylark. It is intended to provide a simple and stable
+ * interface for Skylark users.
+ */
+@AutoCodec
+public final class JavaSkylarkApiProvider extends SkylarkApiProvider
+    implements JavaSkylarkApiProviderApi<Artifact> {
+  /** The name of the field in Skylark used to access this class. */
+  public static final String NAME = "java";
+  /** The name of the field in Skylark proto aspects used to access this class. */
+  public static final SkylarkProviderIdentifier SKYLARK_NAME =
+      SkylarkProviderIdentifier.forLegacy(NAME);
+
+  @Nullable private final TransitiveInfoProviderMap transitiveInfoProviderMap;
+
+  /**
+   * Creates a Skylark API provider that reads information from its associated target's providers.
+   */
+  public static JavaSkylarkApiProvider fromRuleContext() {
+    return new JavaSkylarkApiProvider(null);
+  }
+
+  /** Creates a Skylark API provider that reads information from an explicit provider map. */
+  @AutoCodec.Instantiator
+  public static JavaSkylarkApiProvider fromProviderMap(
+      TransitiveInfoProviderMap transitiveInfoProviderMap) {
+    return new JavaSkylarkApiProvider(transitiveInfoProviderMap);
+  }
+
+  private JavaSkylarkApiProvider(TransitiveInfoProviderMap transitiveInfoProviderMap) {
+    this.transitiveInfoProviderMap = transitiveInfoProviderMap;
+  }
+
+  @Nullable
+  private <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
+    if (transitiveInfoProviderMap != null) {
+      return JavaInfo.getProvider(provider, transitiveInfoProviderMap);
+    }
+    return JavaInfo.getProvider(provider, getInfo());
+  }
+
+  @Override
+  public NestedSet<Artifact> getSourceJars(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
+    if (sourceJarsProvider == null) {
+      return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+    }
+    return NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJarsProvider.getSourceJars());
+  }
+
+  @Override
+  public NestedSet<Artifact> getTransitiveDeps(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    JavaCompilationArgsProvider compilationArgsProvider =
+        getProvider(JavaCompilationArgsProvider.class);
+    if (compilationArgsProvider == null) {
+      return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+    }
+    return compilationArgsProvider.getTransitiveCompileTimeJars();
+  }
+
+  @Override
+  public NestedSet<Artifact> getTransitiveRuntimeDeps(
+      Location location, StarlarkSemantics semantics) throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    JavaCompilationArgsProvider compilationArgsProvider =
+        getProvider(JavaCompilationArgsProvider.class);
+    if (compilationArgsProvider == null) {
+      return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+    }
+    return compilationArgsProvider.getRuntimeJars();
+  }
+
+  @Override
+  public NestedSet<Artifact> getTransitiveSourceJars(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
+    if (sourceJarsProvider == null) {
+      return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+    }
+    return sourceJarsProvider.getTransitiveSourceJars();
+  }
+
+  @Override
+  public JavaRuleOutputJarsProvider getOutputJars(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    return getProvider(JavaRuleOutputJarsProvider.class);
+  }
+
+  @Override
+  public NestedSet<Label> getTransitiveExports(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    JavaExportsProvider exportsProvider = getProvider(JavaExportsProvider.class);
+    if (exportsProvider != null) {
+      return exportsProvider.getTransitiveExports();
+    } else {
+      return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+    }
+  }
+
+  @Override
+  public JavaGenJarsProvider getGenJarsProvider(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    return getProvider(JavaGenJarsProvider.class);
+  }
+
+  @Override
+  public JavaCompilationInfoProvider getCompilationInfoProvider(
+      Location location, StarlarkSemantics semantics) throws EvalException {
+    checkLegacyJavaProviderFlag(location, semantics);
+    return getProvider(JavaCompilationInfoProvider.class);
+  }
+
+  private void checkLegacyJavaProviderFlag(Location location, StarlarkSemantics semantics)
+      throws EvalException {
+    if (semantics.incompatibleDisallowLegacyJavaProvider()) {
+      throw new EvalException(
+          location,
+          "The .java provider is deprecated and cannot be used "
+              + "when --incompatible_disallow_legacy_java_provider is set. "
+              + "Please migrate to the JavaInfo Starlark provider.");
+    }
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index a0e41e2..da89907 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -48,6 +48,7 @@
 import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
@@ -114,6 +115,7 @@
             .advertiseProvider(JavaProtoLibraryAspectProvider.class)
             .advertiseProvider(
                 ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
+            .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.SKYLARK_NAME))
             .add(
                 attr(JavaProtoAspectCommon.LITE_PROTO_TOOLCHAIN_ATTR, LABEL)
                     .mandatoryNativeProviders(
@@ -231,7 +233,9 @@
       aspect.addNativeDeclaredProvider(
           createCcLinkingInfo(ruleContext, aspectCommon.getProtoRuntimeDeps()));
 
+      JavaSkylarkApiProvider skylarkApiProvider = JavaSkylarkApiProvider.fromRuleContext();
       aspect
+          .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider)
           .addNativeDeclaredProvider(javaInfo.build())
           .addProvider(
               new JavaProtoLibraryAspectProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index 10e8c92..64edf43 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -39,6 +39,7 @@
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaRunfilesProvider;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaStrictCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.ProguardLibrary;
@@ -101,6 +102,8 @@
 
     return new RuleConfiguredTargetBuilder(ruleContext)
         .setFilesToBuild(filesToBuild.build())
+        .addSkylarkTransitiveInfo(
+            JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
         .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
         .addOutputGroup(OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
         .addNativeDeclaredProvider(getJavaLiteRuntimeSpec(ruleContext))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index 1e2f6a6..93ac592 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -48,6 +48,7 @@
 import com.google.devtools.build.lib.rules.java.JavaRuleClasses;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder.Exports;
@@ -123,6 +124,7 @@
             .advertiseProvider(JavaProtoLibraryAspectProvider.class)
             .advertiseProvider(
                 ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
+            .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.SKYLARK_NAME))
             .add(
                 attr(JavaProtoAspectCommon.SPEED_PROTO_TOOLCHAIN_ATTR, LABEL)
                     // TODO(carmi): reinstate mandatoryNativeProviders(ProtoLangToolchainProvider)
@@ -250,7 +252,9 @@
       javaInfo.addProvider(JavaCompilationArgsProvider.class, generatedCompilationArgsProvider);
       aspect.addNativeDeclaredProvider(
           createCcLinkingInfo(ruleContext, aspectCommon.getProtoRuntimeDeps()));
+      JavaSkylarkApiProvider javaSkylarkApiProvider = JavaSkylarkApiProvider.fromRuleContext();
       aspect
+          .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, javaSkylarkApiProvider)
           .addNativeDeclaredProvider(javaInfo.build())
           .addProvider(
               new JavaProtoLibraryAspectProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
index 0f1f508..b33a91b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
@@ -36,6 +36,7 @@
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaRunfilesProvider;
+import com.google.devtools.build.lib.rules.java.JavaSkylarkApiProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaStrictCompilationArgsProvider;
 
@@ -98,6 +99,8 @@
     RuleConfiguredTargetBuilder result =
         new RuleConfiguredTargetBuilder(ruleContext)
             .setFilesToBuild(filesToBuild.build())
+            .addSkylarkTransitiveInfo(
+                JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
             .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
             .addOutputGroup(
                 OutputGroupInfo.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
new file mode 100644
index 0000000..39725a8
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
@@ -0,0 +1,117 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkbuildapi.java;
+
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+
+/**
+ * Provides access to information about Java rules. Every Java-related target provides
+ * this struct, accessible as a java field on a Target.
+ */
+@SkylarkModule(
+    name = "JavaSkylarkApiProvider",
+    title = "java",
+    category = SkylarkModuleCategory.PROVIDER,
+    doc =
+        "Provides access to information about Java rules. Every Java-related target provides "
+            + "this struct, accessible as a <code>java</code> field on a "
+            + "<a href=\"Target.html\">target</a>."
+)
+public interface JavaSkylarkApiProviderApi<FileT extends FileApi> {
+
+  @SkylarkCallable(
+      name = "source_jars",
+      doc = "Returns the Jars containing Java source files for the target.",
+      useStarlarkSemantics = true,
+      useLocation = true,
+      structField = true)
+  public NestedSet<FileT> getSourceJars(Location location, StarlarkSemantics semantics)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "transitive_deps",
+      doc = "Returns the transitive set of Jars required to build the target.",
+      useStarlarkSemantics = true,
+      useLocation = true,
+      structField = true)
+  public NestedSet<FileT> getTransitiveDeps(Location location, StarlarkSemantics semantics)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "transitive_runtime_deps",
+      doc = "Returns the transitive set of Jars required on the target's runtime classpath.",
+      useStarlarkSemantics = true,
+      useLocation = true,
+      structField = true)
+  public NestedSet<FileT> getTransitiveRuntimeDeps(Location location, StarlarkSemantics semantics)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "transitive_source_jars",
+      doc =
+          "Returns the Jars containing Java source files for the target and all of its transitive "
+              + "dependencies.",
+      useStarlarkSemantics = true,
+      useLocation = true,
+      structField = true)
+  public NestedSet<FileT> getTransitiveSourceJars(Location location, StarlarkSemantics semantics)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "outputs",
+      doc = "Returns information about outputs of this Java target.",
+      useStarlarkSemantics = true,
+      useLocation = true,
+      structField = true)
+  public JavaRuleOutputJarsProviderApi<?> getOutputJars(
+      Location location, StarlarkSemantics semantics) throws EvalException;
+
+  @SkylarkCallable(
+      name = "transitive_exports",
+      structField = true,
+      useStarlarkSemantics = true,
+      useLocation = true,
+      doc = "Returns transitive set of labels that are being exported from this rule.")
+  public NestedSet<Label> getTransitiveExports(Location location, StarlarkSemantics semantics)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "annotation_processing",
+      structField = true,
+      allowReturnNones = true,
+      useStarlarkSemantics = true,
+      useLocation = true,
+      doc = "Returns information about annotation processing for this Java target.")
+  public JavaAnnotationProcessingApi<?> getGenJarsProvider(
+      Location location, StarlarkSemantics semantics) throws EvalException;
+
+  @SkylarkCallable(
+      name = "compilation_info",
+      structField = true,
+      allowReturnNones = true,
+      useStarlarkSemantics = true,
+      useLocation = true,
+      doc = "Returns compilation information for this Java target.")
+  public JavaCompilationInfoProviderApi<?> getCompilationInfoProvider(
+      Location location, StarlarkSemantics semantics) throws EvalException;
+}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
index b83a03b..96b54a4 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -157,6 +157,7 @@
 
   public abstract boolean incompatibleDisallowEmptyGlob();
 
+  public abstract boolean incompatibleDisallowLegacyJavaProvider();
 
   public abstract boolean incompatibleDisallowOldStyleArgsAdd();
 
@@ -259,6 +260,7 @@
           .incompatibleDisableDepsetItems(false)
           .incompatibleDisallowDictPlus(true)
           .incompatibleDisallowEmptyGlob(false)
+          .incompatibleDisallowLegacyJavaProvider(true)
           .incompatibleDisallowOldStyleArgsAdd(true)
           .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(true)
           .incompatibleDisallowStructProviderSyntax(false)
@@ -326,6 +328,8 @@
 
     public abstract Builder incompatibleDisallowEmptyGlob(boolean value);
 
+    public abstract Builder incompatibleDisallowLegacyJavaProvider(boolean value);
+
     public abstract Builder incompatibleDisallowOldStyleArgsAdd(boolean value);
 
     public abstract Builder incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index ad23ea24c..a9be5d5 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -140,6 +140,7 @@
         "--incompatible_disable_third_party_license_checking=" + rand.nextBoolean(),
         "--incompatible_disallow_dict_plus=" + rand.nextBoolean(),
         "--incompatible_disallow_empty_glob=" + rand.nextBoolean(),
+        "--incompatible_disallow_legacy_java_provider=" + rand.nextBoolean(),
         "--incompatible_disallow_old_style_args_add=" + rand.nextBoolean(),
         "--incompatible_disallow_rule_execution_platform_constraints_allowed=" + rand.nextBoolean(),
         "--incompatible_disallow_struct_provider_syntax=" + rand.nextBoolean(),
@@ -192,6 +193,7 @@
         .incompatibleDisableThirdPartyLicenseChecking(rand.nextBoolean())
         .incompatibleDisallowDictPlus(rand.nextBoolean())
         .incompatibleDisallowEmptyGlob(rand.nextBoolean())
+        .incompatibleDisallowLegacyJavaProvider(rand.nextBoolean())
         .incompatibleDisallowOldStyleArgsAdd(rand.nextBoolean())
         .incompatibleDisallowRuleExecutionPlatformConstraintsAllowed(rand.nextBoolean())
         .incompatibleDisallowStructProviderSyntax(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index 4e8cdb0..6ac932d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -1161,6 +1161,29 @@
   }
 
   @Test
+  public void testSkylarkApiProviderReexported() throws Exception {
+    scratch.file(
+        "java/test/extension.bzl",
+        "def impl(ctx):",
+        "   dep_java = ctx.attr.dep.java",
+        "   return struct(java = dep_java)",
+        "my_rule = rule(impl, attrs = { ",
+        "  'dep' : attr.label(), ",
+        "})");
+    scratch.file(
+        "java/test/BUILD",
+        "load(':extension.bzl', 'my_rule')",
+        "java_library(name = 'jl', srcs = ['Jl.java'])",
+        "my_rule(name = 'my', dep = ':jl')");
+    // Now, get that information and ensure it is equal to what the jl java_library
+    // was presenting
+    ConfiguredTarget myConfiguredTarget = getConfiguredTarget("//java/test:my");
+    ConfiguredTarget javaLibraryTarget = getConfiguredTarget("//java/test:jl");
+
+    assertThat(myConfiguredTarget.get("java")).isSameInstanceAs(javaLibraryTarget.get("java"));
+  }
+
+  @Test
   public void javaProviderExposedOnJavaLibrary() throws Exception {
     scratch.file(
         "foo/extension.bzl",
@@ -1998,6 +2021,31 @@
   }
 
   @Test
+  public void testDisallowLegacyJavaProvider() throws Exception {
+    setSkylarkSemanticsOptions("--incompatible_disallow_legacy_java_provider");
+    scratch.file(
+        "foo/custom_rule.bzl",
+        "def _impl(ctx):",
+        "  ctx.attr.java_lib.java.source_jars",
+        "java_custom_library = rule(",
+        "  implementation = _impl,",
+        "  attrs = {",
+        "    'java_lib': attr.label(),",
+        "   },",
+        ")");
+
+    scratch.file(
+        "foo/BUILD",
+        "load(':custom_rule.bzl', 'java_custom_library')",
+        "java_library(name = 'java_lib', srcs = ['java/A.java'])",
+        "java_custom_library(name = 'custom_lib', java_lib = ':java_lib')");
+    checkError(
+        "//foo:custom_lib",
+        "The .java provider is deprecated and cannot be used "
+            + "when --incompatible_disallow_legacy_java_provider is set.");
+  }
+
+  @Test
   public void testConfiguredTargetHostJavabase() throws Exception {
     writeBuildFileForJavaToolchain();