From 6a9ea8b65f5bfe8bce255a0a1737d7e1e25a34f7 Mon Sep 17 00:00:00 2001 From: James Baker Date: Fri, 16 Sep 2022 16:22:40 +0100 Subject: [PATCH] Exclude Spark UnusedStubClass from class uniqueness (#2390) --- changelog/@unreleased/pr-2390.v2.yml | 5 +++++ .../baseline/services/JarClassHasher.java | 13 ++++++++++--- ...ineClassUniquenessPluginIntegrationTest.groovy | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 changelog/@unreleased/pr-2390.v2.yml diff --git a/changelog/@unreleased/pr-2390.v2.yml b/changelog/@unreleased/pr-2390.v2.yml new file mode 100644 index 000000000..cde8808b0 --- /dev/null +++ b/changelog/@unreleased/pr-2390.v2.yml @@ -0,0 +1,5 @@ +type: improvement +improvement: + description: Exclude Spark UnusedStubClass from class uniqueness + links: + - https://github.com/palantir/gradle-baseline/pull/2390 diff --git a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/services/JarClassHasher.java b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/services/JarClassHasher.java index 34eab9e99..fdcdfcac7 100644 --- a/gradle-baseline-java/src/main/groovy/com/palantir/baseline/services/JarClassHasher.java +++ b/gradle-baseline-java/src/main/groovy/com/palantir/baseline/services/JarClassHasher.java @@ -74,9 +74,7 @@ public final Result hashClasses(ResolvedArtifact resolvedArtifact, Logger logger continue; } - if (entry.getName().contains("module-info.class")) { - // Java 9 allows jars to have a module-info.class file in the root, - // we shouldn't complain about these. + if (isExcluded(entry.getName())) { continue; } @@ -116,4 +114,13 @@ public final void close() { cache.invalidateAll(); cache.cleanUp(); } + + /** + * Java 9 allows jars to have a module-info.class, we shouldn't complain about these. + * Spark contains an 'UnusedStubClass' which generates many false positives, we shouldn't complain about this, + * either. + */ + private static boolean isExcluded(String path) { + return path.endsWith("module-info.class") || path.equals("org/apache/spark/unused/UnusedStubClass.class"); + } } diff --git a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineClassUniquenessPluginIntegrationTest.groovy b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineClassUniquenessPluginIntegrationTest.groovy index 9e91f4363..bf07daa61 100644 --- a/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineClassUniquenessPluginIntegrationTest.groovy +++ b/gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineClassUniquenessPluginIntegrationTest.groovy @@ -104,6 +104,21 @@ class BaselineClassUniquenessPluginIntegrationTest extends AbstractPluginTest { with('checkClassUniqueness', '-s').build() } + def 'ignores duplicates based on module-info and UnusedStubClass'() { + when: + buildFile << standardBuildFile + buildFile << """ + dependencies { + // depends on spark-network-common, which also contains UnusedStubClass. Also depends on versions of Jackson + // that use module-info.java. + api 'org.apache.spark:spark-network-shuffle_2.13:3.3.0' + } + """.stripIndent() + + then: + with('checkClassUniqueness', '-s').build() + } + def 'task should be up-to-date when classpath is unchanged'() { when: buildFile << standardBuildFile