From bb830e57113679e2a7a666e68385ce97d6b59586 Mon Sep 17 00:00:00 2001 From: Ludy Date: Mon, 20 Jul 2026 14:05:53 +0200 Subject: [PATCH] build: upgrade google-java-format and restore strict Spotless validation (#7091) # Description of Changes - Upgraded google-java-format from 1.28.0 to 1.35.0. - Removed the broad `suppressLintsFor` workaround for the `google-java-format` step. - Ensured the shared `gradle/spotless.gradle` configuration is recognized by the relevant CI path filters and repository automation. - Kept the shared formatter configuration available to all backend modules. - Verified that google-java-format 1.35.0 runs successfully on JDK 25 for the Common, Core, and SaaS modules. - Confirmed that the previous claim about a general Guava 32.x crash on JDK 24/25 no longer justifies suppressing all formatter lint failures. ### Verification Verified with Temurin JDK 25.0.3 and google-java-format 1.35.0. The formatter still depends on Guava 32.1.3-jre, and no `suppressLintsFor` configuration is present. ```bash ./gradlew \ :common:spotlessJavaCheck \ :stirling-pdf:spotlessJavaCheck \ --rerun-tasks ``` Result: ```text > Task :common:spotlessJava > Task :common:spotlessJavaCheck > Task :stirling-pdf:spotlessJava > Task :stirling-pdf:spotlessJavaCheck BUILD SUCCESSFUL in 26s 4 actionable tasks: 4 executed ``` Using `--rerun-tasks` ensured that the formatter was executed and that the result did not come from the Gradle task cache. --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/devGuide/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### Translations (if applicable) - [ ] I ran [`scripts/counter_translation.py`](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/docs/counter_translation.md) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have run `task check` to verify linters, typechecks, and tests pass - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#7-testing) for more details. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/config/.files.yaml | 2 ++ .github/workflows/sync_files_v2.yml | 1 + app/common/build.gradle | 26 -------------------- app/core/build.gradle | 29 ---------------------- app/proprietary/build.gradle | 27 --------------------- app/saas/build.gradle | 26 -------------------- build.gradle | 5 ++-- gradle/spotless.gradle | 37 +++++++++++++++++++++++++++++ 8 files changed, 43 insertions(+), 110 deletions(-) create mode 100644 gradle/spotless.gradle diff --git a/.github/config/.files.yaml b/.github/config/.files.yaml index 2894464831..64454c5fe1 100644 --- a/.github/config/.files.yaml +++ b/.github/config/.files.yaml @@ -9,6 +9,7 @@ ci: &ci build: &build - *ci - build.gradle + - gradle/spotless.gradle - app/(common|core|proprietary|saas)/build.gradle - Taskfile.yml - .taskfiles/backend.yml @@ -155,4 +156,5 @@ proprietary: &proprietary - configs/settings.yml.template - build.gradle - app/proprietary/build.gradle + - gradle/spotless.gradle - .github/workflows/build-enterprise.yml diff --git a/.github/workflows/sync_files_v2.yml b/.github/workflows/sync_files_v2.yml index 38873bb1eb..357f5d5a87 100644 --- a/.github/workflows/sync_files_v2.yml +++ b/.github/workflows/sync_files_v2.yml @@ -10,6 +10,7 @@ on: - "app/common/build.gradle" - "app/core/build.gradle" - "app/proprietary/build.gradle" + - "gradle/spotless.gradle" - "README.md" - "frontend/editor/public/locales/*/translation.toml" - "app/core/src/main/resources/static/3rdPartyLicenses.json" diff --git a/app/common/build.gradle b/app/common/build.gradle index 516edd4897..3ab0369e34 100644 --- a/app/common/build.gradle +++ b/app/common/build.gradle @@ -2,32 +2,6 @@ bootRun { enabled = false } -spotless { - java { - target 'src/**/java/**/*.java' - targetExclude 'src/main/java/org/apache/**' - googleJavaFormat(googleJavaFormatVersion).aosp().reorderImports(false) - // google-java-format 1.28.0 bundles Guava 32.x which crashes Spotless lint on JDK 24/25 - suppressLintsFor { setStep('google-java-format') } - - importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - yaml { - target '**/*.yml', '**/*.yaml' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - format 'gradle', { - target '**/gradle/*.gradle', '**/*.gradle' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } -} dependencies { api "com.google.guava:guava:${guavaVersion}" api 'org.springframework.boot:spring-boot-starter-webmvc' diff --git a/app/core/build.gradle b/app/core/build.gradle index 6a55d89304..578ace75cc 100644 --- a/app/core/build.gradle +++ b/app/core/build.gradle @@ -9,35 +9,6 @@ configurations { } } -spotless { - java { - target 'src/**/java/**/*.java' - targetExclude 'src/main/resources/static/**', 'src/main/java/org/apache/**' - googleJavaFormat(googleJavaFormatVersion).aosp().reorderImports(false) - // google-java-format 1.28.0 bundles Guava 32.x which crashes Spotless lint on JDK 24/25 - suppressLintsFor { setStep('google-java-format') } - - importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - yaml { - target '**/*.yml', '**/*.yaml' - targetExclude 'src/main/resources/static/**' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - format 'gradle', { - target '**/gradle/*.gradle', '**/*.gradle' - targetExclude 'src/main/resources/static/**' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } -} - dependencies { if (!gradle.ext.disableAdditional) { implementation project(':proprietary') diff --git a/app/proprietary/build.gradle b/app/proprietary/build.gradle index 60f6541c82..d2028f7859 100644 --- a/app/proprietary/build.gradle +++ b/app/proprietary/build.gradle @@ -6,33 +6,6 @@ repositories { bootRun { enabled = false } - -spotless { - java { - target 'src/**/java/**/*.java' - targetExclude 'src/main/java/org/apache/**' - googleJavaFormat(googleJavaFormatVersion).aosp().reorderImports(false) - // google-java-format 1.28.0 bundles Guava 32.x which crashes Spotless lint on JDK 24/25 - suppressLintsFor { setStep('google-java-format') } - - importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - yaml { - target '**/*.yml', '**/*.yaml' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - format 'gradle', { - target '**/gradle/*.gradle', '**/*.gradle' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } -} dependencies { implementation project(':common') api "com.google.guava:guava:${guavaVersion}" diff --git a/app/saas/build.gradle b/app/saas/build.gradle index d6ae305def..38a16f7de8 100644 --- a/app/saas/build.gradle +++ b/app/saas/build.gradle @@ -2,32 +2,6 @@ bootRun { enabled = false } -spotless { - java { - target 'src/**/java/**/*.java' - targetExclude 'src/main/java/org/apache/**' - googleJavaFormat(googleJavaFormatVersion).aosp().reorderImports(false) - suppressLintsFor { setStep('google-java-format') } - - importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - yaml { - target '**/*.yml', '**/*.yaml' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } - format 'gradle', { - target '**/gradle/*.gradle', '**/*.gradle' - trimTrailingWhitespace() - leadingTabsToSpaces() - endWithNewline() - } -} - dependencies { implementation project(':common') implementation project(':proprietary') diff --git a/build.gradle b/build.gradle index e2f47e26fb..4da9bb1055 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ ext { springSecuritySamlVersion = "7.0.5" openSamlVersion = "5.2.1" commonmarkVersion = "0.28.0" - googleJavaFormatVersion = "1.28.0" + googleJavaFormatVersion = "1.35.0" logback = "1.5.32" commonsIoVersion = "2.22.0" commonsLang3 = "3.20.0" @@ -37,7 +37,7 @@ ext { gsonVersion = "2.14.0" guavaVersion = "33.6.0-jre" jinjavaVersion = "2.8.3" - jackson2Version = "2.21.2" + jackson2Version = "2.21.4" bucket4jVersion = "8.19.0" archunitVersion = "1.4.2" batikVersion = "1.19" @@ -171,6 +171,7 @@ subprojects { apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' apply plugin: 'jacoco' + apply from: rootProject.file('gradle/spotless.gradle') java { sourceCompatibility = JavaVersion.VERSION_25 diff --git a/gradle/spotless.gradle b/gradle/spotless.gradle new file mode 100644 index 0000000000..efc4096a5e --- /dev/null +++ b/gradle/spotless.gradle @@ -0,0 +1,37 @@ +spotless { + java { + target 'src/**/java/**/*.java' + if (project.name == 'stirling-pdf') { + targetExclude 'src/main/resources/static/**', 'src/main/java/org/apache/**' + } else { + targetExclude 'src/main/java/org/apache/**' + } + + // licenseHeaderFile(file('config/license-header.txt')).updateYearWithLatest(true).yearStringFormat('%s') + removeUnusedImports() + googleJavaFormat(rootProject.ext.googleJavaFormatVersion).aosp().reorderImports(false) + + importOrder('java', 'javax', 'org', 'com', 'net', 'io', 'jakarta', 'lombok', 'me', 'stirling') + trimTrailingWhitespace() + leadingTabsToSpaces() + endWithNewline() + } + yaml { + target '**/*.yml', '**/*.yaml' + if (project.name == 'stirling-pdf') { + targetExclude 'src/main/resources/static/**' + } + trimTrailingWhitespace() + leadingTabsToSpaces() + endWithNewline() + } + format 'gradle', { + target '**/gradle/*.gradle', '**/*.gradle' + if (project.name == 'stirling-pdf') { + targetExclude 'src/main/resources/static/**' + } + trimTrailingWhitespace() + leadingTabsToSpaces() + endWithNewline() + } +}