Add flag to control native maven jar rule deprecation.

Closes #6768.
Relevant to #6799.

PiperOrigin-RevId: 223375698
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
index bb15e60..b79cd4a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
@@ -24,7 +24,9 @@
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue;
 import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper;
+import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.Path;
@@ -96,6 +98,24 @@
   public RepositoryDirectoryValue.Builder fetch(Rule rule, Path outputDirectory,
       BlazeDirectories directories, Environment env, Map<String, String> markerData)
       throws RepositoryFunctionException, InterruptedException {
+
+    // Deprecation in favor of the Starlark rule
+    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (skylarkSemantics == null) {
+      return null;
+    }
+    if (skylarkSemantics.incompatibleRemoveNativeMavenJar()) {
+      throw new RepositoryFunctionException(
+          new EvalException(
+              null,
+              "The native maven_jar rule is deprecated."
+                  + " See https://docs.bazel.build/versions/master/skylark/"
+                  + "backward-compatibility.html#remove-native-maven-jar for migration information."
+                  + "\nUse --incompatible_remove_native_maven_jar=false to temporarily continue"
+                  + " using the native rule."),
+          Transience.PERSISTENT);
+    }
+
     MavenServerValue serverValue = getServer(rule, env);
     if (env.valuesMissing()) {
       return null;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index 4b9685b..653a99d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -477,6 +477,20 @@
   public boolean incompatibleRemoveNativeHttpArchive;
 
   @Option(
+      name = "incompatible_remove_native_maven_jar",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
+      effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+      metadataTags = {
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+      },
+      help =
+          "If set to true, the native maven_jar rule is disabled; only the Starlark version "
+              + "will be available")
+  public boolean incompatibleRemoveNativeMavenJar;
+
+  @Option(
       name = "incompatible_static_name_resolution",
       defaultValue = "true",
       documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
@@ -566,6 +580,7 @@
         .incompatibleRangeType(incompatibleRangeType)
         .incompatibleRemoveNativeGitRepository(incompatibleRemoveNativeGitRepository)
         .incompatibleRemoveNativeHttpArchive(incompatibleRemoveNativeHttpArchive)
+        .incompatibleRemoveNativeMavenJar(incompatibleRemoveNativeMavenJar)
         .incompatibleStaticNameResolution(incompatibleStaticNameResolution)
         .incompatibleStricArgumentOrdering(incompatibleStricArgumentOrdering)
         .incompatibleStringIsNotIterable(incompatibleStringIsNotIterable)
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index b61c217..ff92277 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -176,6 +176,8 @@
 
   public abstract boolean incompatibleRemoveNativeHttpArchive();
 
+  public abstract boolean incompatibleRemoveNativeMavenJar();
+
   public abstract boolean incompatibleStaticNameResolution();
 
   public abstract boolean incompatibleStricArgumentOrdering();
@@ -231,6 +233,7 @@
           .incompatibleRangeType(true)
           .incompatibleRemoveNativeGitRepository(true)
           .incompatibleRemoveNativeHttpArchive(true)
+          .incompatibleRemoveNativeMavenJar(false)
           .incompatibleStaticNameResolution(true)
           .incompatibleStricArgumentOrdering(false)
           .incompatibleStringIsNotIterable(false)
@@ -306,6 +309,8 @@
 
     public abstract Builder incompatibleRemoveNativeHttpArchive(boolean value);
 
+    public abstract Builder incompatibleRemoveNativeMavenJar(boolean value);
+
     public abstract Builder incompatibleStaticNameResolution(boolean value);
 
     public abstract Builder incompatibleStricArgumentOrdering(boolean value);