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",