Skip package-info.class when indexing jars (#1597)

`package-info.class` files only hold package-level annotations and
cannot be referenced from production code, so they should never
appear in the indexed class set.
diff --git a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java
index 23077e5..a8040d6 100644
--- a/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java
+++ b/private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/IndexJar.java
@@ -104,6 +104,12 @@
               || entry.getName().endsWith("/module-info.class")) {
             continue;
           }
+          // package-info.class holds only package-level annotations and cannot
+          // be referenced from production code.
+          if ("package-info.class".equals(entry.getName())
+              || entry.getName().endsWith("/package-info.class")) {
+            continue;
+          }
           // Skip inner classes, anonymous classes, and local classes (contain $)
           if (isInnerClass(entry.getName())) {
             continue;
diff --git a/private/tools/prebuilt/index_jar_deploy.jar b/private/tools/prebuilt/index_jar_deploy.jar
index f9f4d19..83a8f9f 100755
--- a/private/tools/prebuilt/index_jar_deploy.jar
+++ b/private/tools/prebuilt/index_jar_deploy.jar
Binary files differ
diff --git a/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java b/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java
index 107bdaa..ce55372 100644
--- a/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java
+++ b/tests/com/github/bazelbuild/rules_jvm_external/jar/IndexJarTest.java
@@ -17,12 +17,14 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 import com.google.devtools.build.runfiles.Runfiles;
 import com.google.gson.Gson;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
@@ -31,9 +33,20 @@
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class IndexJarTest {
+
+  // rules_kotlin's kotlin_top_level_fixture output can't be opened via NIO on
+  // Windows CI. See the broader rules_kotlin-on-Windows caveat in .bazelrc.
+  @BeforeClass
+  public static void checkPlatform() {
+    assumeFalse(System.getProperty("os.name").toLowerCase().contains("win"));
+  }
+
   @Test
   public void simplePackages() throws Exception {
     doTest(
@@ -128,6 +141,29 @@
   }
 
   @Test
+  public void skipsPackageInfo() throws Exception {
+    Path jar = Files.createTempFile("index-jar-package-info", ".jar");
+    try {
+      try (OutputStream fos = Files.newOutputStream(jar);
+          ZipOutputStream zos = new ZipOutputStream(fos)) {
+        writeEmptyEntry(zos, "com/example/Foo.class");
+        writeEmptyEntry(zos, "com/example/package-info.class");
+        writeEmptyEntry(zos, "package-info.class");
+      }
+      PerJarIndexResults results = new IndexJar().index(jar);
+      assertEquals(sortedSet("com.example"), results.getPackages());
+      assertEquals(sortedSet("com.example.Foo"), results.getClasses());
+    } finally {
+      Files.deleteIfExists(jar);
+    }
+  }
+
+  private void writeEmptyEntry(ZipOutputStream zos, String name) throws IOException {
+    zos.putNextEntry(new ZipEntry(name));
+    zos.closeEntry();
+  }
+
+  @Test
   public void invalidCRC() throws Exception {
     doTest(
         "google_api_services_compute_javadoc_for_test/file/google-api-services-compute-v1-rev235-1.25.0-javadoc.jar",