From 513a3827d7910cf48ecbcb369e3c0e41fcb4cf91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kalayc=C4=B1?= Date: Sun, 2 Aug 2026 16:46:50 +0300 Subject: [PATCH 1/2] Document and localize Maven skip properties Move spotless.check.skip and spotless.apply.skip onto their respective mojos, keep spotless.skip on the shared base, and document all three properties in the Maven plugin README so check.skip is no longer mistaken for a global switch. Fixes #2981 --- plugin-maven/README.md | 19 ++++++-- .../spotless/maven/AbstractSpotlessMojo.java | 22 +++------ .../spotless/maven/SpotlessApplyMojo.java | 8 ++++ .../spotless/maven/SpotlessCheckMojo.java | 10 +++- .../spotless/maven/SpotlessCheckMojoTest.java | 48 ++++++++++++++++++- 5 files changed, 85 insertions(+), 22 deletions(-) diff --git a/plugin-maven/README.md b/plugin-maven/README.md index efb82242e2..c3e32ac764 100644 --- a/plugin-maven/README.md +++ b/plugin-maven/README.md @@ -2071,12 +2071,23 @@ You can easily set the line endings of different files using [a `.gitattributes` -## Disabling warnings and error messages +## Disabling Spotless goals -By default, `spotless:check` is bound to the `verify` phase. You might want to disable this behavior. We [recommend against this](https://github.com/diffplug/spotless/issues/79#issuecomment-290844602), but it's easy to do if you'd like: +By default, `spotless:check` is bound to the `verify` phase. You might want to disable Spotless for some builds. We [recommend against this](https://github.com/diffplug/spotless/issues/79#issuecomment-290844602), but the following properties are available: -- set `-Dspotless.check.skip=true` at the command line -- set `spotless.check.skip` to `true` in the `` section of the `pom.xml` +| Property | Scope | Effect | +| --- | --- | --- | +| `spotless.skip` | all goals | Skips every Spotless goal (`check`, `apply`, …) | +| `spotless.check.skip` | `spotless:check` only | Skips only the check goal | +| `spotless.apply.skip` | `spotless:apply` only | Skips only the apply goal | + +You can set them at the command line or in the `` section of the `pom.xml`: + +- `-Dspotless.skip=true` / `true` — skip all Spotless goals +- `-Dspotless.check.skip=true` / `true` — skip only `spotless:check` (including when it is bound to `verify`) +- `-Dspotless.apply.skip=true` / `true` — skip only `spotless:apply` + +`spotless.check.skip` does **not** skip `spotless:apply`, and `spotless.apply.skip` does **not** skip `spotless:check`. Use `spotless.skip` when you want both. ### Suppressing lint errors 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 b744ddf418..295dcea1e5 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 @@ -120,12 +120,6 @@ public abstract class AbstractSpotlessMojo extends AbstractMojo { @Parameter(property = "spotless.skip", defaultValue = "false") private boolean skip; - @Parameter(property = "spotless.apply.skip", defaultValue = "false") - private boolean applySkip; - - @Parameter(property = "spotless.check.skip", defaultValue = "false") - private boolean checkSkip; - @Parameter(defaultValue = "${project}", required = true, readonly = true) private MavenProject project; @@ -305,16 +299,14 @@ private boolean shouldSkip() { getLog().debug("Skipping for incremental builds as parameter 'enableForIncrementalBuilds' is set to 'false'"); return true; } + return isGoalSpecificSkip(); + } - switch (goal) { - case GOAL_CHECK: - return checkSkip; - case GOAL_APPLY: - return applySkip; - default: - break; - } - + /** + * Goal-specific skip flags live on the concrete mojos (e.g. {@code spotless.check.skip}). + * Override when a goal has its own property. + */ + protected boolean isGoalSpecificSkip() { return false; } diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessApplyMojo.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessApplyMojo.java index 1faf4b1c4e..ef77c7103b 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessApplyMojo.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessApplyMojo.java @@ -47,6 +47,14 @@ public class SpotlessApplyMojo extends AbstractSpotlessMojo { @Parameter(property = "spotlessIdeHookUseStdOut") private boolean spotlessIdeHookUseStdOut; + @Parameter(property = "spotless.apply.skip", defaultValue = "false") + private boolean applySkip; + + @Override + protected boolean isGoalSpecificSkip() { + return applySkip; + } + @Override protected void process(String name, Iterable files, Formatter formatter, UpToDateChecker upToDateChecker) throws MojoExecutionException { if (isIdeHook()) { diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java index 910a004dfe..4638d58f44 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2025 DiffPlug + * Copyright 2016-2026 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,9 @@ public class SpotlessCheckMojo extends AbstractSpotlessMojo { private static final String INCREMENTAL_MESSAGE_PREFIX = "Spotless Violation: "; + @Parameter(property = "spotless.check.skip", defaultValue = "false") + private boolean checkSkip; + public enum MessageSeverity { WARNING(BuildContext.SEVERITY_WARNING), ERROR(BuildContext.SEVERITY_ERROR); @@ -63,6 +66,11 @@ public int getSeverity() { @Parameter(defaultValue = "WARNING") private MessageSeverity m2eIncrementalBuildMessageSeverity; + @Override + protected boolean isGoalSpecificSkip() { + return checkSkip; + } + @Override protected void process(String name, Iterable files, Formatter formatter, UpToDateChecker upToDateChecker) throws MojoExecutionException { ImpactedFilesTracker counter = new ImpactedFilesTracker(); diff --git a/plugin-maven/src/test/java/com/diffplug/spotless/maven/SpotlessCheckMojoTest.java b/plugin-maven/src/test/java/com/diffplug/spotless/maven/SpotlessCheckMojoTest.java index 92a78e3923..f848149f8b 100644 --- a/plugin-maven/src/test/java/com/diffplug/spotless/maven/SpotlessCheckMojoTest.java +++ b/plugin-maven/src/test/java/com/diffplug/spotless/maven/SpotlessCheckMojoTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2023 DiffPlug + * Copyright 2016-2026 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ class SpotlessCheckMojoTest extends MavenIntegrationHarness { private static final String UNFORMATTED_FILE = "license/MissingLicense.test"; private static final String FORMATTED_FILE = "license/HasLicense.test"; + private static final String TARGET_JAVA = "src/main/java/com.github.youribonnaffe.gradle.format/Java8Test.java"; @Test void testSpotlessCheckWithFormattingViolations() throws Exception { @@ -46,6 +47,19 @@ void testSkipSpotlessCheckWithFormattingViolations() throws Exception { testSpotlessCheck(UNFORMATTED_FILE, "spotless:check -Dspotless.check.skip", false); } + @Test + void testSkipAllGoalsWithSpotlessSkip() throws Exception { + writePomWithJavaLicenseHeaderStep(); + testSpotlessCheck(UNFORMATTED_FILE, "spotless:check -Dspotless.skip", false); + } + + @Test + void testApplySkipDoesNotSkipCheck() throws Exception { + writePomWithJavaLicenseHeaderStep(); + // apply.skip must not suppress check + testSpotlessCheck(UNFORMATTED_FILE, "spotless:check -Dspotless.apply.skip", true); + } + @Test void testSpotlessCheckBindingToVerifyPhase() throws Exception { writePom( @@ -68,9 +82,39 @@ void testSpotlessCheckBindingToVerifyPhase() throws Exception { testSpotlessCheck(UNFORMATTED_FILE, "verify", true); } + @Test + void testApplySkipLeavesFileUnformatted() throws Exception { + writePomWithJavaLicenseHeaderStep(); + setFile("license.txt").toResource("license/TestLicense"); + setFile(TARGET_JAVA).toResource(UNFORMATTED_FILE); + + mavenRunner().withArguments("spotless:apply -Dspotless.apply.skip").runNoError(); + assertFile(TARGET_JAVA).sameAsResource(UNFORMATTED_FILE); + } + + @Test + void testSpotlessSkipLeavesApplyUnformatted() throws Exception { + writePomWithJavaLicenseHeaderStep(); + setFile("license.txt").toResource("license/TestLicense"); + setFile(TARGET_JAVA).toResource(UNFORMATTED_FILE); + + mavenRunner().withArguments("spotless:apply -Dspotless.skip").runNoError(); + assertFile(TARGET_JAVA).sameAsResource(UNFORMATTED_FILE); + } + + @Test + void testCheckSkipDoesNotSkipApply() throws Exception { + writePomWithJavaLicenseHeaderStep(); + setFile("license.txt").toResource("license/TestLicense"); + setFile(TARGET_JAVA).toResource(UNFORMATTED_FILE); + + mavenRunner().withArguments("spotless:apply -Dspotless.check.skip").runNoError(); + assertFile(TARGET_JAVA).sameAsResource(FORMATTED_FILE); + } + private void testSpotlessCheck(String fileName, String command, boolean expectError) throws Exception { setFile("license.txt").toResource("license/TestLicense"); - setFile("src/main/java/com.github.youribonnaffe.gradle.format/Java8Test.java").toResource(fileName); + setFile(TARGET_JAVA).toResource(fileName); MavenRunner mavenRunner = mavenRunner().withArguments(command); From 6c76da36de1b0ec2ba6dbf3106d276ad6e8a2e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kalayc=C4=B1?= Date: Sun, 2 Aug 2026 18:03:12 +0300 Subject: [PATCH 2/2] docs: clarify spotless.skip covers check and apply only install-git-pre-push-hook does not read spotless.skip. --- plugin-maven/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugin-maven/README.md b/plugin-maven/README.md index c3e32ac764..580cd238b7 100644 --- a/plugin-maven/README.md +++ b/plugin-maven/README.md @@ -2077,17 +2077,17 @@ By default, `spotless:check` is bound to the `verify` phase. You might want to d | Property | Scope | Effect | | --- | --- | --- | -| `spotless.skip` | all goals | Skips every Spotless goal (`check`, `apply`, …) | +| `spotless.skip` | `spotless:check` and `spotless:apply` | Skips both formatting goals | | `spotless.check.skip` | `spotless:check` only | Skips only the check goal | | `spotless.apply.skip` | `spotless:apply` only | Skips only the apply goal | You can set them at the command line or in the `` section of the `pom.xml`: -- `-Dspotless.skip=true` / `true` — skip all Spotless goals +- `-Dspotless.skip=true` / `true` — skip both `spotless:check` and `spotless:apply` - `-Dspotless.check.skip=true` / `true` — skip only `spotless:check` (including when it is bound to `verify`) - `-Dspotless.apply.skip=true` / `true` — skip only `spotless:apply` -`spotless.check.skip` does **not** skip `spotless:apply`, and `spotless.apply.skip` does **not** skip `spotless:check`. Use `spotless.skip` when you want both. +`spotless.check.skip` does **not** skip `spotless:apply`, and `spotless.apply.skip` does **not** skip `spotless:check`. Use `spotless.skip` when you want both. These properties do **not** affect `spotless:install-git-pre-push-hook`. ### Suppressing lint errors