Remove duplication and update Zulu mirror URLs

Also add tests for:
 - ensuring that the duplicated remote jdks configurations are in sync
 - mirror URLs exist

PiperOrigin-RevId: 644647498
Change-Id: I9e70ecf27c496db6f74ab78f3f03b63f7541ab0a
diff --git a/java/bazel/repositories_util.bzl b/java/bazel/repositories_util.bzl
index 02f8a31..d895fc2 100644
--- a/java/bazel/repositories_util.bzl
+++ b/java/bazel/repositories_util.bzl
@@ -123,9 +123,10 @@
         platform = "win"
         arch = "aarch64" if arch == "arm64" else arch
     archive_name = "zulu" + release + "-" + platform + "_" + arch
+    primary_url = "cdn.azul.com/zulu/bin/" + archive_name + ext
     urls = [
-        "https://cdn.azul.com/zulu/bin/" + archive_name + ext,
-        "https://mirror.bazel.build/openjdk/azul-zulu-" + release + "/" + archive_name + ext,
+        "https://" + primary_url,
+        "https://mirror.bazel.build/" + primary_url,
     ]
     return urls, archive_name
 
@@ -135,23 +136,27 @@
     if cpu == "ppc":
         arch = "ppc64le"
     archive_name = "OpenJDK" + version + "U-jdk_" + arch + "_" + os + "_hotspot_" + release.replace("+", "_") + ".tar.gz"
+    primary_url = "github.com/adoptium/temurin" + version + "-binaries/releases/download/jdk-" + release + "/" + archive_name
     urls = [
-        "https://github.com/adoptium/temurin" + version + "-binaries/releases/download/jdk-" + release + "/" + archive_name,
-        "https://mirror.bazel.build/github.com/adoptium/temurin" + version + "-binaries/releases/download/jdk-" + release + "/" + archive_name,
+        "https://" + primary_url,
+        "https://mirror.bazel.build/" + primary_url,
     ]
     return urls, "jdk-" + release
 
 def _microsoft_windows_arm64_remote_jdk_repo(release):
+    primary_url = "aka.ms/download-jdk/microsoft-jdk-" + release + "-windows-aarch64.zip"
     urls = [
-        "https://aka.ms/download-jdk/microsoft-jdk-" + release + "-windows-aarch64.zip",
-        "https://mirror.bazel.build/aka.ms/download-jdk/microsoft-jdk-" + release + "-windows-aarch64.zip",
+        "https://" + primary_url,
+        "https://mirror.bazel.build/" + primary_url,
     ]
     return urls, ""
 
 def _adoptopenjdk_remote_jdk_repo(version, os, cpu, release):
     archive = "OpenJDK" + version + "U-jdk_" + cpu + "_" + os + "_hotspot_" + release.replace("-", "") + ".tar.gz"
+    primary_url = "github.com/AdoptOpenJDK/openjdk" + version + "-binaries/releases/download/jdk" + release + "/" + archive
     urls = [
-        "https://github.com/AdoptOpenJDK/openjdk" + version + "-binaries/releases/download/jdk" + release + "/" + archive,
+        "https://" + primary_url,
+        "https://mirror.bazel.build/" + primary_url,
     ]
     return urls, "jdk" + release
 
diff --git a/java/repositories.bzl b/java/repositories.bzl
index cfb12d5..133a9d0 100644
--- a/java/repositories.bzl
+++ b/java/repositories.bzl
@@ -80,7 +80,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:aarch64"],
         sha256 = "82c46c65d57e187ef68fdd125ef760eaeb52ebfe1be1a6a251cf5b43cbebc78a",
         strip_prefix = "zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-8.78.0.19-ca-jdk8.0.412/zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_aarch64.tar.gz"],
         version = "8",
     ),
     struct(
@@ -88,7 +88,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:x86_64"],
         sha256 = "9c0ac5ebffa61520fee78ead52add0f4edd3b1b54b01b6a17429b719515caf90",
         strip_prefix = "zulu8.78.0.19-ca-jdk8.0.412-linux_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-8.78.0.19-ca-jdk8.0.412/zulu8.78.0.19-ca-jdk8.0.412-linux_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-linux_x64.tar.gz"],
         version = "8",
     ),
     struct(
@@ -96,7 +96,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:aarch64"],
         sha256 = "35bc35808379400e4a70e1f7ee379778881799b93c2cc9fe1ae515c03c2fb057",
         strip_prefix = "zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-8.78.0.19-ca-jdk8.0.412/zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_aarch64.tar.gz"],
         version = "8",
     ),
     struct(
@@ -104,7 +104,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:x86_64"],
         sha256 = "2bfa0506196962bddb21a604eaa2b0b39eaf3383d0bdad08bdbe7f42f25d8928",
         strip_prefix = "zulu8.78.0.19-ca-jdk8.0.412-macosx_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-8.78.0.19-ca-jdk8.0.412/zulu8.78.0.19-ca-jdk8.0.412-macosx_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-macosx_x64.tar.gz"],
         version = "8",
     ),
     struct(
@@ -112,7 +112,7 @@
         target_compatible_with = ["@platforms//os:windows", "@platforms//cpu:x86_64"],
         sha256 = "ca5499c301d5b42604d8535b8c40a7f928a796247b8c66a600333dd799798ff7",
         strip_prefix = "zulu8.78.0.19-ca-jdk8.0.412-win_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-win_x64.zip", "https://mirror.bazel.build/openjdk/azul-zulu-8.78.0.19-ca-jdk8.0.412/zulu8.78.0.19-ca-jdk8.0.412-win_x64.zip"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-win_x64.zip", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu8.78.0.19-ca-jdk8.0.412-win_x64.zip"],
         version = "8",
     ),
     struct(
@@ -120,7 +120,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:s390x"],
         sha256 = "276a431c79b7e94bc1b1b4fd88523383ae2d635ea67114dfc8a6174267f8fb2c",
         strip_prefix = "jdk8u292-b10",
-        urls = ["https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_s390x_linux_hotspot_8u292b10.tar.gz"],
+        urls = ["https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_s390x_linux_hotspot_8u292b10.tar.gz", "https://mirror.bazel.build/github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_s390x_linux_hotspot_8u292b10.tar.gz"],
         version = "8",
     ),
     struct(
@@ -128,7 +128,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:aarch64"],
         sha256 = "be7d7574253c893eb58f66e985c75adf48558c41885827d1f02f827e109530e0",
         strip_prefix = "zulu11.72.19-ca-jdk11.0.23-linux_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-11.72.19-ca-jdk11.0.23/zulu11.72.19-ca-jdk11.0.23-linux_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_aarch64.tar.gz"],
         version = "11",
     ),
     struct(
@@ -136,7 +136,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:x86_64"],
         sha256 = "0a4d1bfc7a96a7f9f5329b72b9801b3c53366417b4753f1b658fa240204c7347",
         strip_prefix = "zulu11.72.19-ca-jdk11.0.23-linux_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-11.72.19-ca-jdk11.0.23/zulu11.72.19-ca-jdk11.0.23-linux_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-linux_x64.tar.gz"],
         version = "11",
     ),
     struct(
@@ -144,7 +144,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:aarch64"],
         sha256 = "40fb1918385e03814b67b7608c908c7f945ccbeddbbf5ed062cdfb2602e21c83",
         strip_prefix = "zulu11.72.19-ca-jdk11.0.23-macosx_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-11.72.19-ca-jdk11.0.23/zulu11.72.19-ca-jdk11.0.23-macosx_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_aarch64.tar.gz"],
         version = "11",
     ),
     struct(
@@ -152,7 +152,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:x86_64"],
         sha256 = "e5b19b82045826ae09c9d17742691bc9e40312c44be7bd7598ae418a3d4edb1c",
         strip_prefix = "zulu11.72.19-ca-jdk11.0.23-macosx_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-11.72.19-ca-jdk11.0.23/zulu11.72.19-ca-jdk11.0.23-macosx_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-macosx_x64.tar.gz"],
         version = "11",
     ),
     struct(
@@ -160,7 +160,7 @@
         target_compatible_with = ["@platforms//os:windows", "@platforms//cpu:x86_64"],
         sha256 = "1295b2affe498018c45f6f15187b58c4456d51dce5eb608ee73ef7665d4566d2",
         strip_prefix = "zulu11.72.19-ca-jdk11.0.23-win_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-win_x64.zip", "https://mirror.bazel.build/openjdk/azul-zulu-11.72.19-ca-jdk11.0.23/zulu11.72.19-ca-jdk11.0.23-win_x64.zip"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-win_x64.zip", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu11.72.19-ca-jdk11.0.23-win_x64.zip"],
         version = "11",
     ),
     struct(
@@ -192,7 +192,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:aarch64"],
         sha256 = "518cc455c0c7b49c0ae7d809c0bb87ab371bb850d46abb8efad5010c6a06faec",
         strip_prefix = "zulu17.50.19-ca-jdk17.0.11-linux_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-17.50.19-ca-jdk17.0.11/zulu17.50.19-ca-jdk17.0.11-linux_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_aarch64.tar.gz"],
         version = "17",
     ),
     struct(
@@ -200,7 +200,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:x86_64"],
         sha256 = "a1e8ac9ae5804b84dc07cf9d8ebe1b18247d70c92c1e0de97ea10109563f4379",
         strip_prefix = "zulu17.50.19-ca-jdk17.0.11-linux_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-17.50.19-ca-jdk17.0.11/zulu17.50.19-ca-jdk17.0.11-linux_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-linux_x64.tar.gz"],
         version = "17",
     ),
     struct(
@@ -208,7 +208,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:aarch64"],
         sha256 = "dd1a82d57e80cdefb045066e5c28b5bd41e57eea9c57303ec7e012b57230bb9c",
         strip_prefix = "zulu17.50.19-ca-jdk17.0.11-macosx_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-17.50.19-ca-jdk17.0.11/zulu17.50.19-ca-jdk17.0.11-macosx_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_aarch64.tar.gz"],
         version = "17",
     ),
     struct(
@@ -216,7 +216,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:x86_64"],
         sha256 = "b384991e93af39abe5229c7f5efbe912a7c5a6480674a6e773f3a9128f96a764",
         strip_prefix = "zulu17.50.19-ca-jdk17.0.11-macosx_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-17.50.19-ca-jdk17.0.11/zulu17.50.19-ca-jdk17.0.11-macosx_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-macosx_x64.tar.gz"],
         version = "17",
     ),
     struct(
@@ -224,7 +224,7 @@
         target_compatible_with = ["@platforms//os:windows", "@platforms//cpu:arm64"],
         sha256 = "b8833d272eb31f54f8c881139807a28a74de9deae07d2cc37688ff72043e32c9",
         strip_prefix = "zulu17.50.19-ca-jdk17.0.11-win_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_aarch64.zip", "https://mirror.bazel.build/openjdk/azul-zulu-17.50.19-ca-jdk17.0.11/zulu17.50.19-ca-jdk17.0.11-win_aarch64.zip"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_aarch64.zip", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_aarch64.zip"],
         version = "17",
     ),
     struct(
@@ -232,7 +232,7 @@
         target_compatible_with = ["@platforms//os:windows", "@platforms//cpu:x86_64"],
         sha256 = "43f0f1bdecf48ba9763d46ee7784554c95b442ffdd39ebd62dc8b297cc82e116",
         strip_prefix = "zulu17.50.19-ca-jdk17.0.11-win_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_x64.zip", "https://mirror.bazel.build/openjdk/azul-zulu-17.50.19-ca-jdk17.0.11/zulu17.50.19-ca-jdk17.0.11-win_x64.zip"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_x64.zip", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu17.50.19-ca-jdk17.0.11-win_x64.zip"],
         version = "17",
     ),
     struct(
@@ -256,7 +256,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:aarch64"],
         sha256 = "c898d4ce365c8926e22859c06be4a81bafb9fd0126088867e15a528fe99b1599",
         strip_prefix = "zulu21.34.19-ca-jdk21.0.3-linux_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-linux_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-21.34.19-ca-jdk21.0.3/zulu21.34.19-ca-jdk21.0.3-linux_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-linux_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-linux_aarch64.tar.gz"],
         version = "21",
     ),
     struct(
@@ -264,7 +264,7 @@
         target_compatible_with = ["@platforms//os:linux", "@platforms//cpu:x86_64"],
         sha256 = "ca763d1308a6bcc768382f160733a08e591d5f595a7dd9e51b60d27d54828dcc",
         strip_prefix = "zulu21.34.19-ca-jdk21.0.3-linux_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-linux_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-21.34.19-ca-jdk21.0.3/zulu21.34.19-ca-jdk21.0.3-linux_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-linux_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-linux_x64.tar.gz"],
         version = "21",
     ),
     struct(
@@ -272,7 +272,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:aarch64"],
         sha256 = "4f42a561909d71868a700cf2efa1390e1b9e04863f3fa75ea30c4965e5a702f0",
         strip_prefix = "zulu21.34.19-ca-jdk21.0.3-macosx_aarch64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-macosx_aarch64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-21.34.19-ca-jdk21.0.3/zulu21.34.19-ca-jdk21.0.3-macosx_aarch64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-macosx_aarch64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-macosx_aarch64.tar.gz"],
         version = "21",
     ),
     struct(
@@ -280,7 +280,7 @@
         target_compatible_with = ["@platforms//os:macos", "@platforms//cpu:x86_64"],
         sha256 = "148006a220a18922d7a9c52ac0bad099c5b4e60334a8d02b11f8c945e9ec9a34",
         strip_prefix = "zulu21.34.19-ca-jdk21.0.3-macosx_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-macosx_x64.tar.gz", "https://mirror.bazel.build/openjdk/azul-zulu-21.34.19-ca-jdk21.0.3/zulu21.34.19-ca-jdk21.0.3-macosx_x64.tar.gz"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-macosx_x64.tar.gz", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-macosx_x64.tar.gz"],
         version = "21",
     ),
     struct(
@@ -288,7 +288,7 @@
         target_compatible_with = ["@platforms//os:windows", "@platforms//cpu:x86_64"],
         sha256 = "fb9f0dc6a484b0b169b3b3a3c2425d5f62bebfd15cb06c1597e33f77959c72af",
         strip_prefix = "zulu21.34.19-ca-jdk21.0.3-win_x64",
-        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-win_x64.zip", "https://mirror.bazel.build/openjdk/azul-zulu-21.34.19-ca-jdk21.0.3/zulu21.34.19-ca-jdk21.0.3-win_x64.zip"],
+        urls = ["https://cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-win_x64.zip", "https://mirror.bazel.build/cdn.azul.com/zulu/bin/zulu21.34.19-ca-jdk21.0.3-win_x64.zip"],
         version = "21",
     ),
     struct(
diff --git a/test/BUILD.bazel b/test/BUILD.bazel
index 554df4b..d8b2d13 100644
--- a/test/BUILD.bazel
+++ b/test/BUILD.bazel
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 load("//java:repositories.bzl", "REMOTE_JDK_CONFIGS")
+load(":check_remotejdk_configs_match.bzl", "validate_configs")
 
 sh_test(
     name = "check_remote_jdk_configs_test",
@@ -20,6 +21,7 @@
         ",".join([
             config.name,
             config.urls[0],
+            config.urls[1] if len(config.urls) > 1 else "",
             config.sha256,
             config.strip_prefix,
         ])
@@ -27,3 +29,5 @@
         for config in configs
     ],
 )
+
+validate_configs()
diff --git a/test/check_remote_jdk_configs.sh b/test/check_remote_jdk_configs.sh
index 3de64be..ab42ba1 100755
--- a/test/check_remote_jdk_configs.sh
+++ b/test/check_remote_jdk_configs.sh
@@ -15,9 +15,10 @@
 
 echo "Checking hashes and strip_prefix for $# configs"
 
+_MISSING_MIRRORS=()
 for config in "$@"; do
     TMP_FILE=$(mktemp -q /tmp/remotejdk.XXXXXX)
-    IFS=, read -r name url hash strip_prefix <<< "${config}"
+    IFS=, read -r name url mirror_url hash strip_prefix <<< "${config}"
     echo "fetching $name from $url to ${TMP_FILE}"
     curl --silent -o ${TMP_FILE} -L "$url"
     actual_hash=`sha256sum ${TMP_FILE} | cut -d' ' -f1`
@@ -37,4 +38,16 @@
       echo "ERROR: bad strip_prefix for ${name}, wanted: ${strip_prefix}/, got: ${root_dir}"
       exit 1
     fi
-done
\ No newline at end of file
+    if [[ -n "${mirror_url}" ]]; then
+      echo "checking mirror: ${mirror_url}"
+      curl --silent --fail -I -L ${mirror_url} > /dev/null || { _MISSING_MIRRORS+="${mirror_url}"; }
+    fi
+done
+
+if [[ ${#_MISSING_MIRRORS[@]} -gt 0 ]]; then
+  echo "Missing mirror URLs:"
+  for m in "${_MISSING_MIRRORS[@]}"; do
+    echo "  ${m}"
+  done
+  exit 1
+fi
\ No newline at end of file
diff --git a/test/check_remotejdk_configs_match.bzl b/test/check_remotejdk_configs_match.bzl
new file mode 100644
index 0000000..5060cda
--- /dev/null
+++ b/test/check_remotejdk_configs_match.bzl
@@ -0,0 +1,27 @@
+# Copyright 2024 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.
+"""Checks for keeping repository_util.bzl and repositories.bzl in sync"""
+
+load("//java:repositories.bzl", "REMOTE_JDK_CONFIGS")
+load("//java/bazel:repositories_util.bzl", "FLAT_CONFIGS")
+
+def validate_configs():
+    """Ensures repository_util.bzl and repositories.bzl are in sync"""
+    for expected in FLAT_CONFIGS:
+        actual = [cfg for cfg in REMOTE_JDK_CONFIGS[expected.version] if cfg.name == expected.name]
+        if len(actual) != 1:
+            fail("Expected to find exactly one configuration for:", expected.name, "found: ", actual)
+        actual = actual[0]
+        if expected.urls != actual.urls or expected.strip_prefix != actual.strip_prefix:
+            fail("config mismatch! wanted:", expected, "got:", actual)