From 28f25c2b14a3b27866ab3a87cbf99c85447db768 Mon Sep 17 00:00:00 2001 From: tavori <230928651+tavori@users.noreply.github.com> Date: Fri, 26 Jun 2026 14:55:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20fix=20#2983,=20expandWildcardImports=20t?= =?UTF-8?q?riggers=20a=20full=20transitive=20resolution=20of=20the=20proje?= =?UTF-8?q?ct's=20runtime=20dependencies=20=E2=80=94=20even=20when=20no=20?= =?UTF-8?q?formatter=20step=20needs=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin-maven/CHANGES.md | 2 ++ .../diffplug/spotless/maven/AbstractSpotlessMojo.java | 9 +++++---- .../com/diffplug/spotless/maven/FormatterConfig.java | 11 ++++++----- .../com/diffplug/spotless/maven/FormatterFactory.java | 2 +- .../diffplug/spotless/maven/FormatterStepConfig.java | 11 ++++++----- .../spotless/maven/java/ExpandWildcardImports.java | 5 ++++- 6 files changed, 24 insertions(+), 16 deletions(-) diff --git a/plugin-maven/CHANGES.md b/plugin-maven/CHANGES.md index 160921f758..8c89474b91 100644 --- a/plugin-maven/CHANGES.md +++ b/plugin-maven/CHANGES.md @@ -5,6 +5,8 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ## [Unreleased] ### Added - Add support for custom string format for license header copyright year via `yearStringFormat()`. ([#2965](https://github.com/diffplug/spotless/pull/2965)) +### Fixed +- `` no longer triggers a full transitive dependency resolution on every build. Dependency resolution is now deferred until the step actually runs, so projects that do not use `` (or that use version ranges) are no longer penalized. ([#2983](https://github.com/diffplug/spotless/issues/2983)) ## [3.7.0] - 2026-06-16 ### Fixed diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/AbstractSpotlessMojo.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/AbstractSpotlessMojo.java index 520211334c..b744ddf418 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/AbstractSpotlessMojo.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/AbstractSpotlessMojo.java @@ -417,11 +417,12 @@ private FormatterConfig getFormatterConfig() { final Optional userRatchetFrom = Optional.ofNullable((String) mavenSession.getUserProperties().get("ratchetFrom")); final Optional optionalRatchetFrom = Optional.ofNullable(this.ratchetFrom) .filter(ratchet -> !RATCHETFROM_NONE.equals(ratchet)); - Optional> projectClasspath = computeTypeSolverClasspath(resolver); - return new FormatterConfig(baseDir, encoding, lineEndings, userRatchetFrom, optionalRatchetFrom, provisioner, p2Provisioner, fileLocator, formatterStepFactories, Optional.ofNullable(setLicenseHeaderYearsFromGitHistory), lintSuppressions, projectClasspath); + // Lazy: only resolve dependencies when the expandWildcardImports step actually requests the classpath. + Supplier> projectClasspathSupplier = () -> computeTypeSolverClasspath(resolver); + return new FormatterConfig(baseDir, encoding, lineEndings, userRatchetFrom, optionalRatchetFrom, provisioner, p2Provisioner, fileLocator, formatterStepFactories, Optional.ofNullable(setLicenseHeaderYearsFromGitHistory), lintSuppressions, Optional.of(projectClasspathSupplier)); } - private Optional> computeTypeSolverClasspath(ArtifactResolver resolver) { + private Set computeTypeSolverClasspath(ArtifactResolver resolver) { Set classpath = new LinkedHashSet<>(); // Add source roots (directories containing .java files for JavaParserTypeSolver) @@ -446,7 +447,7 @@ private Optional> computeTypeSolverClasspath(ArtifactResolver resolver getLog().warn("Could not resolve project dependencies for expandWildcardImports: " + e.getMessage()); } - return Optional.of(classpath); + return classpath; } private FileLocator getFileLocator() { diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterConfig.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterConfig.java index de1ef0a3ac..ad368686b3 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterConfig.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterConfig.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Supplier; import com.diffplug.spotless.LineEnding; import com.diffplug.spotless.LintSuppression; @@ -39,10 +40,10 @@ public class FormatterConfig { private final List globalStepFactories; private final Optional spotlessSetLicenseHeaderYearsFromGitHistory; private final List lintSuppressions; - private final Optional> projectClasspath; + private final Optional>> projectClasspathSupplier; public FormatterConfig(File baseDir, String encoding, LineEnding lineEndings, Optional userRatchetFrom, Optional ratchetFrom, Provisioner provisioner, - P2Provisioner p2Provisioner, FileLocator fileLocator, List globalStepFactories, Optional spotlessSetLicenseHeaderYearsFromGitHistory, List lintSuppressions, Optional> projectClasspath) { + P2Provisioner p2Provisioner, FileLocator fileLocator, List globalStepFactories, Optional spotlessSetLicenseHeaderYearsFromGitHistory, List lintSuppressions, Optional>> projectClasspathSupplier) { this.encoding = encoding; this.lineEndings = lineEndings; this.userRatchetFrom = userRatchetFrom; @@ -53,7 +54,7 @@ public FormatterConfig(File baseDir, String encoding, LineEnding lineEndings, Op this.globalStepFactories = globalStepFactories; this.spotlessSetLicenseHeaderYearsFromGitHistory = spotlessSetLicenseHeaderYearsFromGitHistory; this.lintSuppressions = lintSuppressions; - this.projectClasspath = projectClasspath; + this.projectClasspathSupplier = projectClasspathSupplier; } public String getEncoding() { @@ -96,7 +97,7 @@ public List getLintSuppressions() { return unmodifiableList(lintSuppressions); } - public Optional> getProjectClasspath() { - return projectClasspath; + public Optional>> getProjectClasspathSupplier() { + return projectClasspathSupplier; } } diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterFactory.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterFactory.java index 8e0f14bcd2..83579b9744 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterFactory.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterFactory.java @@ -187,7 +187,7 @@ private Optional optionalRatchetFrom() { } private FormatterStepConfig stepConfig(Charset encoding, FormatterConfig config) { - return new FormatterStepConfig(encoding, licenseHeaderDelimiter(), ratchetFrom(config), config.getProvisioner(), config.getP2Provisioner(), config.getFileLocator(), config.getSpotlessSetLicenseHeaderYearsFromGitHistory(), config.getProjectClasspath()); + return new FormatterStepConfig(encoding, licenseHeaderDelimiter(), ratchetFrom(config), config.getProvisioner(), config.getP2Provisioner(), config.getFileLocator(), config.getSpotlessSetLicenseHeaderYearsFromGitHistory(), config.getProjectClasspathSupplier()); } private static List gatherStepFactories(List allGlobal, List allConfigured) { diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterStepConfig.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterStepConfig.java index ca4eb6955b..23262efede 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterStepConfig.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/FormatterStepConfig.java @@ -19,6 +19,7 @@ import java.nio.charset.Charset; import java.util.Optional; import java.util.Set; +import java.util.function.Supplier; import com.diffplug.spotless.Provisioner; import com.diffplug.spotless.extra.P2Provisioner; @@ -32,9 +33,9 @@ public class FormatterStepConfig { private final P2Provisioner p2Provisioner; private final FileLocator fileLocator; private final Optional spotlessSetLicenseHeaderYearsFromGitHistory; - private final Optional> projectClasspath; + private final Optional>> projectClasspathSupplier; - public FormatterStepConfig(Charset encoding, String licenseHeaderDelimiter, Optional ratchetFrom, Provisioner provisioner, P2Provisioner p2Provisioner, FileLocator fileLocator, Optional spotlessSetLicenseHeaderYearsFromGitHistory, Optional> projectClasspath) { + public FormatterStepConfig(Charset encoding, String licenseHeaderDelimiter, Optional ratchetFrom, Provisioner provisioner, P2Provisioner p2Provisioner, FileLocator fileLocator, Optional spotlessSetLicenseHeaderYearsFromGitHistory, Optional>> projectClasspathSupplier) { this.encoding = encoding; this.licenseHeaderDelimiter = licenseHeaderDelimiter; this.ratchetFrom = ratchetFrom; @@ -42,7 +43,7 @@ public FormatterStepConfig(Charset encoding, String licenseHeaderDelimiter, Opti this.p2Provisioner = p2Provisioner; this.fileLocator = fileLocator; this.spotlessSetLicenseHeaderYearsFromGitHistory = spotlessSetLicenseHeaderYearsFromGitHistory; - this.projectClasspath = projectClasspath; + this.projectClasspathSupplier = projectClasspathSupplier; } public Charset getEncoding() { @@ -73,7 +74,7 @@ public Optional spotlessSetLicenseHeaderYearsFromGitHistory() { return spotlessSetLicenseHeaderYearsFromGitHistory; } - public Optional> getProjectClasspath() { - return projectClasspath; + public Optional>> getProjectClasspathSupplier() { + return projectClasspathSupplier; } } diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/java/ExpandWildcardImports.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/java/ExpandWildcardImports.java index c49d1d5c8a..e513fa1afc 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/java/ExpandWildcardImports.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/java/ExpandWildcardImports.java @@ -18,6 +18,7 @@ import java.io.File; import java.util.Collections; import java.util.Set; +import java.util.function.Supplier; import com.diffplug.spotless.FormatterStep; import com.diffplug.spotless.java.ExpandWildcardImportsStep; @@ -27,7 +28,9 @@ public class ExpandWildcardImports implements FormatterStepFactory { @Override public FormatterStep newFormatterStep(FormatterStepConfig config) { - Set classpath = config.getProjectClasspath().orElse(Collections.emptySet()); + Set classpath = config.getProjectClasspathSupplier() + .map(Supplier::get) + .orElse(Collections.emptySet()); return ExpandWildcardImportsStep.create(classpath, config.getProvisioner()); } }