Generate rules_java http_archive() instances from distdir_deps.bzl.

This consolidates the specification of the rules_java we depend on into a single place. We generate `http_archive()` stanzas for the main WORKSPACE as well as test harnesses from that, rather than keeping 3 instances in sync by hand. The old practice was error prone because you had to know about all the locations, and an update to one might not break the others immediately, but could be a lurking alignment problem.

This continues the work on #12081.

Closes #12787.

PiperOrigin-RevId: 350761327
diff --git a/BUILD b/BUILD
index 3bbe99f..c95d53d 100644
--- a/BUILD
+++ b/BUILD
@@ -116,6 +116,7 @@
     srcs = [
         "//src/main/java/com/google/devtools/build/lib/bazel/rules:builtins_bzl.zip",
         "//src/main/java/com/google/devtools/build/lib/bazel/rules/cpp:cc_configure.WORKSPACE",
+        "//src/main/java/com/google/devtools/build/lib/bazel/rules/java:jdk.WORKSPACE",
     ],
 )
 
diff --git a/WORKSPACE b/WORKSPACE
index 88c85c5..25664a5 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -158,8 +158,6 @@
         "bazel-skylib-1.0.3.tar.gz",
         # bazelbuild/platforms
         "platforms-0.0.2.tar.gz",
-        # bazelbuild/rules_java
-        "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
         # bazelbuild/bazel-toolchains
         "bazel-toolchains-3.1.0.tar.gz",
         # bazelbuild/rules_proto
@@ -193,8 +191,6 @@
         "bazel-skylib-1.0.3.tar.gz": "1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c",
         # bazelbuild/platforms
         "platforms-0.0.2.tar.gz": "48a2d8d343863989c232843e01afc8a986eb8738766bfd8611420a7db8f6f0c3",
-        # bazelbuild/rules_java
-        "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip": "bc81f1ba47ef5cc68ad32225c3d0e70b8c6f6077663835438da8d5733f917598",
         # bazelbuild/bazel-toolchains
         "bazel-toolchains-3.1.0.tar.gz": "726b5423e1c7a3866a3a6d68e7123b4a955e9fcbe912a51e0f737e6dab1d0af2",
         # bazelbuild/rules_proto
@@ -249,11 +245,6 @@
             "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.2/platforms-0.0.2.tar.gz",
             "https://github.com/bazelbuild/platforms/releases/download/0.0.2/platforms-0.0.2.tar.gz",
         ],
-        # bazelbuild/rules_java
-        "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip": [
-            "https://mirror.bazel.build/github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-            "https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-        ],
         # bazelbuild/bazel-toolchains
         "bazel-toolchains-3.1.0.tar.gz": [
             "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/releases/download/3.1.0/bazel-toolchains-3.1.0.tar.gz",
@@ -480,16 +471,10 @@
     patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_FILE_WIN,
 )
 
-http_archive(
+dist_http_archive(
     name = "rules_java",
     patch_cmds = EXPORT_WORKSPACE_IN_BUILD_FILE,
     patch_cmds_win = EXPORT_WORKSPACE_IN_BUILD_FILE_WIN,
-    sha256 = "bc81f1ba47ef5cc68ad32225c3d0e70b8c6f6077663835438da8d5733f917598",
-    strip_prefix = "rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178",
-    urls = [
-        "https://mirror.bazel.build/github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-        "https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-    ],
 )
 
 http_archive(
@@ -524,8 +509,6 @@
         "bazel-skylib-1.0.3.tar.gz",
         # bazelbuild/platforms
         "platforms-0.0.2.tar.gz",
-        # bazelbuild/rules_java
-        "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
         # bazelbuild/rules_proto
         "7e4afce6fe62dbff0a4a03450143146f9f2d7488.tar.gz",
         # protocolbuffers/protobuf
@@ -558,8 +541,6 @@
         "bazel-skylib-1.0.3.tar.gz": "1c531376ac7e5a180e0237938a2536de0c54d93f5c278634818e0efc952dd56c",
         # bazelbuild/platforms
         "platforms-0.0.2.tar.gz": "48a2d8d343863989c232843e01afc8a986eb8738766bfd8611420a7db8f6f0c3",
-        # bazelbuild/rules_java
-        "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip": "bc81f1ba47ef5cc68ad32225c3d0e70b8c6f6077663835438da8d5733f917598",
         # bazelbuild/rules_proto
         "7e4afce6fe62dbff0a4a03450143146f9f2d7488.tar.gz": "8e7d59a5b12b233be5652e3d29f42fba01c7cbab09f6b3a8d0a57ed6d1e9a0da",
         # protocolbuffers/protobuf
@@ -598,11 +579,6 @@
             "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.2/platforms-0.0.2.tar.gz",
             "https://github.com/bazelbuild/platforms/releases/download/0.0.2/platforms-0.0.2.tar.gz",
         ],
-        # bazelbuild/rules_java
-        "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip": [
-            "https://mirror.bazel.build/github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-            "https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-        ],
         # bazelbuild/rules_proto
         "7e4afce6fe62dbff0a4a03450143146f9f2d7488.tar.gz": [
             "https://mirror.bazel.build/github.com/bazelbuild/rules_proto/archive/7e4afce6fe62dbff0a4a03450143146f9f2d7488.tar.gz",
diff --git a/distdir_deps.bzl b/distdir_deps.bzl
index 1c3d899..05f9dca 100644
--- a/distdir_deps.bzl
+++ b/distdir_deps.bzl
@@ -33,6 +33,21 @@
         ],
         "need_in_test_WORKSPACE": True,
     },
+    "rules_java": {
+        "archive": "7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
+        "sha256": "bc81f1ba47ef5cc68ad32225c3d0e70b8c6f6077663835438da8d5733f917598",
+        "strip_prefix": "rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178",
+        "urls": [
+            "https://mirror.bazel.build/github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
+            "https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
+        ],
+        "used_in": [
+            "additional_distfiles",
+            "test_WORKSPACE_files",
+        ],
+        "need_in_test_WORKSPACE": True,
+    },
+
     ########################################
     #
     # Build time dependencies
@@ -71,7 +86,8 @@
     if ctx.attr.template and (ctx.attr.preamble or ctx.attr.postamble):
         fail("Can not use template with either preamble or postamble")
 
-    repo_clause = """
+    if ctx.attr.use_maybe:
+        repo_clause = """
 maybe(
     http_archive,
     "{repo}",
@@ -80,6 +96,16 @@
     urls = {urls},
 )
 """
+    else:
+        repo_clause = """
+http_archive(
+    name = "{repo}",
+    sha256 = "{sha256}",
+    strip_prefix = {strip_prefix},
+    urls = {urls},
+)
+"""
+
     repo_stanzas = {}
     for repo in ctx.attr.repos:
         info = DIST_DEPS[repo]
@@ -116,6 +142,8 @@
 
 gen_workspace_stanza = rule(
     implementation = _gen_workspace_stanza_impl,
+    doc = "Use specifications from DIST_DEPS to generate WORKSPACE http_archive stanzas or to fill" +
+          "drop them into a template.",
     attrs = {
         "repos": attr.string_list(doc = "Set of repos to inlcude"),
         "out": attr.output(mandatory = True),
@@ -127,5 +155,6 @@
             allow_single_file = True,
             mandatory = False,
         ),
+        "use_maybe": attr.bool(doc = "Use maybe() invocation instead of http_archive"),
     },
 )
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
index 2532a41..266d840 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BUILD
@@ -1,4 +1,5 @@
 load("@rules_java//java:defs.bzl", "java_library")
+load("//:distdir_deps.bzl", "gen_workspace_stanza")
 
 package(
     default_visibility = ["//src:__subpackages__"],
@@ -21,9 +22,10 @@
     resources = glob(
         [
             "*.txt",
-            "*.WORKSPACE",
         ],
-    ),
+    ) + [
+        ":jdk.WORKSPACE",
+    ],
     deps = [
         ":bazel_java_semantics",
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
@@ -71,3 +73,15 @@
         "//third_party:jsr305",
     ],
 )
+
+gen_workspace_stanza(
+    name = "workspace_with_rules_java",
+    out = "jdk.WORKSPACE",
+    repos = [
+        "rules_cc",
+        "rules_java",
+    ],
+    template = "jdk.WORKSPACE.tmpl",
+    use_maybe = True,
+    visibility = ["//:__pkg__"],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.tmpl
similarity index 91%
rename from src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE
rename to src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.tmpl
index 727433f..5ca4c69 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/jdk.WORKSPACE.tmpl
@@ -254,28 +254,10 @@
     ],
 )
 
-maybe(
-    http_archive,
-    "rules_java",
-    sha256 = "bc81f1ba47ef5cc68ad32225c3d0e70b8c6f6077663835438da8d5733f917598",
-    strip_prefix = "rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178",
-    urls = [
-        "https://mirror.bazel.build/github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-        "https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-    ],
-)
+{rules_java}
 
 # Needed only because of java_tools.
-maybe(
-    http_archive,
-    "rules_cc",
-    sha256 = "d0c573b94a6ef20ef6ff20154a23d0efcb409fb0e1ff0979cec318dfe42f0cdd",
-    strip_prefix = "rules_cc-b1c40e1de81913a3c40e5948f78719c28152486d",
-    urls = [
-        "https://mirror.bazel.build/github.com/bazelbuild/rules_cc/archive/b1c40e1de81913a3c40e5948f78719c28152486d.zip",
-        "https://github.com/bazelbuild/rules_cc/archive/b1c40e1de81913a3c40e5948f78719c28152486d.zip",
-    ],
-)
+{rules_cc}
 
 # Needed only because of java_tools.
 maybe(
diff --git a/src/test/shell/BUILD b/src/test/shell/BUILD
index c6b2693..49155df 100644
--- a/src/test/shell/BUILD
+++ b/src/test/shell/BUILD
@@ -1,3 +1,4 @@
+load("//:distdir_deps.bzl", "gen_workspace_stanza")
 load("//tools/python:private/defs.bzl", "py_test")
 
 package(default_visibility = ["//visibility:private"])
@@ -6,7 +7,6 @@
     "bin/bazel",
     "bin/bazel_jdk_minimal",
     "bin/bazel_nojdk",
-    "testenv.sh",
     "integration_test_setup.sh",
     "sandboxing_test_utils.sh",
     "unittest.bash",
@@ -22,13 +22,24 @@
     visibility = ["//src:__pkg__"],
 )
 
+gen_workspace_stanza(
+    name = "testenv_sh",
+    out = "testenv.sh",
+    repos = [
+        "rules_cc",
+        "rules_java",
+    ],
+    template = "testenv.sh.tmpl",
+    visibility = ["//visibility:public"],
+)
+
 sh_library(
     name = "bashunit",
     srcs = [
         "unittest.bash",
         "unittest_utils.sh",
     ],
-    data = ["testenv.sh"],
+    data = [":testenv.sh"],
     visibility = ["//visibility:public"],
 )
 
@@ -59,9 +70,9 @@
     name = "shell_utils_test",
     srcs = ["shell_utils_test.sh"],
     data = [
-        "testenv.sh",
         ":bashunit",
         ":shell_utils",
+        ":testenv.sh",
         "@bazel_tools//tools/bash/runfiles",
     ],
 )
@@ -70,9 +81,9 @@
     name = "shell_utils_symlinks_test",
     srcs = ["shell_utils_symlinks_test.sh"],
     data = [
-        "testenv.sh",
         ":bashunit",
         ":shell_utils",
+        ":testenv.sh",
         "@bazel_tools//tools/bash/runfiles",
     ],
     tags = [
diff --git a/src/test/shell/bazel/external_integration_test.sh b/src/test/shell/bazel/external_integration_test.sh
index 341d413..729921b 100755
--- a/src/test/shell/bazel/external_integration_test.sh
+++ b/src/test/shell/bazel/external_integration_test.sh
@@ -2385,7 +2385,7 @@
   # Also verify that the repository class and its definition is reported, to
   # help finding out where the implict dependency comes from.
   expect_log "Repository data instantiated at:"
-  expect_log ".../WORKSPACE:47"
+  expect_log ".../WORKSPACE:[0-9]*"
   expect_log "Repository rule data_repo defined at:"
   expect_log ".../withimplicit.bzl:6"
 }
diff --git a/src/test/shell/testenv.sh b/src/test/shell/testenv.sh.tmpl
similarity index 96%
rename from src/test/shell/testenv.sh
rename to src/test/shell/testenv.sh.tmpl
index 4319af3..4a546ed 100755
--- a/src/test/shell/testenv.sh
+++ b/src/test/shell/testenv.sh.tmpl
@@ -526,15 +526,7 @@
   cat >> "$1"<<EOF
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
-http_archive(
-    name = "rules_cc",
-    sha256 = "1d4dbbd1e1e9b57d40bb0ade51c9e882da7658d5bfbf22bbd15b68e7879d761f",
-    strip_prefix = "rules_cc-8bd6cd75d03c01bb82561a96d9c1f9f7157b13d0",
-    urls = [
-        "https://mirror.bazel.build/github.com/bazelbuild/rules_cc/archive/8bd6cd75d03c01bb82561a96d9c1f9f7157b13d0.zip",
-        "https://github.com/bazelbuild/rules_cc/archive/8bd6cd75d03c01bb82561a96d9c1f9f7157b13d0.zip",
-    ],
-)
+{rules_cc}
 EOF
 }
 
@@ -542,15 +534,7 @@
   cat >> "$1"<<EOF
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
-http_archive(
-    name = "rules_java",
-    sha256 = "bc81f1ba47ef5cc68ad32225c3d0e70b8c6f6077663835438da8d5733f917598",
-    strip_prefix = "rules_java-7cf3cefd652008d0a64a419c34c13bdca6c8f178",
-    urls = [
-        "https://mirror.bazel.build/github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-        "https://github.com/bazelbuild/rules_java/archive/7cf3cefd652008d0a64a419c34c13bdca6c8f178.zip",
-    ],
-)
+{rules_java}
 EOF
 }