From fb527659acb076cedfa9482bcc0ff58332ff73ab Mon Sep 17 00:00:00 2001 From: Burak KALAYCI Date: Sun, 16 Aug 2026 12:18:27 +0300 Subject: [PATCH] fix: resolve expandWildcardImports classpath from Java source sets expandWildcardImports() walked every resolvable Gradle configuration. Unrelated configs (generated output, custom resolvable configs) were resolved at configuration time and could fail the build. Use each Java source set's compile classpath instead. Fixes #2998 --- plugin-gradle/CHANGES.md | 1 + .../gradle/spotless/JavaExtension.java | 6 ++-- .../spotless/JavaDefaultTargetTest.java | 32 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index 169371d109..939ee89c1e 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -4,6 +4,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ## [Unreleased] ### Fixed +- `expandWildcardImports()` now builds its type-solver classpath from each Java source set's compile classpath instead of every resolvable configuration. Unrelated configurations (for example generated-code or custom resolvable configs that are not ready yet) are no longer resolved. ([#2998](https://github.com/diffplug/spotless/issues/2998)) - `spotlessCheck` violation message now suggests the correct composite/included-build task path (e.g. `./gradlew :my-utils:spotlessApply`) instead of a bare `spotlessApply` / `:spotlessApply` that does not select included-build tasks. ([#2421](https://github.com/diffplug/spotless/issues/2421)) - Parallel multi-project builds no longer intermittently fail with "Cannot fingerprint input property 'stepsInternalEquality': ConfigurationCacheHackList cannot be serialized" / "Failed to provision P2 dependencies" when using `eclipse()` (or other P2-backed steps). Subprojects now share one deduping P2 provisioner and P2 queries are serialized process-wide. ([#3004](https://github.com/diffplug/spotless/issues/3004)) ### Changes diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java index 4bdbd5266d..ea93fb23ca 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java @@ -31,7 +31,6 @@ import javax.inject.Inject; import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; @@ -176,7 +175,10 @@ public void forbidModuleImports() { public void expandWildcardImports() { SourceSetContainer sourceSets = getSourceSets(getProject(), "expansion of wildcards requires the 'java' plugin to be applied"); Set typeSolverClasspath = sourceSets.stream().flatMap(s -> s.getAllJava().getSrcDirs().stream()).collect(toSet()); - getProject().getConfigurations().stream().filter(Configuration::isCanBeResolved).flatMap(c -> c.getFiles().stream()).forEach(typeSolverClasspath::add); + sourceSets.stream() + .map(SourceSet::getCompileClasspath) + .flatMap(classpath -> classpath.getFiles().stream()) + .forEach(typeSolverClasspath::add); addStep(ExpandWildcardImportsStep.create(typeSolverClasspath, provisioner())); } diff --git a/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/JavaDefaultTargetTest.java b/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/JavaDefaultTargetTest.java index 71fd2771e0..60762dce8f 100644 --- a/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/JavaDefaultTargetTest.java +++ b/plugin-gradle/src/test/java/com/diffplug/gradle/spotless/JavaDefaultTargetTest.java @@ -176,6 +176,38 @@ void expandWildCardImports() throws IOException { assertFile("src/main/java/foo/bar/JavaCodeWildcardsUnformatted.java").sameAsResource("java/expandwildcardimports/JavaClassWithWildcardsFormatted.test"); } + @Test + void expandWildcardImportsIgnoresUnrelatedConfigurations() throws IOException { + setFile("build.gradle").toLines( + "plugins {", + " id 'java'", + " id 'com.diffplug.spotless'", + "}", + "", + "repositories { mavenCentral() }", + "", + "configurations {", + " leftover {", + " canBeResolved = true", + " canBeConsumed = false", + " }", + "}", + "", + "dependencies {", + " leftover 'does.not:exist:1.0'", + "}", + "", + "spotless {", + " java {", + " target file('src/main/java/test.java')", + " expandWildcardImports()", + " }", + "}"); + setFile("src/main/java/test.java").toResource("java/googlejavaformat/JavaCodeUnformatted.test"); + gradleRunner().withArguments("spotlessApply").build(); + assertFile("src/main/java/test.java").sameAsResource("java/googlejavaformat/JavaCodeUnformatted.test"); + } + /** * Triggers the special case in {@link FormatExtension#setupTask(SpotlessTask)} with {@code toggleFence} and * {@code targetExcludeContentPattern} both being not {@code null}.