Use rules_jvm_external to fetch jars dependencies (part 2)

- Non-third_party changes in https://github.com/bazelbuild/bazel/pull/17112

Merging https://github.com/bazelbuild/bazel/pull/17112

Stacking on https://github.com/bazelbuild/bazel/pull/17142

Closes #17143.

PiperOrigin-RevId: 500980364
Change-Id: Ie03d4bc8e167d8a27ed8b33cd90f2e3af2c472f6
diff --git a/.bazelrc b/.bazelrc
index 20921ea..65b5b53 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -28,7 +28,8 @@
 build:macos --macos_minimum_os=10.10
 
 # Enable Bzlmod
-build:bzlmod --experimental_enable_bzlmod
+build:bzlmod --enable_bzlmod
+build:bzlmod --check_direct_dependencies=error
 
 # Enable Java 11 language features (https://github.com/bazelbuild/bazel/issues/14592)
 build --java_language_version=11
diff --git a/BUILD b/BUILD
index 0f8fdb6..a3f4b47 100644
--- a/BUILD
+++ b/BUILD
@@ -161,6 +161,15 @@
     visibility = ["//:__subpackages__"],
 )
 
+# The @maven repository is created by maven_install from rules_jvm_external.
+# `@maven//:srcs` contains all jar files downloaded and BUILD files created by maven_install.
+pkg_tar(
+    name = "maven-srcs",
+    srcs = ["@maven//:srcs"],
+    strip_prefix = "external",
+    visibility = ["//:__subpackages__"],
+)
+
 py_binary(
     name = "combine_distfiles",
     srcs = ["combine_distfiles.py"],
@@ -174,6 +183,7 @@
         ":bazel-srcs",
         ":bootstrap-jars",
         ":platforms-srcs",
+        ":maven-srcs",
         "//src:derived_java_srcs",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:bootstrap_autocodec.tar",
         "@additional_distfiles//:archives.tar",
@@ -191,6 +201,7 @@
         ":bazel-srcs",
         ":bootstrap-jars",
         ":platforms-srcs",
+        ":maven-srcs",
         "//src:derived_java_srcs",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:bootstrap_autocodec.tar",
         "@additional_distfiles//:archives.tar",
diff --git a/MODULE.bazel b/MODULE.bazel
index 8dc16bb..684f6d4 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -7,20 +7,41 @@
 )
 
 bazel_dep(name = "rules_license", version = "0.0.3")
-bazel_dep(name = "bazel_skylib", version = "1.2.0")
+bazel_dep(name = "bazel_skylib", version = "1.3.0")
 bazel_dep(name = "protobuf", version = "3.19.6", repo_name = "com_google_protobuf")
 bazel_dep(name = "grpc", version = "1.47.0", repo_name = "com_github_grpc_grpc")
 bazel_dep(name = "platforms", version = "0.0.5")
 bazel_dep(name = "rules_pkg", version = "0.7.0")
-bazel_dep(name = "stardoc", version = "0.5.0", repo_name = "io_bazel_skydoc")
+bazel_dep(name = "stardoc", version = "0.5.3", repo_name = "io_bazel_skydoc")
 bazel_dep(name = "zstd-jni", version = "1.5.2-3")
 bazel_dep(name = "zlib", version = "1.2.13")
-
-# The following are required when building without WORKSPACE SUFFIX
 bazel_dep(name = "rules_cc", version = "0.0.2")
 bazel_dep(name = "rules_java", version = "5.4.0")
 bazel_dep(name = "rules_proto", version = "4.0.0")
 
+bazel_dep(name = "rules_jvm_external", version = "4.5")
+maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
+maven.install(
+  artifacts = [
+    "com.google.guava:guava:31.1-jre",
+    "com.google.guava:guava-testlib:31.1-jre",
+    "com.google.guava:failureaccess:1.0.1",
+    "com.google.errorprone:error_prone_annotations:2.16",
+    "com.google.errorprone:error_prone_type_annotations:2.16",
+    "com.google.code.findbugs:jsr305:3.0.2",
+    "com.google.j2objc:j2objc-annotations:1.3",
+    "com.github.stephenc.jcip:jcip-annotations:1.0-1",
+    "org.checkerframework:checker-qual:3.12.0",
+  ],
+  repositories = [
+    "https://dl.google.com/android/maven2",
+    "https://repo1.maven.org/maven2",
+  ],
+  lock_file = "//:maven_install.json",
+)
+
+use_repo(maven, "maven", "unpinned_maven")
+
 # TODO(pcloudy): Add remoteapis and googleapis as Bazel modules in the BCR.
 bazel_dep(name = "remoteapis", version = "")
 bazel_dep(name = "googleapis", version = "")
diff --git a/WORKSPACE b/WORKSPACE
index 536077c..25bf180 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -577,6 +577,10 @@
     name = "bazel_gazelle",
 )
 
+dist_http_archive(
+    name = "rules_jvm_external",
+)
+
 # Projects using gRPC as an external dependency must call both grpc_deps() and
 # grpc_extra_deps().
 load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
@@ -594,3 +598,35 @@
 load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
 
 bazel_skylib_workspace()
+
+load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps")
+
+rules_jvm_external_deps()
+
+load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup")
+
+rules_jvm_external_setup()
+
+load("@rules_jvm_external//:defs.bzl", "maven_install")
+
+maven_install(
+    artifacts = [
+       "com.google.guava:guava:31.1-jre",
+       "com.google.guava:guava-testlib:31.1-jre",
+       "com.google.guava:failureaccess:1.0.1",
+       "com.google.errorprone:error_prone_annotations:2.16",
+       "com.google.errorprone:error_prone_type_annotations:2.16",
+       "com.google.code.findbugs:jsr305:3.0.2",
+       "com.google.j2objc:j2objc-annotations:1.3",
+       "com.github.stephenc.jcip:jcip-annotations:1.0-1",
+       "org.checkerframework:checker-qual:3.12.0",
+    ],
+    repositories = [
+        "https://dl.google.com/android/maven2",
+        "https://repo1.maven.org/maven2",
+    ],
+    maven_install_json = "//:maven_install.json",
+)
+
+load("@maven//:defs.bzl", "pinned_maven_install")
+pinned_maven_install()
diff --git a/distdir_deps.bzl b/distdir_deps.bzl
index 6586a7b..1c92706 100644
--- a/distdir_deps.bzl
+++ b/distdir_deps.bzl
@@ -339,6 +339,22 @@
         ],
         "package_version": "0.8.0",
     },
+    "rules_jvm_external": {
+        "archive": "4.5.zip",
+        "sha256": "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6",
+        "strip_prefix": "rules_jvm_external-4.5",
+        "patches": [
+            "//third_party:rules_jvm_external.patch",
+        ],
+        "patch_args": ["-p1"],
+        "urls": [
+            "https://github.com/bazelbuild/rules_jvm_external/archive/4.5.zip",
+        ],
+        "used_in": [
+            "additional_distfiles",
+        ],
+        "package_version": "4.5",
+    },
     "desugar_jdk_libs": {
         # Commit 5847d6a06302136d95a14b4cbd4b55a9c9f1436e of 2021-03-10
         "archive": "5847d6a06302136d95a14b4cbd4b55a9c9f1436e.zip",
diff --git a/maven_install.json b/maven_install.json
new file mode 100644
index 0000000..7a6e81f
--- /dev/null
+++ b/maven_install.json
@@ -0,0 +1,311 @@
+{
+    "dependency_tree": {
+        "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
+        "__INPUT_ARTIFACTS_HASH": 1039122131,
+        "__RESOLVED_ARTIFACTS_HASH": 1665684790,
+        "conflict_resolution": {},
+        "dependencies": [
+            {
+                "coord": "com.github.stephenc.jcip:jcip-annotations:1.0-1",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar",
+                    "https://dl.google.com/android/maven2/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar"
+                ],
+                "packages": [
+                    "net.jcip.annotations"
+                ],
+                "sha256": "4fccff8382aafc589962c4edb262f6aa595e34f1e11e61057d1c6a96e8fc7323",
+                "url": "https://repo1.maven.org/maven2/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar"
+            },
+            {
+                "coord": "com.google.code.findbugs:jsr305:3.0.2",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar",
+                    "https://dl.google.com/android/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
+                ],
+                "packages": [
+                    "javax.annotation",
+                    "javax.annotation.concurrent",
+                    "javax.annotation.meta"
+                ],
+                "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7",
+                "url": "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
+            },
+            {
+                "coord": "com.google.errorprone:error_prone_annotations:2.16",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.16/error_prone_annotations-2.16.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.16/error_prone_annotations-2.16.jar",
+                    "https://dl.google.com/android/maven2/com/google/errorprone/error_prone_annotations/2.16/error_prone_annotations-2.16.jar"
+                ],
+                "packages": [
+                    "com.google.errorprone.annotations",
+                    "com.google.errorprone.annotations.concurrent"
+                ],
+                "sha256": "2668536a354cda63d19885fcabdecd8d6298aec4260cdfdf34b722e964d60396",
+                "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.16/error_prone_annotations-2.16.jar"
+            },
+            {
+                "coord": "com.google.errorprone:error_prone_type_annotations:2.16",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_type_annotations/2.16/error_prone_type_annotations-2.16.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_type_annotations/2.16/error_prone_type_annotations-2.16.jar",
+                    "https://dl.google.com/android/maven2/com/google/errorprone/error_prone_type_annotations/2.16/error_prone_type_annotations-2.16.jar"
+                ],
+                "packages": [
+                    "com.google.errorprone.annotations"
+                ],
+                "sha256": "32cbcd4b937fb41e38968386525e7ed9de27fb724777d5b4b1b126aeb960ff38",
+                "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_type_annotations/2.16/error_prone_type_annotations-2.16.jar"
+            },
+            {
+                "coord": "com.google.guava:failureaccess:1.0.1",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar",
+                    "https://dl.google.com/android/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
+                ],
+                "packages": [
+                    "com.google.common.util.concurrent.internal"
+                ],
+                "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26",
+                "url": "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
+            },
+            {
+                "coord": "com.google.guava:guava-testlib:31.1-jre",
+                "dependencies": [
+                    "com.google.code.findbugs:jsr305:3.0.2",
+                    "com.google.errorprone:error_prone_annotations:2.16",
+                    "com.google.guava:failureaccess:1.0.1",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+                    "com.google.j2objc:j2objc-annotations:1.3",
+                    "junit:junit:4.13.2",
+                    "org.checkerframework:checker-qual:3.12.0",
+                    "org.hamcrest:hamcrest-core:1.3"
+                ],
+                "directDependencies": [
+                    "com.google.code.findbugs:jsr305:3.0.2",
+                    "com.google.errorprone:error_prone_annotations:2.16",
+                    "com.google.guava:guava:31.1-jre",
+                    "com.google.j2objc:j2objc-annotations:1.3",
+                    "junit:junit:4.13.2",
+                    "org.checkerframework:checker-qual:3.12.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava-testlib/31.1-jre/guava-testlib-31.1-jre.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/guava/guava-testlib/31.1-jre/guava-testlib-31.1-jre.jar",
+                    "https://dl.google.com/android/maven2/com/google/guava/guava-testlib/31.1-jre/guava-testlib-31.1-jre.jar"
+                ],
+                "packages": [
+                    "com.google.common.collect.testing",
+                    "com.google.common.collect.testing.features",
+                    "com.google.common.collect.testing.google",
+                    "com.google.common.collect.testing.testers",
+                    "com.google.common.escape.testing",
+                    "com.google.common.testing",
+                    "com.google.common.util.concurrent.testing"
+                ],
+                "sha256": "aadc71b10d5c3ac474dd16be84cfb18d257e584d1e0a59f8cab64ef4376226ce",
+                "url": "https://repo1.maven.org/maven2/com/google/guava/guava-testlib/31.1-jre/guava-testlib-31.1-jre.jar"
+            },
+            {
+                "coord": "com.google.guava:guava:31.1-jre",
+                "dependencies": [
+                    "com.google.code.findbugs:jsr305:3.0.2",
+                    "com.google.errorprone:error_prone_annotations:2.16",
+                    "com.google.guava:failureaccess:1.0.1",
+                    "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+                    "com.google.j2objc:j2objc-annotations:1.3",
+                    "org.checkerframework:checker-qual:3.12.0"
+                ],
+                "directDependencies": [
+                    "com.google.code.findbugs:jsr305:3.0.2",
+                    "com.google.errorprone:error_prone_annotations:2.16",
+                    "com.google.guava:failureaccess:1.0.1",
+                    "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+                    "com.google.j2objc:j2objc-annotations:1.3",
+                    "org.checkerframework:checker-qual:3.12.0"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar",
+                    "https://dl.google.com/android/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar"
+                ],
+                "packages": [
+                    "com.google.common.annotations",
+                    "com.google.common.base",
+                    "com.google.common.base.internal",
+                    "com.google.common.cache",
+                    "com.google.common.collect",
+                    "com.google.common.escape",
+                    "com.google.common.eventbus",
+                    "com.google.common.graph",
+                    "com.google.common.hash",
+                    "com.google.common.html",
+                    "com.google.common.io",
+                    "com.google.common.math",
+                    "com.google.common.net",
+                    "com.google.common.primitives",
+                    "com.google.common.reflect",
+                    "com.google.common.util.concurrent",
+                    "com.google.common.xml",
+                    "com.google.thirdparty.publicsuffix"
+                ],
+                "sha256": "a42edc9cab792e39fe39bb94f3fca655ed157ff87a8af78e1d6ba5b07c4a00ab",
+                "url": "https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar"
+            },
+            {
+                "coord": "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar",
+                    "https://dl.google.com/android/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
+                ],
+                "packages": [],
+                "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99",
+                "url": "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
+            },
+            {
+                "coord": "com.google.j2objc:j2objc-annotations:1.3",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar",
+                    "https://dl.google.com/android/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar"
+                ],
+                "packages": [
+                    "com.google.j2objc.annotations"
+                ],
+                "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b",
+                "url": "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar"
+            },
+            {
+                "coord": "junit:junit:4.13.2",
+                "dependencies": [
+                    "org.hamcrest:hamcrest-core:1.3"
+                ],
+                "directDependencies": [
+                    "org.hamcrest:hamcrest-core:1.3"
+                ],
+                "file": "v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar",
+                    "https://dl.google.com/android/maven2/junit/junit/4.13.2/junit-4.13.2.jar"
+                ],
+                "packages": [
+                    "junit.extensions",
+                    "junit.framework",
+                    "junit.runner",
+                    "junit.textui",
+                    "org.junit",
+                    "org.junit.experimental",
+                    "org.junit.experimental.categories",
+                    "org.junit.experimental.max",
+                    "org.junit.experimental.results",
+                    "org.junit.experimental.runners",
+                    "org.junit.experimental.theories",
+                    "org.junit.experimental.theories.internal",
+                    "org.junit.experimental.theories.suppliers",
+                    "org.junit.function",
+                    "org.junit.internal",
+                    "org.junit.internal.builders",
+                    "org.junit.internal.management",
+                    "org.junit.internal.matchers",
+                    "org.junit.internal.requests",
+                    "org.junit.internal.runners",
+                    "org.junit.internal.runners.model",
+                    "org.junit.internal.runners.rules",
+                    "org.junit.internal.runners.statements",
+                    "org.junit.matchers",
+                    "org.junit.rules",
+                    "org.junit.runner",
+                    "org.junit.runner.manipulation",
+                    "org.junit.runner.notification",
+                    "org.junit.runners",
+                    "org.junit.runners.model",
+                    "org.junit.runners.parameterized",
+                    "org.junit.validator"
+                ],
+                "sha256": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
+                "url": "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"
+            },
+            {
+                "coord": "org.checkerframework:checker-qual:3.12.0",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar",
+                    "https://dl.google.com/android/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar"
+                ],
+                "packages": [
+                    "org.checkerframework.checker.builder.qual",
+                    "org.checkerframework.checker.calledmethods.qual",
+                    "org.checkerframework.checker.compilermsgs.qual",
+                    "org.checkerframework.checker.fenum.qual",
+                    "org.checkerframework.checker.formatter.qual",
+                    "org.checkerframework.checker.guieffect.qual",
+                    "org.checkerframework.checker.i18n.qual",
+                    "org.checkerframework.checker.i18nformatter.qual",
+                    "org.checkerframework.checker.index.qual",
+                    "org.checkerframework.checker.initialization.qual",
+                    "org.checkerframework.checker.interning.qual",
+                    "org.checkerframework.checker.lock.qual",
+                    "org.checkerframework.checker.nullness.qual",
+                    "org.checkerframework.checker.optional.qual",
+                    "org.checkerframework.checker.propkey.qual",
+                    "org.checkerframework.checker.regex.qual",
+                    "org.checkerframework.checker.signature.qual",
+                    "org.checkerframework.checker.signedness.qual",
+                    "org.checkerframework.checker.tainting.qual",
+                    "org.checkerframework.checker.units.qual",
+                    "org.checkerframework.common.aliasing.qual",
+                    "org.checkerframework.common.initializedfields.qual",
+                    "org.checkerframework.common.reflection.qual",
+                    "org.checkerframework.common.returnsreceiver.qual",
+                    "org.checkerframework.common.subtyping.qual",
+                    "org.checkerframework.common.util.report.qual",
+                    "org.checkerframework.common.value.qual",
+                    "org.checkerframework.dataflow.qual",
+                    "org.checkerframework.framework.qual"
+                ],
+                "sha256": "ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb",
+                "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar"
+            },
+            {
+                "coord": "org.hamcrest:hamcrest-core:1.3",
+                "dependencies": [],
+                "directDependencies": [],
+                "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
+                "mirror_urls": [
+                    "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
+                    "https://dl.google.com/android/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"
+                ],
+                "packages": [
+                    "org.hamcrest",
+                    "org.hamcrest.core",
+                    "org.hamcrest.internal"
+                ],
+                "sha256": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
+                "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"
+            }
+        ],
+        "version": "0.1.0"
+    }
+}
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index 09cdd8f..e502179 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -27,12 +27,11 @@
 GOOGLE_API_PROTOS="$(grep -o '".*\.proto"' third_party/googleapis/BUILD.bazel | sed 's/"//g' | sed 's|^|third_party/googleapis/|g')"
 PROTO_FILES=$(find third_party/remoteapis ${GOOGLE_API_PROTOS} third_party/pprof src/main/protobuf src/main/java/com/google/devtools/build/lib/buildeventstream/proto src/main/java/com/google/devtools/build/skyframe src/main/java/com/google/devtools/build/lib/skyframe/proto src/main/java/com/google/devtools/build/lib/bazel/debug src/main/java/com/google/devtools/build/lib/starlarkdebug/proto src/main/java/com/google/devtools/build/lib/packages/metrics/package_metrics.proto -name "*.proto")
 # For protobuf jars, derived/jars/com_google_protobuf/java/core/libcore.jar must be in front of derived/jars/com_google_protobuf/java/core/liblite.jar, so we sort jars here
-LIBRARY_JARS=$(find $ADDITIONAL_JARS third_party -name '*.jar' | sort | grep -Fv JavaBuilder | grep -Fv third_party/guava/guava | grep -ve 'third_party/grpc/grpc.*jar' | grep -Fv third_party/netty_tcnative | tr "\n" " ")
+LIBRARY_JARS=$(find $ADDITIONAL_JARS third_party -name '*.jar' | sort | grep -Fv JavaBuilder | grep -ve 'third_party/grpc/grpc.*jar' | grep -Fv third_party/netty_tcnative | tr "\n" " ")
 GRPC_JAVA_VERSION=1.47.0
 GRPC_LIBRARY_JARS=$(find third_party/grpc -name '*.jar' | grep -e ".*${GRPC_JAVA_VERSION}.*jar" | tr "\n" " ")
-GUAVA_VERSION=31.1
-GUAVA_JARS=$(find third_party/guava -name '*.jar' | grep -e ".*${GUAVA_VERSION}.*jar" | tr "\n" " ")
-LIBRARY_JARS="${LIBRARY_JARS} ${GRPC_LIBRARY_JARS} ${GUAVA_JARS}"
+MAVEN_JARS=$(find maven -name '*.jar' | tr "\n" " ")
+LIBRARY_JARS="${LIBRARY_JARS} ${GRPC_LIBRARY_JARS} ${MAVEN_JARS}"
 
 DIRS=$(echo src/{java_tools/singlejar/java/com/google/devtools/build/zip,main/java} tools/java/runfiles ${OUTPUT_DIR}/src)
 # Exclude source files that are not needed for Bazel itself, which avoids dependencies like truth.
@@ -311,6 +310,9 @@
   mkdir -p ${BAZEL_TOOLS_REPO}/platforms
   cp tools/platforms/BUILD.tools ${BAZEL_TOOLS_REPO}/platforms/BUILD
 
+  # Set up @maven properly
+  cp maven/BUILD.vendor maven/BUILD
+
   # Overwrite tools.WORKSPACE, this is only for the bootstrap binary
   chmod u+w "${OUTPUT_DIR}/classes/com/google/devtools/build/lib/bazel/rules/tools.WORKSPACE"
   cat <<EOF >${OUTPUT_DIR}/classes/com/google/devtools/build/lib/bazel/rules/tools.WORKSPACE
@@ -465,6 +467,7 @@
       --startup_time=329 --extract_data_time=523 \
       --rc_source=/dev/null --isatty=1 \
       --build_python_zip \
+      --override_repository=maven="$(get_cwd)/maven" \
       "${client_env[@]}" \
       --client_cwd="$(get_cwd)" \
       "${@}"
diff --git a/src/test/shell/bazel/bazel_determinism_test.sh b/src/test/shell/bazel/bazel_determinism_test.sh
index dc79346..8480d42 100755
--- a/src/test/shell/bazel/bazel_determinism_test.sh
+++ b/src/test/shell/bazel/bazel_determinism_test.sh
@@ -56,12 +56,17 @@
     unzip -q "${DISTFILE}"
 
     distdir="derived/distdir"
+    maven="${workdir}/maven"
+
+    # Set up the maven repository properly.
+    cp maven/BUILD.vendor maven/BUILD
 
     # Build Bazel once.
     bazel \
       --output_base="${TEST_TMPDIR}/out1" \
       build \
       --distdir=$distdir \
+      --override_repository=maven=$maven \
       --nostamp \
       //src:bazel
     hash_outputs >"${TEST_TMPDIR}/sum1"
@@ -73,6 +78,7 @@
       --output_base="${TEST_TMPDIR}/out2" \
       build \
       --distdir=$distdir \
+      --override_repository=maven=$maven \
       --nostamp \
       //src:bazel
     hash_outputs >"${TEST_TMPDIR}/sum2"
diff --git a/src/test/shell/bazel/verify_workspace.sh b/src/test/shell/bazel/verify_workspace.sh
index a7f8969..26f3d13 100755
--- a/src/test/shell/bazel/verify_workspace.sh
+++ b/src/test/shell/bazel/verify_workspace.sh
@@ -42,6 +42,9 @@
 
 WORKSPACE_FILES=("$(rlocation io_bazel/WORKSPACE)" "$(rlocation io_bazel/distdir_deps.bzl)")
 
+# base maven repository URLs can return 404s.
+URL_ALLOWLIST=("https://dl.google.com/android/maven2" "https://repo1.maven.org/maven2")
+
 function test_verify_urls() {
   # Find url-shaped lines, skipping jekyll-tree (which isn't a valid URL), and
   # skipping comments.
@@ -51,6 +54,9 @@
     for url in $(grep -E '"https://|http://' "${file}" | \
       sed -e '/jekyll-tree/d' -e '/^#/d' -r -e  's#^.*"(https?://[^"]+)".*$#\1#g' | \
       sort -u); do
+      if [[ " ${URL_ALLOWLIST[*]} " =~ " ${url} " ]]; then
+        continue
+      fi
       # add only unique url to the array
       if [[ ${#checked_urls[@]} == 0 ]] || [[ ! " ${checked_urls[@]} " =~ " ${url} " ]]; then
         checked_urls+=("${url}")