diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000000..32b4586b61c --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,119 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: "Coverage" + +on: + push: + branches: + - '[0-9]+.[0-9]+.x' + - '8.0.x-hibernate7.*' + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + coverage-core: + name: "Coverage - grails-core (${{ matrix.os }})" + if: ${{ !contains(github.event.head_commit.message, '[skip tests]') }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04] + runs-on: ${{ matrix.os }} + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: "☕️ Setup JDK" + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 + with: + distribution: liberica + java-version: 21 + - name: "🐘 Setup Gradle" + uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 + with: + cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use) + develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} + - name: "🌡️ Run tests with coverage" + run: > + ./gradlew jacocoAggregateReport + --continue + --stacktrace + -PskipCodeStyle + - name: "📤 Upload coverage artifact" + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: coverage-core-${{ matrix.os }} + path: build/reports/jacoco/aggregate/jacocoAggregateReport.xml + if-no-files-found: warn + + coverage-gradle: + name: "Coverage - grails-gradle (${{ matrix.os }})" + if: ${{ !contains(github.event.head_commit.message, '[skip tests]') }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-24.04] + runs-on: ${{ matrix.os }} + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: "☕️ Setup JDK" + uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 + with: + distribution: liberica + java-version: 21 + - name: "🐘 Setup Gradle" + uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0 + with: + cache-provider: basic # 'basic' uses the MIT-licensed, open-source cache provider; the default 'enhanced' provider (v6+) is proprietary (Gradle commercial Terms of Use) + develocity-access-key: ${{ secrets.DEVELOCITY_ACCESS_KEY }} + - name: "🌡️ Run tests with coverage" + working-directory: grails-gradle + run: > + ./gradlew jacocoAggregateReport + --continue + --stacktrace + -PskipCodeStyle + - name: "📤 Upload coverage artifact" + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: coverage-gradle-${{ matrix.os }} + path: grails-gradle/build/reports/jacoco/aggregate/jacocoAggregateReport.xml + if-no-files-found: warn + + upload-coverage: + name: "Upload Coverage to Codecov" + needs: [coverage-core, coverage-gradle] + # Run even if some matrix legs fail so partial coverage is still uploaded + if: always() + runs-on: ubuntu-24.04 + steps: + - name: "📥 Checkout repository" + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: "📥 Download all coverage artifacts" + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + path: coverage-reports + - name: "📊 Upload coverage to Codecov" + continue-on-error: true + uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 + with: + token: ${{ secrets.CODECOV_TOKEN }} + directory: coverage-reports + verbose: true diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index ab13aa909ae..898ed70de84 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,105 +1,97 @@ - - - + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml index 52768fe1ae3..f23d524925f 100644 --- a/.idea/codeStyles/codeStyleConfig.xml +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -1,25 +1,5 @@ - - \ No newline at end of file diff --git a/build-logic/gradlew.bat b/build-logic/gradlew.bat index aa5f10b069f..24c62d56f2d 100755 --- a/build-logic/gradlew.bat +++ b/build-logic/gradlew.bat @@ -1,82 +1,82 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables, and ensure extensions are enabled -setlocal EnableExtensions - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -"%COMSPEC%" /c exit 1 - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -"%COMSPEC%" /c exit 1 - -:execute -@rem Setup the command line - - - -@rem Execute Gradle -@rem endlocal doesn't take effect until after the line is parsed and variables are expanded -@rem which allows us to clear the local environment before executing the java command -endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel - -:exitWithErrorLevel -@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts -"%COMSPEC%" /c exit %ERRORLEVEL% +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel + +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/build-logic/plugins/build.gradle b/build-logic/plugins/build.gradle index b196ee24316..b4917a4ae61 100644 --- a/build-logic/plugins/build.gradle +++ b/build-logic/plugins/build.gradle @@ -75,6 +75,10 @@ gradlePlugin { id = 'org.apache.grails.gradle.grails-code-analysis' implementationClass = 'org.apache.grails.buildsrc.GrailsCodeAnalysisPlugin' } + register('grailsJacoco') { + id = 'org.apache.grails.gradle.grails-jacoco' + implementationClass = 'org.apache.grails.buildsrc.GrailsJacocoPlugin' + } register('grailsViolationAggregation') { id = 'org.apache.grails.gradle.grails-violation-aggregation' implementationClass = 'org.apache.grails.buildsrc.GrailsViolationAggregationPlugin' diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsCodeStylePlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsCodeStylePlugin.groovy index e8934f44447..0941c0b0ed7 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsCodeStylePlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsCodeStylePlugin.groovy @@ -78,13 +78,11 @@ class GrailsCodeStylePlugin implements Plugin { createOrLoad( toCreate.resolve(CHECKSTYLE_CONFIG_FILE_NAME), - "${BASE_RESOURCE_PATH}/checkstyle/${CHECKSTYLE_CONFIG_FILE_NAME}", - project + "${BASE_RESOURCE_PATH}/checkstyle/${CHECKSTYLE_CONFIG_FILE_NAME}" ) createOrLoad( toCreate.resolve(CHECKSTYLE_SUPPRESSION_CONFIG_FILE_NAME), - "${BASE_RESOURCE_PATH}/checkstyle/${CHECKSTYLE_SUPPRESSION_CONFIG_FILE_NAME}", - project + "${BASE_RESOURCE_PATH}/checkstyle/${CHECKSTYLE_SUPPRESSION_CONFIG_FILE_NAME}" ) directory @@ -100,25 +98,23 @@ class GrailsCodeStylePlugin implements Plugin { createOrLoad( toCreate.resolve(CODENARC_CONFIG_FILE_NAME), - "${BASE_RESOURCE_PATH}/codenarc/${CODENARC_CONFIG_FILE_NAME}", - project + "${BASE_RESOURCE_PATH}/codenarc/${CODENARC_CONFIG_FILE_NAME}" ) directory }) } - private static void createOrLoad(Path expectedPath, String defaultResource, Project project) { + private static void createOrLoad(Path expectedPath, String defaultResource) { def defaultValue = GrailsCodeStylePlugin.getResourceAsStream(defaultResource) if (!defaultValue) { throw new IllegalStateException("Could not locate default configuration file: ${defaultResource}") } + String defaultText = defaultValue.text boolean missing = !Files.exists(expectedPath) || expectedPath.size() == 0 - // Only rewrite when missing or the on-disk content differs from the bundled - // resource, so repeated builds across many subprojects don't churn the file. + if (missing || expectedPath.text != defaultText) { - project.logger.debug("Writing code style configuration to ${expectedPath}") expectedPath.text = defaultText } } @@ -139,7 +135,6 @@ class GrailsCodeStylePlugin implements Plugin { project.pluginManager.apply(CheckstylePlugin) Provider ignoreFailures = GradleUtils.booleanProvider(project, IGNORE_FAILURES_PROPERTY) - Provider testStylingEnabled = GradleUtils.booleanProvider(project, TEST_STYLING_PROPERTY) project.extensions.configure(CheckstyleExtension) { // Explicit `it` is required in extension configuration @@ -155,8 +150,12 @@ class GrailsCodeStylePlugin implements Plugin { task.onlyIf { !project.hasProperty('skipCodeStyle') } task.ignoreFailures = ignoreFailures.get() - if (task.name.contains('Test') || task.name.contains('test')) { - task.enabled = testStylingEnabled.get() + if (task.name.toLowerCase().contains('test')) { + task.enabled = false + } + + task.exclude { org.gradle.api.file.FileTreeElement element -> + element.getFile().getAbsolutePath().contains("/build/") } // Redirect XML report output to a single directory to consolidate @@ -176,7 +175,6 @@ class GrailsCodeStylePlugin implements Plugin { registerCodenarcFixTask(project) Provider ignoreFailures = GradleUtils.booleanProvider(project, IGNORE_FAILURES_PROPERTY) - Provider testStylingEnabled = GradleUtils.booleanProvider(project, TEST_STYLING_PROPERTY) Provider codenarcFix = GradleUtils.booleanProvider(project, CODENARC_FIX_PROPERTY) project.extensions.configure(CodeNarcExtension) { @@ -195,8 +193,8 @@ class GrailsCodeStylePlugin implements Plugin { task.dependsOn('codenarcFix') } - if (task.name.contains('Test') || task.name.contains('test')) { - task.enabled = testStylingEnabled.get() + if (task.name.toLowerCase().contains('test')) { + task.enabled = false } // Redirect XML report output to a single directory to consolidate diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy new file mode 100644 index 00000000000..0071fa61e9f --- /dev/null +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/GrailsJacocoPlugin.groovy @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.grails.buildsrc + +import groovy.transform.CompileDynamic + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.tasks.testing.Test +import org.gradle.testing.jacoco.plugins.JacocoPlugin +import org.gradle.testing.jacoco.plugins.JacocoPluginExtension +import org.gradle.testing.jacoco.tasks.JacocoReport + +/** + * Convention plugin for JaCoCo code coverage. Apply to each subproject that compiles code. + * + * In addition to configuring per-subproject coverage, this plugin lazily registers a + * jacocoAggregateReport task on the root project the first time it is applied, then wires + * each subproject's exec data into that task. The aggregate produces a single XML report + * at build/reports/jacoco/aggregate/jacocoAggregateReport.xml suitable for Codecov upload. + */ +@CompileDynamic +class GrailsJacocoPlugin implements Plugin { + + static final String AGGREGATE_TASK_NAME = 'jacocoAggregateReport' + + @Override + void apply(Project project) { + project.logger.info("Configuring JaCoCo for project: ${project.name}") + project.pluginManager.apply(JacocoPlugin) + + project.extensions.configure(JacocoPluginExtension) { + it.toolVersion = '0.8.14' + } + + project.tasks.withType(Test).configureEach { + it.finalizedBy 'jacocoTestReport' + } + + project.tasks.withType(JacocoReport).configureEach { + it.dependsOn project.tasks.withType(Test) + it.reports { + it.xml.required = true + it.html.required = true + it.csv.required = true + } + } + + contributeToRootAggregateReport(project) + } + + private static void contributeToRootAggregateReport(Project project) { + Project root = project.rootProject + + // Ensure JacocoPlugin is on the root so its JacocoReport task has tooling available. + // pluginManager.apply is idempotent — safe to call from every subproject. + root.pluginManager.apply(JacocoPlugin) + + // Register the aggregate task once on the first apply; subsequent subprojects find it by name. + def aggregateTask + if (root.tasks.names.contains(AGGREGATE_TASK_NAME)) { + aggregateTask = root.tasks.named(AGGREGATE_TASK_NAME, JacocoReport) + } else { + aggregateTask = root.tasks.register(AGGREGATE_TASK_NAME, JacocoReport) { JacocoReport task -> + task.group = 'verification' + task.description = 'Aggregates JaCoCo coverage from all subprojects into a single XML report for Codecov.' + task.reports { + it.xml.required = true + it.xml.outputLocation = root.layout.buildDirectory.file( + 'reports/jacoco/aggregate/jacocoAggregateReport.xml' + ) + it.html.required = false + it.csv.required = false + } + task.onlyIf { JacocoReport t -> !t.executionData.files.isEmpty() } + } + } + + // Wire this subproject's test exec data into the aggregate. + aggregateTask.configure { JacocoReport task -> + task.dependsOn project.tasks.withType(Test) + task.executionData.from( + project.fileTree(project.file('build/jacoco')) { include '*.exec' } + ) + } + + // Add source and class directories once the Java plugin is confirmed present. + // Hibernate 7 variant subprojects compile identical class names to their Hibernate 5 + // counterparts; including both causes JaCoCo to throw "Can't add different class with + // same name". Exec data from H7 test runs is still included above so their coverage + // is attributed to the H5 class definitions. + if (!project.path.contains('hibernate7')) { + project.plugins.withType(JavaPlugin) { + aggregateTask.configure { JacocoReport task -> + task.sourceDirectories.from(project.sourceSets.main.allSource.srcDirs) + task.classDirectories.from(project.sourceSets.main.output.classesDirs) + } + } + } + } +} diff --git a/build-logic/plugins/src/main/resources/META-INF/org.apache.grails.buildsrc.grails-code-style/checkstyle/checkstyle.xml b/build-logic/plugins/src/main/resources/META-INF/org.apache.grails.buildsrc.grails-code-style/checkstyle/checkstyle.xml index e6034dc6c77..d88270afa10 100644 --- a/build-logic/plugins/src/main/resources/META-INF/org.apache.grails.buildsrc.grails-code-style/checkstyle/checkstyle.xml +++ b/build-logic/plugins/src/main/resources/META-INF/org.apache.grails.buildsrc.grails-code-style/checkstyle/checkstyle.xml @@ -20,6 +20,8 @@ + + diff --git a/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy new file mode 100644 index 00000000000..5ee04174959 --- /dev/null +++ b/build-logic/plugins/src/test/groovy/org/apache/grails/buildsrc/GrailsJacocoPluginSpec.groovy @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.grails.buildsrc + +import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome +import spock.lang.Specification +import spock.lang.TempDir + +import java.nio.file.Path + +class GrailsJacocoPluginSpec extends Specification { + + @TempDir + Path testProjectDir + + def setup() { + testProjectDir.resolve('settings.gradle').toFile().text = '' + testProjectDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { + mavenCentral() + } + """ + def src = testProjectDir.resolve('src/main/groovy/com/example/Foo.groovy').toFile() + src.parentFile.mkdirs() + src.text = 'package com.example\nclass Foo {}' + } + + def "jacoco plugin applies JaCoCo and registers jacocoTestReport task"() { + when: "listing verification tasks" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--group=verification') + .withPluginClasspath() + .build() + + then: "jacocoTestReport is present" + result.output.contains('jacocoTestReport') + } + + def "jacocoTestReport generates xml html and csv reports"() { + when: "listing all tasks" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--all') + .withPluginClasspath() + .build() + + then: "aggregateJacocoCoverage is not registered (that task belongs to grails-violation-aggregation)" + !result.output.contains('aggregateJacocoCoverage') + } + + def "jacocoAggregateReport is registered on the root project in a multi-project build"() { + given: "a multi-project build where a subproject applies grails-jacoco" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "listing verification tasks on the root" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('tasks', '--group=verification') + .withPluginClasspath() + .build() + + then: "jacocoAggregateReport appears on the root" + result.output.contains('jacocoAggregateReport') + } + + def "jacocoAggregateReport includes the subproject test task as a dependency"() { + given: "a multi-project build" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "doing a dry run" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '--dry-run') + .withPluginClasspath() + .build() + + then: "the subproject test task is in the execution plan" + result.output.contains(':app-module:test') + } + + def "jacocoAggregateReport is skipped when no exec files exist"() { + given: "a multi-project build with tests excluded so no exec files are produced" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'app-module'" + testProjectDir.resolve('build.gradle').toFile().text = '' + def moduleDir = testProjectDir.resolve('app-module') + moduleDir.toFile().mkdirs() + moduleDir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + + when: "running jacocoAggregateReport with tests excluded" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '-x', 'test', '--stacktrace') + .withPluginClasspath() + .build() + + then: "the task is skipped because executionData is empty" + result.task(':jacocoAggregateReport').outcome == TaskOutcome.SKIPPED + } + + def "each additional subproject with grails-jacoco wires itself into the same aggregate task"() { + given: "two subprojects both applying grails-jacoco" + testProjectDir.resolve('settings.gradle').toFile().text = "include 'module-a', 'module-b'" + testProjectDir.resolve('build.gradle').toFile().text = '' + ['module-a', 'module-b'].each { name -> + def dir = testProjectDir.resolve(name) + dir.toFile().mkdirs() + dir.resolve('build.gradle').toFile().text = """ + plugins { + id 'groovy' + id 'org.apache.grails.gradle.grails-jacoco' + } + repositories { mavenCentral() } + """ + } + + when: "doing a dry run" + def result = GradleRunner.create() + .withProjectDir(testProjectDir.toFile()) + .withArguments('jacocoAggregateReport', '--dry-run') + .withPluginClasspath() + .build() + + then: "both subproject test tasks appear as dependencies" + result.output.contains(':module-a:test') + result.output.contains(':module-b:test') + + and: "only one aggregate task is registered on the root" + result.output.count('jacocoAggregateReport') == 1 + } +} diff --git a/gradlew.bat b/gradlew.bat index aa5f10b069f..24c62d56f2d 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,82 +1,82 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables, and ensure extensions are enabled -setlocal EnableExtensions - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -"%COMSPEC%" /c exit 1 - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -"%COMSPEC%" /c exit 1 - -:execute -@rem Setup the command line - - - -@rem Execute Gradle -@rem endlocal doesn't take effect until after the line is parsed and variables are expanded -@rem which allows us to clear the local environment before executing the java command -endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel - -:exitWithErrorLevel -@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts -"%COMSPEC%" /c exit %ERRORLEVEL% +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:execute +@rem Setup the command line + + + +@rem Execute Gradle +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel + +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/grails-async/core/build.gradle b/grails-async/core/build.gradle index b2f5f45bc13..bbb0f24d460 100644 --- a/grails-async/core/build.gradle +++ b/grails-async/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/gpars/build.gradle b/grails-async/gpars/build.gradle index e30f7d2e281..d46431ab2a4 100644 --- a/grails-async/gpars/build.gradle +++ b/grails-async/gpars/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/plugin/build.gradle b/grails-async/plugin/build.gradle index 73984e20e09..31a5206673e 100644 --- a/grails-async/plugin/build.gradle +++ b/grails-async/plugin/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava/build.gradle b/grails-async/rxjava/build.gradle index 9494becc598..3326aa8eae4 100644 --- a/grails-async/rxjava/build.gradle +++ b/grails-async/rxjava/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava2/build.gradle b/grails-async/rxjava2/build.gradle index aa269ef1b8d..188ae1a4079 100644 --- a/grails-async/rxjava2/build.gradle +++ b/grails-async/rxjava2/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-async/rxjava3/build.gradle b/grails-async/rxjava3/build.gradle index 25e643124b4..f138f1f6f1c 100644 --- a/grails-async/rxjava3/build.gradle +++ b/grails-async/rxjava3/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-bootstrap/build.gradle b/grails-bootstrap/build.gradle index 22b423f1494..bff4b69f1e7 100644 --- a/grails-bootstrap/build.gradle +++ b/grails-bootstrap/build.gradle @@ -30,6 +30,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-cache/build.gradle b/grails-cache/build.gradle index 45c83921c40..4bcfd27af54 100644 --- a/grails-cache/build.gradle +++ b/grails-cache/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-codecs-core/build.gradle b/grails-codecs-core/build.gradle index 8b952e765f4..a787c9deb5e 100644 --- a/grails-codecs-core/build.gradle +++ b/grails-codecs-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-codecs/build.gradle b/grails-codecs/build.gradle index 47fbaab85cd..6151aa6bfc1 100644 --- a/grails-codecs/build.gradle +++ b/grails-codecs/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-common/build.gradle b/grails-common/build.gradle index f6ca3c40f17..0bb4998d4cf 100644 --- a/grails-common/build.gradle +++ b/grails-common/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-console/build.gradle b/grails-console/build.gradle index 21b341638da..4b06bca58ea 100644 --- a/grails-console/build.gradle +++ b/grails-console/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-controllers/build.gradle b/grails-controllers/build.gradle index 962430281be..24fe759f905 100644 --- a/grails-controllers/build.gradle +++ b/grails-controllers/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-converters/build.gradle b/grails-converters/build.gradle index 22e3e605e1a..ccc99fd8a9f 100644 --- a/grails-converters/build.gradle +++ b/grails-converters/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-core/build.gradle b/grails-core/build.gradle index bbea195d0db..32da709a797 100644 --- a/grails-core/build.gradle +++ b/grails-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/boot-plugin/build.gradle b/grails-data-hibernate5/boot-plugin/build.gradle index 6dfcb4389df..448832a429c 100644 --- a/grails-data-hibernate5/boot-plugin/build.gradle +++ b/grails-data-hibernate5/boot-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/core/build.gradle b/grails-data-hibernate5/core/build.gradle index 4838afb4afd..17a66c2348f 100644 --- a/grails-data-hibernate5/core/build.gradle +++ b/grails-data-hibernate5/core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/dbmigration/build.gradle b/grails-data-hibernate5/dbmigration/build.gradle index 342dbcfb17a..36c714199bf 100644 --- a/grails-data-hibernate5/dbmigration/build.gradle +++ b/grails-data-hibernate5/dbmigration/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/grails-plugin/build.gradle b/grails-data-hibernate5/grails-plugin/build.gradle index dd0a1a13dea..e7f272e38b8 100644 --- a/grails-data-hibernate5/grails-plugin/build.gradle +++ b/grails-data-hibernate5/grails-plugin/build.gradle @@ -26,6 +26,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-hibernate5/spring-orm/build.gradle b/grails-data-hibernate5/spring-orm/build.gradle index 6e65fbdc636..f5b90646679 100644 --- a/grails-data-hibernate5/spring-orm/build.gradle +++ b/grails-data-hibernate5/spring-orm/build.gradle @@ -29,6 +29,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/boot-plugin/build.gradle b/grails-data-mongodb/boot-plugin/build.gradle index 31a76648f24..7fde1f36ff3 100644 --- a/grails-data-mongodb/boot-plugin/build.gradle +++ b/grails-data-mongodb/boot-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/bson/build.gradle b/grails-data-mongodb/bson/build.gradle index 6c1e0243bb8..7fd2d5022c5 100644 --- a/grails-data-mongodb/bson/build.gradle +++ b/grails-data-mongodb/bson/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/core/build.gradle b/grails-data-mongodb/core/build.gradle index 94c1e6d97e1..c9a48d4b664 100644 --- a/grails-data-mongodb/core/build.gradle +++ b/grails-data-mongodb/core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/ext/build.gradle b/grails-data-mongodb/ext/build.gradle index 982b44960db..16f0e30c4c5 100644 --- a/grails-data-mongodb/ext/build.gradle +++ b/grails-data-mongodb/ext/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/grails-plugin/build.gradle b/grails-data-mongodb/grails-plugin/build.gradle index c22e6dca21e..553b6d5de94 100644 --- a/grails-data-mongodb/grails-plugin/build.gradle +++ b/grails-data-mongodb/grails-plugin/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-mongodb/gson-templates/build.gradle b/grails-data-mongodb/gson-templates/build.gradle index da0d0758faa..b9c3ac8d7da 100644 --- a/grails-data-mongodb/gson-templates/build.gradle +++ b/grails-data-mongodb/gson-templates/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-data-simple/build.gradle b/grails-data-simple/build.gradle index 1290a63ad55..6f056842b90 100644 --- a/grails-data-simple/build.gradle +++ b/grails-data-simple/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-databinding-core/build.gradle b/grails-databinding-core/build.gradle index cee4c8051b6..6acbb1d267c 100644 --- a/grails-databinding-core/build.gradle +++ b/grails-databinding-core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-databinding/build.gradle b/grails-databinding/build.gradle index 363c0012853..dedfee2aaf7 100644 --- a/grails-databinding/build.gradle +++ b/grails-databinding/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-async/build.gradle b/grails-datamapping-async/build.gradle index 00c2afdff4a..c300d670689 100644 --- a/grails-datamapping-async/build.gradle +++ b/grails-datamapping-async/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-core/build.gradle b/grails-datamapping-core/build.gradle index 700db6df885..daea719e72e 100644 --- a/grails-datamapping-core/build.gradle +++ b/grails-datamapping-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-rx/build.gradle b/grails-datamapping-rx/build.gradle index e0d5c9d6ea9..15e9efc507b 100644 --- a/grails-datamapping-rx/build.gradle +++ b/grails-datamapping-rx/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-support/build.gradle b/grails-datamapping-support/build.gradle index 78a342a5c8d..e2ed2168d7e 100644 --- a/grails-datamapping-support/build.gradle +++ b/grails-datamapping-support/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-tck/build.gradle b/grails-datamapping-tck/build.gradle index bc42a8baa44..ac1fa0ab0a8 100644 --- a/grails-datamapping-tck/build.gradle +++ b/grails-datamapping-tck/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datamapping-validation/build.gradle b/grails-datamapping-validation/build.gradle index accbf04ac20..4483682f671 100644 --- a/grails-datamapping-validation/build.gradle +++ b/grails-datamapping-validation/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datasource/build.gradle b/grails-datasource/build.gradle index c6cf03293e3..b2ea1a4ed66 100644 --- a/grails-datasource/build.gradle +++ b/grails-datasource/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-async/build.gradle b/grails-datastore-async/build.gradle index edb0d968a26..3afeb114b18 100644 --- a/grails-datastore-async/build.gradle +++ b/grails-datastore-async/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-core/build.gradle b/grails-datastore-core/build.gradle index 85da8ab7a1c..e387419b777 100644 --- a/grails-datastore-core/build.gradle +++ b/grails-datastore-core/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-datastore-web/build.gradle b/grails-datastore-web/build.gradle index 7589e7531e9..e0c76671d95 100644 --- a/grails-datastore-web/build.gradle +++ b/grails-datastore-web/build.gradle @@ -27,6 +27,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-domain-class/build.gradle b/grails-domain-class/build.gradle index 95103142436..4594208a055 100644 --- a/grails-domain-class/build.gradle +++ b/grails-domain-class/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-encoder/build.gradle b/grails-encoder/build.gradle index 692cf98566a..b72c18d0a0c 100644 --- a/grails-encoder/build.gradle +++ b/grails-encoder/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/core/build.gradle b/grails-events/core/build.gradle index fed99b5dd2d..3336a2c93fe 100644 --- a/grails-events/core/build.gradle +++ b/grails-events/core/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/gpars/build.gradle b/grails-events/gpars/build.gradle index 3e80b36094f..746d28260b2 100644 --- a/grails-events/gpars/build.gradle +++ b/grails-events/gpars/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/plugin/build.gradle b/grails-events/plugin/build.gradle index 5069cad90fe..1298082db28 100644 --- a/grails-events/plugin/build.gradle +++ b/grails-events/plugin/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava/build.gradle b/grails-events/rxjava/build.gradle index d53e072abcd..f5a8d14a2bf 100644 --- a/grails-events/rxjava/build.gradle +++ b/grails-events/rxjava/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava2/build.gradle b/grails-events/rxjava2/build.gradle index 43791ba91fb..523491abadd 100644 --- a/grails-events/rxjava2/build.gradle +++ b/grails-events/rxjava2/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/rxjava3/build.gradle b/grails-events/rxjava3/build.gradle index 2daa711d671..5317145cad7 100644 --- a/grails-events/rxjava3/build.gradle +++ b/grails-events/rxjava3/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/spring/build.gradle b/grails-events/spring/build.gradle index caefaf3ef6c..b09399742e5 100644 --- a/grails-events/spring/build.gradle +++ b/grails-events/spring/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-events/transforms/build.gradle b/grails-events/transforms/build.gradle index b8797a4699e..2492836e3b7 100644 --- a/grails-events/transforms/build.gradle +++ b/grails-events/transforms/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-fields/build.gradle b/grails-fields/build.gradle index 1b30c8c623f..f92268d3590 100644 --- a/grails-fields/build.gradle +++ b/grails-fields/build.gradle @@ -28,6 +28,7 @@ plugins { id 'org.apache.grails.buildsrc.sbom' id 'org.apache.grails.gradle.grails-code-style' id 'org.apache.grails.gradle.grails-code-analysis' + id 'org.apache.grails.gradle.grails-jacoco' } version = projectVersion diff --git a/grails-forge/config/checkstyle/checkstyle-suppressions.xml b/grails-forge/config/checkstyle/checkstyle-suppressions.xml index c36038ae6ba..58ee65cc408 100644 --- a/grails-forge/config/checkstyle/checkstyle-suppressions.xml +++ b/grails-forge/config/checkstyle/checkstyle-suppressions.xml @@ -1,31 +1,22 @@ - - + - - - diff --git a/grails-forge/config/checkstyle/checkstyle.xml b/grails-forge/config/checkstyle/checkstyle.xml index 54300e23d0b..d88270afa10 100644 --- a/grails-forge/config/checkstyle/checkstyle.xml +++ b/grails-forge/config/checkstyle/checkstyle.xml @@ -1,231 +1,91 @@ - - - - + - - - - - - + - - - - + + + - - - - - - - - - - + + - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - + + + + + + + - - - - - - - - - - - - + + - - + + + + + - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - - - - + + + + - - - - - - - - - - - - - - + + + + + + + + - + \ No newline at end of file diff --git a/grails-forge/gradle/code-style-config.gradle b/grails-forge/gradle/code-style-config.gradle index b3a1e36a602..684128b1dd7 100644 --- a/grails-forge/gradle/code-style-config.gradle +++ b/grails-forge/gradle/code-style-config.gradle @@ -17,38 +17,14 @@ * under the License. */ -import com.diffplug.gradle.spotless.SpotlessExtension import io.spring.nohttp.gradle.NoHttpExtension apply plugin: 'checkstyle' apply plugin: 'codenarc' -apply plugin: 'com.diffplug.spotless' apply plugin: 'io.spring.nohttp' // enforce https everywhere apply plugin: 'org.apache.grails.gradle.grails-code-style' apply plugin: 'org.apache.grails.gradle.grails-code-analysis' -extensions.configure(SpotlessExtension) { - // Explicit `it` is required in extension configuration block - it.java { - target('src/main/java/**/*.java') - // Formatters: - licenseHeaderFile(rootProject.layout.projectDirectory.file('config/spotless.license.java')) - } - it.groovy { - target('src/main/groovy/**') - // Formatters: - licenseHeaderFile(rootProject.layout.projectDirectory.file('config/spotless.license.java')) - } - it.format('javaMisc') { - target( - 'src/main/**/module-info.java', - 'src/main/**/package-info.java', - ) - // Formatters: - licenseHeaderFile(rootProject.layout.projectDirectory.file('config/spotless.license.java'), '\\/\\*\\*') - } -} - extensions.configure(NoHttpExtension) { // Explicit `it` is required in extension configuration block it.source.exclude( @@ -59,6 +35,3 @@ extensions.configure(NoHttpExtension) { ) } -tasks.named('checkstyleMain') { - dependsOn('spotlessCheck') -} diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java index 2ac0279773d..cccb1c518db 100644 --- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java +++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/AnalyticsController.java @@ -18,6 +18,11 @@ */ package org.grails.forge.analytics.postgres; +import java.util.List; +import java.util.stream.Collectors; + +import jakarta.transaction.Transactional; + import io.micronaut.core.annotation.NonNull; import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Body; @@ -26,11 +31,8 @@ import io.micronaut.http.annotation.Post; import io.micronaut.scheduling.TaskExecutors; import io.micronaut.scheduling.annotation.ExecuteOn; -import org.grails.forge.analytics.Generated; -import jakarta.transaction.Transactional; -import java.util.List; -import java.util.stream.Collectors; +import org.grails.forge.analytics.Generated; @Controller("/analytics") @ExecuteOn(TaskExecutors.IO) diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java index 2e3fb86be75..8ff3b61909b 100644 --- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java +++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Application.java @@ -18,21 +18,27 @@ */ package org.grails.forge.analytics.postgres; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; + +import jakarta.validation.constraints.NotBlank; + import io.micronaut.core.annotation.Creator; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; -import io.micronaut.data.annotation.*; +import io.micronaut.data.annotation.DateCreated; +import io.micronaut.data.annotation.GeneratedValue; +import io.micronaut.data.annotation.Id; +import io.micronaut.data.annotation.MappedEntity; +import io.micronaut.data.annotation.Relation; + import org.grails.forge.application.ApplicationType; import org.grails.forge.options.DevelopmentReloading; import org.grails.forge.options.GormImpl; import org.grails.forge.options.JdkVersion; -import jakarta.validation.constraints.NotBlank; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.Objects; -import java.util.Set; - /** * Models a generated application. * diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/ApplicationRepository.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/ApplicationRepository.java index 38193cdfbec..392e1f219be 100644 --- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/ApplicationRepository.java +++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/ApplicationRepository.java @@ -18,6 +18,8 @@ */ package org.grails.forge.analytics.postgres; +import java.util.List; + import io.micronaut.core.annotation.NonNull; import io.micronaut.data.annotation.Id; import io.micronaut.data.annotation.Join; @@ -26,8 +28,6 @@ import io.micronaut.data.model.query.builder.sql.Dialect; import io.micronaut.data.repository.PageableRepository; -import java.util.List; - /** * Repository for storing generated applications. * diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Feature.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Feature.java index f92ad7df488..58bbdc97517 100644 --- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Feature.java +++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/Feature.java @@ -18,6 +18,8 @@ */ package org.grails.forge.analytics.postgres; +import java.util.Objects; + import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.micronaut.data.annotation.GeneratedValue; @@ -25,8 +27,6 @@ import io.micronaut.data.annotation.MappedEntity; import io.micronaut.data.annotation.Relation; -import java.util.Objects; - /** * Models a selected application feature. * diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java index c9b0f3a5951..d0b3b042990 100644 --- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java +++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/FeatureRepository.java @@ -18,6 +18,11 @@ */ package org.grails.forge.analytics.postgres; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + import io.micronaut.core.annotation.NonNull; import io.micronaut.data.annotation.Id; import io.micronaut.data.jdbc.annotation.JdbcRepository; @@ -26,11 +31,6 @@ import io.micronaut.data.repository.CrudRepository; import io.micronaut.transaction.annotation.ReadOnly; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - @JdbcRepository(dialect = Dialect.POSTGRES) public abstract class FeatureRepository implements CrudRepository { @@ -52,10 +52,10 @@ List topFeatures() { return this.jdbcOperations .prepareStatement(query("name", "feature"), statement -> { - try (ResultSet resultSet = statement.executeQuery()) { - return resultSetToTotals(resultSet); - } - }); + try (ResultSet resultSet = statement.executeQuery()) { + return resultSetToTotals(resultSet); + } + }); } @ReadOnly diff --git a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/gcp/GoogleCloudSqlSetup.java b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/gcp/GoogleCloudSqlSetup.java index 9a952343b7b..15f2e7be2c6 100644 --- a/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/gcp/GoogleCloudSqlSetup.java +++ b/grails-forge/grails-forge-analytics-postgres/src/main/java/org/grails/forge/analytics/postgres/gcp/GoogleCloudSqlSetup.java @@ -18,6 +18,8 @@ */ package org.grails.forge.analytics.postgres.gcp; +import jakarta.inject.Singleton; + import io.micronaut.configuration.jdbc.hikari.DatasourceConfiguration; import io.micronaut.context.annotation.Property; import io.micronaut.context.annotation.Requires; @@ -25,8 +27,6 @@ import io.micronaut.context.event.BeanCreatedEvent; import io.micronaut.context.event.BeanCreatedEventListener; -import jakarta.inject.Singleton; - /** * Configuration for the Cloud SQL environment. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java index c3182db1e4e..7ffd24c31aa 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationController.java @@ -18,6 +18,16 @@ */ package org.grails.forge.api; +import java.io.OutputStream; +import java.io.Writer; +import java.net.URI; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + import io.micronaut.context.MessageSource; import io.micronaut.core.annotation.Nullable; import io.micronaut.core.io.Writable; @@ -27,12 +37,6 @@ import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Produces; -import org.grails.forge.application.ApplicationType; -import org.grails.forge.application.OperatingSystem; -import org.grails.forge.options.*; -import org.grails.forge.template.RockerWritable; -import org.grails.forge.template.api.grailsForgeApi; -import org.grails.forge.util.VersionInfo; import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.info.Info; @@ -40,15 +44,16 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import java.io.OutputStream; -import java.io.Writer; -import java.net.URI; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; +import org.grails.forge.application.ApplicationType; +import org.grails.forge.application.OperatingSystem; +import org.grails.forge.options.FeatureFilter; +import org.grails.forge.options.GormImpl; +import org.grails.forge.options.JdkVersion; +import org.grails.forge.options.Options; +import org.grails.forge.options.ServletImpl; +import org.grails.forge.template.RockerWritable; +import org.grails.forge.template.api.grailsForgeApi; +import org.grails.forge.util.VersionInfo; /** * Main interface on the Grails Application Forge API. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeDTO.java index 91a4042e4a6..a7482ee284e 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeDTO.java @@ -18,6 +18,8 @@ */ package org.grails.forge.api; +import java.util.List; + import io.micronaut.context.MessageSource; import io.micronaut.core.annotation.Creator; import io.micronaut.core.annotation.Internal; @@ -25,10 +27,9 @@ import io.micronaut.core.annotation.NonNull; import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; -import org.grails.forge.application.ApplicationType; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; +import org.grails.forge.application.ApplicationType; /** * DTO objects for {@link ApplicationType}. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeList.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeList.java index 7b597fe360d..93aad4e6400 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeList.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeList.java @@ -18,11 +18,11 @@ */ package org.grails.forge.api; +import java.util.List; + import io.micronaut.core.annotation.Introspected; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; - /** * Models a list of application types. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeOperations.java index e05f853c13e..25b8b19cabd 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeOperations.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ApplicationTypeOperations.java @@ -21,6 +21,7 @@ import io.micronaut.core.annotation.Nullable; import io.micronaut.http.annotation.Get; import io.swagger.v3.oas.annotations.Parameter; + import org.grails.forge.application.ApplicationType; import org.grails.forge.options.FeatureFilter; diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java index 120d98631c5..3ee45eaed9e 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloading.java @@ -18,10 +18,10 @@ */ package org.grails.forge.api; -import io.micronaut.core.annotation.NonNull; - import java.util.Locale; +import io.micronaut.core.annotation.NonNull; + public enum DevelopmentReloading { DEVTOOLS, JREBEL, diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java index 412bab03f1c..aec2f5a9c1b 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/DevelopmentReloadingDTO.java @@ -26,6 +26,7 @@ import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; import io.swagger.v3.oas.annotations.media.Schema; + import org.grails.forge.options.DevelopmentReloading; import org.grails.forge.util.NameUtils; diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureDTO.java index 6a6fd1ffcb9..62f2e38888c 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureDTO.java @@ -23,9 +23,10 @@ import io.micronaut.core.annotation.Introspected; import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; -import org.grails.forge.feature.Feature; import io.swagger.v3.oas.annotations.media.Schema; +import org.grails.forge.feature.Feature; + /** * Represents an application feature. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureList.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureList.java index 25a1e9132e9..f71dcc6cae5 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureList.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureList.java @@ -18,11 +18,11 @@ */ package org.grails.forge.api; +import java.util.List; + import io.micronaut.core.annotation.Introspected; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; - /** * Models a list of features. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureOperations.java index 4029f4906c1..168b2616933 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureOperations.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureOperations.java @@ -18,12 +18,12 @@ */ package org.grails.forge.api; -import org.grails.forge.application.ApplicationType; -import org.grails.forge.options.Options; - import java.util.List; import java.util.Locale; +import org.grails.forge.application.ApplicationType; +import org.grails.forge.options.Options; + /** * API to expose information about features. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureService.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureService.java index 69beabf3a5b..8868f66c290 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureService.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/FeatureService.java @@ -18,22 +18,24 @@ */ package org.grails.forge.api; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; + +import jakarta.inject.Singleton; + import io.micronaut.context.BeanLocator; import io.micronaut.context.MessageSource; import io.micronaut.inject.qualifiers.Qualifiers; -import jakarta.inject.Singleton; + import org.grails.forge.application.ApplicationType; import org.grails.forge.feature.AvailableFeatures; import org.grails.forge.feature.DefaultFeature; import org.grails.forge.feature.Feature; import org.grails.forge.options.Options; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; - /** * Implements the {@link FeatureOperations} interface. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java index af0e8a9a343..36a1be9ab03 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java @@ -26,6 +26,7 @@ import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; import io.swagger.v3.oas.annotations.media.Schema; + import org.grails.forge.options.GormImpl; /** diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GrailsForgeConfiguration.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GrailsForgeConfiguration.java index e2dd74b468e..3cfb282463a 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GrailsForgeConfiguration.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GrailsForgeConfiguration.java @@ -18,15 +18,15 @@ */ package org.grails.forge.api; -import io.micronaut.context.annotation.ConfigurationProperties; -import io.micronaut.context.env.Environment; -import io.micronaut.core.annotation.Nullable; - import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.Optional; +import io.micronaut.context.annotation.ConfigurationProperties; +import io.micronaut.context.env.Environment; +import io.micronaut.core.annotation.Nullable; + /** * Allows configuration of the the links exposed in URLs. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/JdkVersionDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/JdkVersionDTO.java index 002edde6352..aefa6a27ebb 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/JdkVersionDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/JdkVersionDTO.java @@ -25,9 +25,10 @@ import io.micronaut.core.annotation.NonNull; import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; -import org.grails.forge.options.JdkVersion; import io.swagger.v3.oas.annotations.media.Schema; +import org.grails.forge.options.JdkVersion; + /** * DTO objects for {@link JdkVersion}. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/LanguageDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/LanguageDTO.java index ae9a9064377..dfcb9db10a1 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/LanguageDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/LanguageDTO.java @@ -25,11 +25,12 @@ import io.micronaut.core.annotation.NonNull; import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; +import io.swagger.v3.oas.annotations.media.Schema; + import org.grails.forge.defaults.IncludesDefaults; import org.grails.forge.defaults.LanguageDefaults; import org.grails.forge.options.Language; import org.grails.forge.util.NameUtils; -import io.swagger.v3.oas.annotations.media.Schema; /** * DTO objects for {@link Language}. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Linkable.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Linkable.java index 9b17685cd7c..7b4cb186546 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Linkable.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Linkable.java @@ -18,14 +18,14 @@ */ package org.grails.forge.api; +import java.util.LinkedHashMap; +import java.util.Map; + import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.core.annotation.Introspected; import io.micronaut.core.annotation.ReflectiveAccess; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.LinkedHashMap; -import java.util.Map; - /** * A linkable type. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Relationship.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Relationship.java index 6955dd79012..80c429a8519 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Relationship.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/Relationship.java @@ -18,11 +18,11 @@ */ package org.grails.forge.api; +import java.util.Locale; + import io.micronaut.core.annotation.NonNull; import io.micronaut.core.naming.Named; -import java.util.Locale; - /** * Relationship types. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/RequestInfo.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/RequestInfo.java index a16c5338505..3139a583d81 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/RequestInfo.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/RequestInfo.java @@ -18,12 +18,13 @@ */ package org.grails.forge.api; +import java.util.Locale; +import java.util.Objects; + import io.micronaut.http.HttpParameters; -import org.grails.forge.application.ApplicationType; import io.swagger.v3.oas.annotations.Hidden; -import java.util.Locale; -import java.util.Objects; +import org.grails.forge.application.ApplicationType; /** * The server URL. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionDTO.java index ae4136f7604..c7e2ef189f6 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionDTO.java @@ -18,13 +18,13 @@ */ package org.grails.forge.api; +import java.util.List; + import io.micronaut.core.annotation.Creator; import io.micronaut.core.annotation.Introspected; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; - /** * Supported Option * @param The underlying option type diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java index f25ee04940f..fb9ab283d57 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java @@ -18,18 +18,27 @@ */ package org.grails.forge.api; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import io.micronaut.context.MessageSource; import io.micronaut.core.annotation.Creator; import io.micronaut.core.annotation.Introspected; import io.swagger.v3.oas.annotations.media.Schema; -import org.grails.forge.api.options.*; + +import org.grails.forge.api.options.ApplicationTypeSelectOptions; +import org.grails.forge.api.options.DevelopmentReloadingSelectOptions; +import org.grails.forge.api.options.GormImplSelectOptions; +import org.grails.forge.api.options.JdkVersionSelectOptions; +import org.grails.forge.api.options.LanguageSelectOptions; +import org.grails.forge.api.options.ServletImplSelectOptions; import org.grails.forge.application.ApplicationType; import org.grails.forge.options.DevelopmentReloading; -import org.grails.forge.options.*; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; +import org.grails.forge.options.GormImpl; +import org.grails.forge.options.JdkVersion; +import org.grails.forge.options.Language; +import org.grails.forge.options.ServletImpl; /** * Aggregator for {@link SelectOptionDTO}. @@ -163,7 +172,6 @@ public static SelectOptionsDTO make(MessageSource messageSource, MessageSource.M new ServletImplDTO(ServletImpl.DEFAULT_OPTION, messageSource, messageContext) ); - return new SelectOptionsDTO(applicationOpts, jdkVersionOpts, languageOpts, developmentReloadingOpts, gormImplOpts, servletImplOpts); } diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java index f1c72e6c598..0f75a98fead 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java @@ -26,6 +26,7 @@ import io.micronaut.core.naming.Described; import io.micronaut.core.naming.Named; import io.swagger.v3.oas.annotations.media.Schema; + import org.grails.forge.options.ServletImpl; /** diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/UserAgentParser.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/UserAgentParser.java index dd89db12834..0421dae7f08 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/UserAgentParser.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/UserAgentParser.java @@ -18,13 +18,14 @@ */ package org.grails.forge.api; -import io.micronaut.core.util.StringUtils; -import org.grails.forge.application.OperatingSystem; - import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.micronaut.core.util.StringUtils; + +import org.grails.forge.application.OperatingSystem; + public class UserAgentParser { private static final Pattern[] WINDOWS_PATTERNS = new Pattern[] { Pattern.compile("Windows"), Pattern.compile("Win ?(95|98|3.1|NT|ME|2000)") }; diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/VersionDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/VersionDTO.java index f85067524e5..ef2e82feef1 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/VersionDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/VersionDTO.java @@ -18,11 +18,12 @@ */ package org.grails.forge.api; +import java.util.Map; + import io.micronaut.core.annotation.Introspected; -import org.grails.forge.util.VersionInfo; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.Map; +import org.grails.forge.util.VersionInfo; /** * Information about the application. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/AnalyticsOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/AnalyticsOperations.java index 367d0ef5b12..b6ea713f262 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/AnalyticsOperations.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/AnalyticsOperations.java @@ -18,11 +18,12 @@ */ package org.grails.forge.api.analytics; +import java.util.concurrent.CompletableFuture; + import io.micronaut.core.annotation.NonNull; import io.micronaut.http.HttpStatus; -import org.grails.forge.analytics.Generated; -import java.util.concurrent.CompletableFuture; +import org.grails.forge.analytics.Generated; /** * Interface to implement to provide analytics. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java index 5a31e7f966a..b4156fb106d 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/analytics/GenerationListener.java @@ -18,18 +18,20 @@ */ package org.grails.forge.api.analytics; +import java.util.List; +import java.util.stream.Collectors; + +import jakarta.inject.Singleton; + import io.micronaut.context.annotation.Requires; import io.micronaut.runtime.event.annotation.EventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.grails.forge.analytics.Generated; import org.grails.forge.analytics.SelectedFeature; import org.grails.forge.api.event.ApplicationGeneratingEvent; import org.grails.forge.application.generator.GeneratorContext; -import jakarta.inject.Singleton; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.stream.Collectors; @Singleton @Requires(beans = AnalyticsOperations.class) diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/bind/RequestInfoArgumentBinder.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/bind/RequestInfoArgumentBinder.java index 8c1125119f1..ca97e246a21 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/bind/RequestInfoArgumentBinder.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/bind/RequestInfoArgumentBinder.java @@ -18,18 +18,20 @@ */ package org.grails.forge.api.bind; +import java.util.Locale; +import java.util.Optional; + +import jakarta.inject.Singleton; + import io.micronaut.core.convert.ArgumentConversionContext; import io.micronaut.core.io.socket.SocketUtils; import io.micronaut.core.type.Argument; import io.micronaut.http.HttpHeaders; import io.micronaut.http.HttpRequest; import io.micronaut.http.bind.binders.TypedRequestArgumentBinder; -import org.grails.forge.api.RequestInfo; -import org.grails.forge.api.GrailsForgeConfiguration; -import jakarta.inject.Singleton; -import java.util.Locale; -import java.util.Optional; +import org.grails.forge.api.GrailsForgeConfiguration; +import org.grails.forge.api.RequestInfo; /** * Binds the Server URL. @@ -74,8 +76,8 @@ private String resolveUrl(HttpRequest request) { return "https://" + url + cp; } } else { - String hostname = request.getUri().getHost(); - String host; + String hostname = request.getUri().getHost(); + String host; if (hostname != null) { host = hostname; } else { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java index bf9286a94a7..4cdb2d6db90 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/AbstractCreateController.java @@ -18,12 +18,20 @@ */ package org.grails.forge.api.create; +import java.util.Collections; +import java.util.List; + +import jakarta.validation.constraints.Pattern; + import io.micronaut.context.event.ApplicationEventPublisher; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpHeaders; import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Header; import io.micronaut.http.exceptions.HttpStatusException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.grails.forge.api.DevelopmentReloading; import org.grails.forge.api.UserAgentParser; import org.grails.forge.api.event.ApplicationGeneratingEvent; @@ -33,14 +41,12 @@ import org.grails.forge.application.generator.GeneratorContext; import org.grails.forge.application.generator.ProjectGenerator; import org.grails.forge.io.ConsoleOutput; -import org.grails.forge.options.*; +import org.grails.forge.options.BuildTool; +import org.grails.forge.options.GormImpl; +import org.grails.forge.options.JdkVersion; +import org.grails.forge.options.Options; +import org.grails.forge.options.ServletImpl; import org.grails.forge.util.NameUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.validation.constraints.Pattern; -import java.util.Collections; -import java.util.List; /** * Abstract implementation of a create controller. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java index b217f4ccb0d..0049b3c8078 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateController.java @@ -18,6 +18,11 @@ */ package org.grails.forge.api.create.github; +import java.net.URI; +import java.util.List; + +import jakarta.validation.constraints.Pattern; + import io.micronaut.context.annotation.Requires; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; @@ -35,20 +40,17 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import org.grails.forge.api.RequestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.grails.forge.api.DevelopmentReloading; +import org.grails.forge.api.RequestInfo; import org.grails.forge.application.ApplicationType; import org.grails.forge.client.github.v3.GitHubRepository; import org.grails.forge.options.BuildTool; import org.grails.forge.options.GormImpl; import org.grails.forge.options.JdkVersion; import org.grails.forge.options.ServletImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.validation.constraints.Pattern; -import java.net.URI; -import java.util.List; /** * GitHub create controller. @@ -87,23 +89,24 @@ public GitHubCreateController(GitHubCreateService gitHubCreateService, @Override @Get(uri = "/github/{type}/{name}{?features,gorm,servlet,build,reloading,javaVersion,code,state}", produces = MediaType.APPLICATION_JSON) @ApiResponses(value = { - @ApiResponse( - responseCode = "200", - description = "Created GitHub repository containing the generated application. In case " + - "the configuration contains launcher URI the redirect to launcher is sent.", - content = @Content( - mediaType = MediaType.APPLICATION_JSON - ) - ), - @ApiResponse( - responseCode = "307", - description = "Redirects to GitHub OAuth API to obtain user authorisation code before creating " + - "the GitHub repository." - ), - @ApiResponse( - responseCode = "307", - description = "Redirects back to launcher in case of successfully created GitHub repository." - )}) + @ApiResponse( + responseCode = "200", + description = "Created GitHub repository containing the generated application. In case " + + "the configuration contains launcher URI the redirect to launcher is sent.", + content = @Content( + mediaType = MediaType.APPLICATION_JSON + ) + ), + @ApiResponse( + responseCode = "307", + description = "Redirects to GitHub OAuth API to obtain user authorisation code before creating " + + "the GitHub repository." + ), + @ApiResponse( + responseCode = "307", + description = "Redirects back to launcher in case of successfully created GitHub repository." + ) + }) public HttpResponse createApp( @NonNull ApplicationType type, @Pattern(regexp = "[\\w\\d-_\\.]+") String name, @@ -154,14 +157,15 @@ public HttpResponse createApp( */ @Get(uri = "/github{?error,error_description}", produces = MediaType.APPLICATION_JSON) @ApiResponses(value = { - @ApiResponse( - responseCode = "307", - description = "Forwarded GitHub OAuth error message." - ), - @ApiResponse( - responseCode = "200", - description = "Returns GitHub OAuth application callback error." - )}) + @ApiResponse( + responseCode = "307", + description = "Forwarded GitHub OAuth error message." + ), + @ApiResponse( + responseCode = "200", + description = "Returns GitHub OAuth application callback error." + ) + }) public HttpResponse handleCallback( @Nullable String error, @Nullable @QueryValue("error_description") String errorDescription) { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java index 6800efa71f6..dc1dfd22851 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateOperation.java @@ -18,22 +18,24 @@ */ package org.grails.forge.api.create.github; +import java.util.List; + +import jakarta.validation.constraints.Pattern; + import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpHeaders; import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Header; -import org.grails.forge.api.RequestInfo; + import org.grails.forge.api.DevelopmentReloading; +import org.grails.forge.api.RequestInfo; import org.grails.forge.application.ApplicationType; import org.grails.forge.options.BuildTool; import org.grails.forge.options.GormImpl; import org.grails.forge.options.JdkVersion; import org.grails.forge.options.ServletImpl; -import jakarta.validation.constraints.Pattern; -import java.util.List; - /** * Defines the signature for creating an application in Github repository. * diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java index ba40f554a7a..cd65b3e9b1b 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubCreateService.java @@ -18,14 +18,28 @@ */ package org.grails.forge.api.create.github; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Stream; + +import jakarta.inject.Singleton; +import jakarta.validation.constraints.NotNull; + import io.micronaut.context.annotation.Requires; import io.micronaut.context.event.ApplicationEventPublisher; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.client.exceptions.HttpClientResponseException; -import jakarta.inject.Singleton; -import org.grails.forge.api.GrailsForgeConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.grails.forge.api.DevelopmentReloading; +import org.grails.forge.api.GrailsForgeConfiguration; import org.grails.forge.api.create.AbstractCreateController; import org.grails.forge.application.ApplicationType; import org.grails.forge.application.generator.GeneratorContext; @@ -43,18 +57,6 @@ import org.grails.forge.options.JdkVersion; import org.grails.forge.options.ServletImpl; import org.grails.forge.util.GitHubUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import jakarta.validation.constraints.NotNull; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Stream; /** * GitHub create service. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java index 388f220e3c4..dd36f198fd2 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/github/GitHubRedirectService.java @@ -18,20 +18,22 @@ */ package org.grails.forge.api.create.github; +import java.net.URI; +import java.util.UUID; + +import jakarta.inject.Singleton; +import jakarta.validation.constraints.NotNull; + import io.micronaut.context.annotation.Property; import io.micronaut.context.annotation.Requires; import io.micronaut.http.uri.UriBuilder; -import org.grails.forge.api.RequestInfo; -import org.grails.forge.api.GrailsForgeConfiguration; -import org.grails.forge.client.github.oauth.GitHubOAuthClient; -import org.grails.forge.client.github.v3.GitHubRepository; -import jakarta.inject.Singleton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import jakarta.validation.constraints.NotNull; -import java.net.URI; -import java.util.UUID; +import org.grails.forge.api.GrailsForgeConfiguration; +import org.grails.forge.api.RequestInfo; +import org.grails.forge.client.github.oauth.GitHubOAuthClient; +import org.grails.forge.client.github.v3.GitHubRepository; /** * Redirect service. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java index f2682c1a199..3f4a38071f0 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateController.java @@ -18,6 +18,16 @@ */ package org.grails.forge.api.create.zip; +import java.io.IOException; +import java.io.OutputStream; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.List; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; + import io.micronaut.context.event.ApplicationEventPublisher; import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; @@ -31,8 +41,12 @@ import io.micronaut.http.annotation.Header; import io.micronaut.scheduling.TaskExecutors; import io.micronaut.scheduling.annotation.ExecuteOn; +import io.micronaut.validation.Validated; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.grails.forge.api.DevelopmentReloading; import org.grails.forge.api.create.AbstractCreateController; import org.grails.forge.application.ApplicationType; @@ -44,18 +58,6 @@ import org.grails.forge.options.GormImpl; import org.grails.forge.options.JdkVersion; import org.grails.forge.options.ServletImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.micronaut.validation.Validated; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import java.io.IOException; -import java.io.OutputStream; -import java.io.Writer; -import java.nio.charset.Charset; -import java.util.List; /** * Implements the {@link ZipCreateOperation} interface for applications. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java index 3d74bd1470d..21ea2417a8c 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/create/zip/ZipCreateOperation.java @@ -18,20 +18,22 @@ */ package org.grails.forge.api.create.zip; +import java.util.List; + +import jakarta.validation.constraints.Pattern; + import io.micronaut.core.annotation.Nullable; import io.micronaut.core.io.Writable; import io.micronaut.http.HttpHeaders; import io.micronaut.http.HttpResponse; import io.micronaut.http.annotation.Header; + import org.grails.forge.api.DevelopmentReloading; import org.grails.forge.application.ApplicationType; import org.grails.forge.options.BuildTool; import org.grails.forge.options.GormImpl; -import org.grails.forge.options.ServletImpl; import org.grails.forge.options.JdkVersion; - -import jakarta.validation.constraints.Pattern; -import java.util.List; +import org.grails.forge.options.ServletImpl; /** * Defines the signature for creating an application. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java index 4f71dc63d54..c854c67ca2a 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffController.java @@ -18,6 +18,14 @@ */ package org.grails.forge.api.diff; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; + import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpStatus; @@ -25,6 +33,12 @@ import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.exceptions.HttpStatusException; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.reactivestreams.Publisher; +import reactor.core.publisher.Flux; + import org.grails.forge.api.RequestInfo; import org.grails.forge.api.UserAgentParser; import org.grails.forge.application.ApplicationType; @@ -33,20 +47,13 @@ import org.grails.forge.application.generator.ProjectGenerator; import org.grails.forge.diff.FeatureDiffer; import org.grails.forge.io.ConsoleOutput; -import org.grails.forge.options.*; +import org.grails.forge.options.BuildTool; +import org.grails.forge.options.DevelopmentReloading; +import org.grails.forge.options.GormImpl; +import org.grails.forge.options.JdkVersion; +import org.grails.forge.options.Options; +import org.grails.forge.options.ServletImpl; import org.grails.forge.util.NameUtils; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import org.reactivestreams.Publisher; -import reactor.core.publisher.Flux; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import java.io.IOException; -import java.util.Collections; -import java.util.List; /** * A controller for performing Diffs. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java index 17cafc7fd26..28861f357d3 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/diff/DiffOperations.java @@ -18,18 +18,24 @@ */ package org.grails.forge.api.diff; +import java.io.IOException; +import java.util.List; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; -import org.grails.forge.api.RequestInfo; -import org.grails.forge.application.ApplicationType; -import org.grails.forge.options.*; import io.swagger.v3.oas.annotations.Parameter; import org.reactivestreams.Publisher; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import java.io.IOException; -import java.util.List; +import org.grails.forge.api.RequestInfo; +import org.grails.forge.application.ApplicationType; +import org.grails.forge.options.BuildTool; +import org.grails.forge.options.DevelopmentReloading; +import org.grails.forge.options.GormImpl; +import org.grails.forge.options.JdkVersion; +import org.grails.forge.options.ServletImpl; /** * Operations for performing diffs. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/event/ApplicationGeneratingEvent.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/event/ApplicationGeneratingEvent.java index 3f3c77fed65..0e3fa74ec4d 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/event/ApplicationGeneratingEvent.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/event/ApplicationGeneratingEvent.java @@ -19,6 +19,7 @@ package org.grails.forge.api.event; import io.micronaut.context.event.ApplicationEvent; + import org.grails.forge.application.generator.GeneratorContext; /** diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ApplicationTypeSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ApplicationTypeSelectOptions.java index 1fcc1b99679..a909e74214e 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ApplicationTypeSelectOptions.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ApplicationTypeSelectOptions.java @@ -18,11 +18,12 @@ */ package org.grails.forge.api.options; -import org.grails.forge.api.ApplicationTypeDTO; -import org.grails.forge.api.SelectOptionDTO; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; +import org.grails.forge.api.ApplicationTypeDTO; +import org.grails.forge.api.SelectOptionDTO; @Schema(name = "ApplicationTypeSelectOptions") public class ApplicationTypeSelectOptions extends SelectOptionDTO { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java index cdaf421ad6d..e2a6ef54517 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/DevelopmentReloadingSelectOptions.java @@ -18,11 +18,12 @@ */ package org.grails.forge.api.options; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; -import org.grails.forge.api.SelectOptionDTO; -import org.grails.forge.api.DevelopmentReloadingDTO; -import java.util.List; +import org.grails.forge.api.DevelopmentReloadingDTO; +import org.grails.forge.api.SelectOptionDTO; @Schema(name = "DevelopmentReloadingSelectOptions") public class DevelopmentReloadingSelectOptions extends SelectOptionDTO { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/GormImplSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/GormImplSelectOptions.java index dfae59161b1..c4d2f227029 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/GormImplSelectOptions.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/GormImplSelectOptions.java @@ -18,12 +18,13 @@ */ package org.grails.forge.api.options; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; + import org.grails.forge.api.GormImplDTO; import org.grails.forge.api.SelectOptionDTO; -import java.util.List; - @Schema(name = "GormImplSelectOptions") public class GormImplSelectOptions extends SelectOptionDTO { public GormImplSelectOptions(List options, GormImplDTO defaultOption) { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/JdkVersionSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/JdkVersionSelectOptions.java index 48cb400ed64..1ef6123ec38 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/JdkVersionSelectOptions.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/JdkVersionSelectOptions.java @@ -18,11 +18,12 @@ */ package org.grails.forge.api.options; -import org.grails.forge.api.JdkVersionDTO; -import org.grails.forge.api.SelectOptionDTO; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; +import org.grails.forge.api.JdkVersionDTO; +import org.grails.forge.api.SelectOptionDTO; @Schema(name = "JdkVersionSelectOptions") public class JdkVersionSelectOptions extends SelectOptionDTO { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/LanguageSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/LanguageSelectOptions.java index 9b83f2ce787..1ba3c635309 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/LanguageSelectOptions.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/LanguageSelectOptions.java @@ -18,11 +18,12 @@ */ package org.grails.forge.api.options; -import org.grails.forge.api.LanguageDTO; -import org.grails.forge.api.SelectOptionDTO; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; -import java.util.List; +import org.grails.forge.api.LanguageDTO; +import org.grails.forge.api.SelectOptionDTO; @Schema(name = "LanguageSelectOptions") public class LanguageSelectOptions extends SelectOptionDTO { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsController.java index d4f4fe84e90..dda22db9d0b 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsController.java @@ -18,15 +18,17 @@ */ package org.grails.forge.api.options; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + import io.micronaut.context.MessageSource; import io.micronaut.context.i18n.ResourceBundleMessageSource; import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; + import org.grails.forge.api.RequestInfo; import org.grails.forge.api.SelectOptionsDTO; -import jakarta.inject.Inject; -import jakarta.inject.Singleton; /** * Gets Information about select options for the Grails Forge. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsOperations.java index 60a5e5e6f76..bf2c116f59c 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsOperations.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/SelectOptionsOperations.java @@ -18,9 +18,10 @@ */ package org.grails.forge.api.options; +import io.swagger.v3.oas.annotations.Parameter; + import org.grails.forge.api.RequestInfo; import org.grails.forge.api.SelectOptionsDTO; -import io.swagger.v3.oas.annotations.Parameter; public interface SelectOptionsOperations { SelectOptionsDTO selectOptions(@Parameter(hidden = true) RequestInfo serverURL); diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ServletImplSelectOptions.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ServletImplSelectOptions.java index 159a2d3031b..1662718967b 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ServletImplSelectOptions.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/options/ServletImplSelectOptions.java @@ -18,12 +18,13 @@ */ package org.grails.forge.api.options; +import java.util.List; + import io.swagger.v3.oas.annotations.media.Schema; + import org.grails.forge.api.SelectOptionDTO; import org.grails.forge.api.ServletImplDTO; -import java.util.List; - @Schema(name = "ServletImplSelectOptions") public class ServletImplSelectOptions extends SelectOptionDTO { public ServletImplSelectOptions(List options, ServletImplDTO defaultOption) { diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java index 5f92955ddd0..ad85fb4571b 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewController.java @@ -18,6 +18,11 @@ */ package org.grails.forge.api.preview; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + import io.micronaut.context.event.ApplicationEventPublisher; import io.micronaut.core.annotation.Nullable; import io.micronaut.http.HttpStatus; @@ -25,25 +30,25 @@ import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.exceptions.HttpStatusException; +import io.swagger.v3.oas.annotations.Parameter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.grails.forge.api.DevelopmentReloading; import org.grails.forge.api.Relationship; import org.grails.forge.api.RequestInfo; -import org.grails.forge.api.DevelopmentReloading; import org.grails.forge.api.create.AbstractCreateController; import org.grails.forge.application.ApplicationType; import org.grails.forge.application.Project; import org.grails.forge.application.generator.ProjectGenerator; import org.grails.forge.io.ConsoleOutput; import org.grails.forge.io.MapOutputHandler; -import org.grails.forge.options.*; +import org.grails.forge.options.BuildTool; +import org.grails.forge.options.GormImpl; +import org.grails.forge.options.JdkVersion; +import org.grails.forge.options.Options; +import org.grails.forge.options.ServletImpl; import org.grails.forge.util.NameUtils; -import io.swagger.v3.oas.annotations.Parameter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; /** * Previews an application contents. diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewDTO.java index b1548db17bd..a2fa31f9ec0 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewDTO.java @@ -18,12 +18,13 @@ */ package org.grails.forge.api.preview; +import java.util.Map; + import com.fasterxml.jackson.annotation.JsonInclude; import io.micronaut.core.annotation.Introspected; -import org.grails.forge.api.Linkable; import io.swagger.v3.oas.annotations.media.Schema; -import java.util.Map; +import org.grails.forge.api.Linkable; /** * A preview of the contents. @@ -33,7 +34,7 @@ */ @Introspected @Schema(name = "Preview", description = "Previews the contents of the generated ZIP") -public class PreviewDTO extends Linkable { +public class PreviewDTO extends Linkable { @JsonInclude private Map contents; diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java index e16700b32da..14b86e094c7 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/preview/PreviewOperations.java @@ -18,20 +18,21 @@ */ package org.grails.forge.api.preview; +import java.io.IOException; +import java.util.List; + import io.micronaut.core.annotation.NonNull; import io.micronaut.core.annotation.Nullable; import io.swagger.v3.oas.annotations.Parameter; -import org.grails.forge.api.RequestInfo; + import org.grails.forge.api.DevelopmentReloading; +import org.grails.forge.api.RequestInfo; import org.grails.forge.application.ApplicationType; import org.grails.forge.options.BuildTool; import org.grails.forge.options.GormImpl; import org.grails.forge.options.JdkVersion; import org.grails.forge.options.ServletImpl; -import java.io.IOException; -import java.util.List; - public interface PreviewOperations { /** * Previews an application. diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java index 43732af4e38..77a4090c953 100644 --- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java +++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/Application.java @@ -18,51 +18,62 @@ */ package org.grails.forge.cli; +import java.util.concurrent.Callable; +import java.util.function.BiFunction; + import io.micronaut.context.ApplicationContext; import io.micronaut.context.BeanContext; import io.micronaut.context.annotation.Prototype; import io.micronaut.core.annotation.TypeHint; import io.micronaut.inject.BeanDefinition; -import org.grails.forge.cli.command.*; -import org.grails.forge.io.ConsoleOutput; import picocli.CommandLine; -import java.util.concurrent.Callable; -import java.util.function.BiFunction; - - +import org.grails.forge.cli.command.BaseCommand; +import org.grails.forge.cli.command.CodeGenCommand; +import org.grails.forge.cli.command.CreateAppCommand; +import org.grails.forge.cli.command.CreatePluginCommand; +import org.grails.forge.cli.command.CreateRestApiCommand; +import org.grails.forge.cli.command.CreateWebPluginCommand; +import org.grails.forge.cli.command.CreateWebappCommand; +import org.grails.forge.cli.command.DevelopmentReloadingCandidates; +import org.grails.forge.cli.command.DevelopmentReloadingConverter; +import org.grails.forge.cli.command.GormImplCandidates; +import org.grails.forge.cli.command.GormImplConverter; +import org.grails.forge.cli.command.ServletImplCandidates; +import org.grails.forge.cli.command.ServletImplConverter; +import org.grails.forge.io.ConsoleOutput; @CommandLine.Command(name = "grails-forge-cli", description = { - "Grails Forge CLI command line interface for generating projects and services.", - "Application generation commands are:", - "", - "* @|bold create-app|@ @|yellow NAME|@", - "* @|bold create-webapp|@ @|yellow NAME|@", - "* @|bold create-restapi|@ @|yellow NAME|@", - "* @|bold create-plugin|@ @|yellow NAME|@", - "* @|bold create-web-plugin|@ @|yellow NAME|@" + "Grails Forge CLI command line interface for generating projects and services.", + "Application generation commands are:", + "", + "* @|bold create-app|@ @|yellow NAME|@", + "* @|bold create-webapp|@ @|yellow NAME|@", + "* @|bold create-restapi|@ @|yellow NAME|@", + "* @|bold create-plugin|@ @|yellow NAME|@", + "* @|bold create-web-plugin|@ @|yellow NAME|@" }, synopsisHeading = "@|bold,underline Usage:|@ ", optionListHeading = "%n@|bold,underline Options:|@%n", commandListHeading = "%n@|bold,underline Commands:|@%n", subcommands = { - // Creation commands - CreateAppCommand.class, - CreateWebappCommand.class, - CreatePluginCommand.class, - CreateWebPluginCommand.class, - CreateRestApiCommand.class + // Creation commands + CreateAppCommand.class, + CreateWebappCommand.class, + CreatePluginCommand.class, + CreateWebPluginCommand.class, + CreateRestApiCommand.class }) @Prototype @TypeHint({ - Application.class, - GormImplCandidates.class, - GormImplConverter.class, - ServletImplCandidates.class, - ServletImplConverter.class, - CommonOptionsMixin.class, - DevelopmentReloadingCandidates.class, - DevelopmentReloadingConverter.class + Application.class, + GormImplCandidates.class, + GormImplConverter.class, + ServletImplCandidates.class, + ServletImplConverter.class, + CommonOptionsMixin.class, + DevelopmentReloadingCandidates.class, + DevelopmentReloadingConverter.class }) public class Application extends BaseCommand implements Callable { diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java index 6420468b2c3..3bc8ef964d2 100644 --- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java +++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CodeGenConfig.java @@ -18,28 +18,33 @@ */ package org.grails.forge.cli; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import io.micronaut.context.BeanContext; import io.micronaut.core.annotation.Introspected; import io.micronaut.core.beans.BeanIntrospection; import io.micronaut.inject.qualifiers.Qualifiers; +import org.yaml.snakeyaml.Yaml; + import org.grails.forge.application.ApplicationType; import org.grails.forge.feature.AvailableFeatures; import org.grails.forge.feature.DefaultFeature; import org.grails.forge.feature.Feature; import org.grails.forge.io.ConsoleOutput; import org.grails.forge.io.FileSystemOutputHandler; +import org.grails.forge.options.DevelopmentReloading; import org.grails.forge.options.JdkVersion; import org.grails.forge.options.Language; import org.grails.forge.options.Options; -import org.grails.forge.options.DevelopmentReloading; -import org.yaml.snakeyaml.Yaml; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.*; -import java.util.stream.Collectors; @Introspected public class CodeGenConfig { diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CommonOptionsMixin.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CommonOptionsMixin.java index 9d2d4f1f4c6..046156a033d 100644 --- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CommonOptionsMixin.java +++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/CommonOptionsMixin.java @@ -19,10 +19,11 @@ package org.grails.forge.cli; import io.micronaut.core.annotation.ReflectiveAccess; -import org.grails.forge.cli.util.GrailsVersionProvider; import picocli.CommandLine; import picocli.CommandLine.Option; +import org.grails.forge.cli.util.GrailsVersionProvider; + /** * Mixin that adds help, version and other common options to a command. Example usage: *
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/GrailsPicocliFactory.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/GrailsPicocliFactory.java
index c91fcdfafd5..92f54565186 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/GrailsPicocliFactory.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/GrailsPicocliFactory.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.cli;
 
+import java.util.Optional;
+
 import io.micronaut.context.ApplicationContext;
 import io.micronaut.context.BeanContext;
 import io.micronaut.core.annotation.TypeHint;
 import picocli.CommandLine;
 
-import java.util.Optional;
-
 /**
  * Picocli factory implementation that uses a Micronaut BeanContext to obtain bean instances.
  */
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java
index 618b1cecd8b..9250e84cc1d 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java
@@ -18,6 +18,9 @@
  */
 package org.grails.forge.cli;
 
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+
 import org.fusesource.jansi.AnsiConsole;
 import org.jline.reader.EndOfFileException;
 import org.jline.reader.LineReader;
@@ -31,9 +34,6 @@
 import picocli.CommandLine;
 import picocli.shell.jline3.PicocliJLineCompleter;
 
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-
 import static picocli.CommandLine.Help.Ansi.AUTO;
 
 public class InteractiveShell {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/AddPropertyCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/AddPropertyCommand.java
index 14e060e44cd..7e1be5a1c21 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/AddPropertyCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/AddPropertyCommand.java
@@ -18,23 +18,25 @@
  */
 package org.grails.forge.cli.command;
 
-import grails.codegen.model.AbstractMemberDefinition;
-import grails.codegen.model.DomainFieldModifier;
-import grails.codegen.model.PropertyDefinition;
+import java.io.File;
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
-import org.grails.forge.cli.CodeGenConfig;
-import org.grails.forge.io.ConsoleOutput;
-import org.grails.forge.io.FileSystemOutputHandler;
-import org.grails.forge.io.OutputHandler;
 import picocli.CommandLine.Command;
 import picocli.CommandLine.Option;
 import picocli.CommandLine.Parameters;
 
-import java.io.File;
-import java.io.IOException;
+import grails.codegen.model.AbstractMemberDefinition;
+import grails.codegen.model.DomainFieldModifier;
+import grails.codegen.model.PropertyDefinition;
+import org.grails.forge.cli.CodeGenConfig;
+import org.grails.forge.io.ConsoleOutput;
+import org.grails.forge.io.FileSystemOutputHandler;
+import org.grails.forge.io.OutputHandler;
 
 /**
  * CLI command to add a property to an existing domain class.
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/BaseCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/BaseCommand.java
index 7abdfa429fb..9c938ed68e6 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/BaseCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/BaseCommand.java
@@ -18,15 +18,16 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.Locale;
+
 import io.micronaut.context.env.CachedEnvironment;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.core.annotation.ReflectiveAccess;
+import picocli.CommandLine;
+
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.cli.CommonOptionsMixin;
 import org.grails.forge.io.ConsoleOutput;
-import picocli.CommandLine;
-
-import java.util.Locale;
 
 public class BaseCommand implements ConsoleOutput {
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CodeGenCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CodeGenCommand.java
index 7c501201cdd..db12d6194bf 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CodeGenCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CodeGenCommand.java
@@ -18,9 +18,16 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+import java.util.concurrent.Callable;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.BeanContext;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.io.ConsoleOutput;
@@ -28,11 +35,6 @@
 import org.grails.forge.io.OutputHandler;
 import org.grails.forge.template.TemplateRenderer;
 import org.grails.forge.util.NameUtils;
-import jakarta.inject.Inject;
-import picocli.CommandLine;
-
-import java.io.IOException;
-import java.util.concurrent.Callable;
 
 public abstract class CodeGenCommand extends BaseCommand implements Callable {
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateAppCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateAppCommand.java
index 34c2ce476d1..c3a599d26bd 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateAppCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateAppCommand.java
@@ -18,17 +18,18 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.micronaut.context.annotation.Prototype;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.ReflectiveAccess;
+import picocli.CommandLine;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.WebAvailableFeatures;
 import org.grails.forge.application.generator.ProjectGenerator;
-import picocli.CommandLine;
-
-import java.util.ArrayList;
-import java.util.List;
 
 @CommandLine.Command(name = CreateAppCommand.NAME, description = "Creates an application")
 @Prototype
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
index aa478ae6749..12aa1e236e7 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java
@@ -18,9 +18,16 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.StringUtils;
+import picocli.CommandLine;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.Project;
@@ -28,14 +35,12 @@
 import org.grails.forge.feature.AvailableFeatures;
 import org.grails.forge.io.FileSystemOutputHandler;
 import org.grails.forge.io.OutputHandler;
-import org.grails.forge.options.*;
+import org.grails.forge.options.DevelopmentReloading;
+import org.grails.forge.options.GormImpl;
+import org.grails.forge.options.JdkVersion;
+import org.grails.forge.options.Options;
+import org.grails.forge.options.ServletImpl;
 import org.grails.forge.util.NameUtils;
-import picocli.CommandLine;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
 
 public abstract class CreateCommand extends BaseCommand implements Callable {
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateControllerCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateControllerCommand.java
index ebf0682f6be..151106354eb 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateControllerCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateControllerCommand.java
@@ -18,10 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.cli.command.templates.controller;
@@ -31,9 +36,6 @@
 import org.grails.forge.template.RenderResult;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.TemplateRenderer;
-import picocli.CommandLine;
-
-import java.io.IOException;
 
 @CommandLine.Command(name = CreateControllerCommand.NAME, description = "Creates a Grails Controller")
 public class CreateControllerCommand extends CodeGenCommand {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateDomainClassCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateDomainClassCommand.java
index 5c37809c6b1..7ba6e6b6c1c 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateDomainClassCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateDomainClassCommand.java
@@ -18,10 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.cli.command.templates.domain;
@@ -31,9 +36,6 @@
 import org.grails.forge.template.RenderResult;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.TemplateRenderer;
-import picocli.CommandLine;
-
-import java.io.IOException;
 
 @CommandLine.Command(name = CreateDomainClassCommand.NAME, description = "Creates a Domain Class")
 public class CreateDomainClassCommand extends CodeGenCommand {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateInterceptorCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateInterceptorCommand.java
index 6e42d947e5f..0d708b20566 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateInterceptorCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateInterceptorCommand.java
@@ -18,10 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.cli.command.templates.interceptor;
@@ -31,9 +36,6 @@
 import org.grails.forge.template.RenderResult;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.TemplateRenderer;
-import picocli.CommandLine;
-
-import java.io.IOException;
 
 @CommandLine.Command(name = CreateInterceptorCommand.NAME, description = "Creates a Interceptor Class")
 public class CreateInterceptorCommand extends CodeGenCommand {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateJobCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateJobCommand.java
index 81e3efc8bcb..d33aedb39e6 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateJobCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateJobCommand.java
@@ -18,11 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
-import java.io.IOException;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.cli.command.templates.job;
@@ -31,7 +35,6 @@
 import org.grails.forge.io.OutputHandler;
 import org.grails.forge.template.RenderResult;
 import org.grails.forge.template.RockerTemplate;
-import picocli.CommandLine;
 
 @CommandLine.Command(name = CreateJobCommand.NAME, description = "Creates a new Quartz scheduled job")
 public class CreateJobCommand extends CodeGenCommand {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreatePluginCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreatePluginCommand.java
index f88b4c90677..713d870d318 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreatePluginCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreatePluginCommand.java
@@ -18,17 +18,18 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.micronaut.context.annotation.Prototype;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.ReflectiveAccess;
+import picocli.CommandLine;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.PluginAvailableFeatures;
 import org.grails.forge.application.generator.ProjectGenerator;
-import picocli.CommandLine;
-
-import java.util.ArrayList;
-import java.util.List;
 
 @CommandLine.Command(name = CreatePluginCommand.NAME, description = "Creates an Grails Plugin")
 @Prototype
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateRestApiCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateRestApiCommand.java
index 9f7f9b26023..218e2357a37 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateRestApiCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateRestApiCommand.java
@@ -18,17 +18,18 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.micronaut.context.annotation.Prototype;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.ReflectiveAccess;
+import picocli.CommandLine;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.RestApiAvailableFeatures;
 import org.grails.forge.application.generator.ProjectGenerator;
-import picocli.CommandLine;
-
-import java.util.ArrayList;
-import java.util.List;
 
 @CommandLine.Command(name = CreateRestApiCommand.NAME, description = "Creates an REST API")
 @Prototype
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateServiceCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateServiceCommand.java
index 4c6640e19d8..9fa939d75d4 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateServiceCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateServiceCommand.java
@@ -18,10 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.cli.command.templates.service;
@@ -31,9 +36,6 @@
 import org.grails.forge.template.RenderResult;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.TemplateRenderer;
-import picocli.CommandLine;
-
-import java.io.IOException;
 
 @CommandLine.Command(name = CreateServiceCommand.NAME, description = "Creates a Service Class")
 public class CreateServiceCommand extends CodeGenCommand {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateTagLibCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateTagLibCommand.java
index 70eea1dadec..003631be3eb 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateTagLibCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateTagLibCommand.java
@@ -18,10 +18,15 @@
  */
 package org.grails.forge.cli.command;
 
+import java.io.IOException;
+
+import jakarta.inject.Inject;
+
 import io.micronaut.context.annotation.Parameter;
 import io.micronaut.core.annotation.ReflectiveAccess;
 import io.micronaut.core.util.functional.ThrowingSupplier;
-import jakarta.inject.Inject;
+import picocli.CommandLine;
+
 import org.grails.forge.application.Project;
 import org.grails.forge.cli.CodeGenConfig;
 import org.grails.forge.cli.command.templates.taglib;
@@ -31,9 +36,6 @@
 import org.grails.forge.template.RenderResult;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.TemplateRenderer;
-import picocli.CommandLine;
-
-import java.io.IOException;
 
 @CommandLine.Command(name = CreateTagLibCommand.NAME, description = "Creates a Grails TagLib")
 public class CreateTagLibCommand extends CodeGenCommand {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebPluginCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebPluginCommand.java
index 693e7e10eb2..b6df720233d 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebPluginCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebPluginCommand.java
@@ -18,17 +18,18 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.micronaut.context.annotation.Prototype;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.ReflectiveAccess;
+import picocli.CommandLine;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.WebPluginAvailableFeatures;
 import org.grails.forge.application.generator.ProjectGenerator;
-import picocli.CommandLine;
-
-import java.util.ArrayList;
-import java.util.List;
 
 @CommandLine.Command(name = CreateWebPluginCommand.NAME, description = "Creates an Grails Web Plugin")
 @Prototype
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebappCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebappCommand.java
index 465544bd908..8d7c66acccd 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebappCommand.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateWebappCommand.java
@@ -18,17 +18,18 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import io.micronaut.context.annotation.Prototype;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.ReflectiveAccess;
+import picocli.CommandLine;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.WebAvailableFeatures;
 import org.grails.forge.application.generator.ProjectGenerator;
-import picocli.CommandLine;
-
-import java.util.ArrayList;
-import java.util.List;
 
 @CommandLine.Command(name = CreateWebappCommand.NAME, description = "Creates an application")
 @Prototype
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java
index 49e80e4c65d..f8ef80293c0 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingCandidates.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.DevelopmentReloading;
-
 import java.util.ArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.grails.forge.options.DevelopmentReloading;
+
 public class DevelopmentReloadingCandidates extends ArrayList {
 
     public DevelopmentReloadingCandidates() {
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java
index fb2a5211bb9..1542a973bdb 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/DevelopmentReloadingConverter.java
@@ -18,9 +18,10 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.DevelopmentReloading;
 import picocli.CommandLine;
 
+import org.grails.forge.options.DevelopmentReloading;
+
 public class DevelopmentReloadingConverter implements CommandLine.ITypeConverter {
 
     public static final DevelopmentReloading DEFAULT_RELOADING = DevelopmentReloading.DEVTOOLS;
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplCandidates.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplCandidates.java
index 55246650308..38d7c836d37 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplCandidates.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplCandidates.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.GormImpl;
-
 import java.util.ArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.grails.forge.options.GormImpl;
+
 public class GormImplCandidates extends ArrayList {
     public GormImplCandidates() {
         super(Stream.of(GormImpl.values()).map(gi -> gi.toString().toLowerCase()).collect(Collectors.toList()));
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java
index 5b802d3b38e..c0c47e9e9b0 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java
@@ -19,9 +19,10 @@
 package org.grails.forge.cli.command;
 
 import io.micronaut.core.annotation.Introspected;
-import org.grails.forge.options.GormImpl;
 import picocli.CommandLine;
 
+import org.grails.forge.options.GormImpl;
+
 @Introspected
 public class GormImplConverter implements CommandLine.ITypeConverter {
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageCandidates.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageCandidates.java
index 8f202915fa7..4596278d60c 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageCandidates.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageCandidates.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.Language;
-
 import java.util.ArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.grails.forge.options.Language;
+
 public class LanguageCandidates extends ArrayList {
     public LanguageCandidates() {
         super(Stream.of(Language.values()).map(l -> l.toString().toLowerCase()).collect(Collectors.toList()));
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageConverter.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageConverter.java
index 373f53b9d8d..4bda0860c24 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageConverter.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/LanguageConverter.java
@@ -18,9 +18,10 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.Language;
 import picocli.CommandLine;
 
+import org.grails.forge.options.Language;
+
 public class LanguageConverter implements CommandLine.ITypeConverter {
 
     @Override
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ListFeatures.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ListFeatures.java
index a7ba128b482..38a9443c093 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ListFeatures.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ListFeatures.java
@@ -18,7 +18,16 @@
  */
 package org.grails.forge.cli.command;
 
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+
 import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.OperatingSystem;
@@ -29,14 +38,6 @@
 import org.grails.forge.io.ConsoleOutput;
 import org.grails.forge.options.Options;
 
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
-
 public class ListFeatures {
 
     private final AvailableFeatures availableFeatures;
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplCandidates.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplCandidates.java
index 0b6032453a9..1d7460d7baf 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplCandidates.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplCandidates.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.cli.command;
 
-import org.grails.forge.options.ServletImpl;
-
 import java.util.ArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.grails.forge.options.ServletImpl;
+
 public class ServletImplCandidates extends ArrayList {
     public ServletImplCandidates() {
         super(Stream.of(ServletImpl.values()).map(servlet -> servlet.toString().toLowerCase()).collect(Collectors.toList()));
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplConverter.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplConverter.java
index 87e18708306..f404c75e374 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplConverter.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/ServletImplConverter.java
@@ -19,9 +19,10 @@
 package org.grails.forge.cli.command;
 
 import io.micronaut.core.annotation.Introspected;
-import org.grails.forge.options.ServletImpl;
 import picocli.CommandLine;
 
+import org.grails.forge.options.ServletImpl;
+
 @Introspected
 public class ServletImplConverter implements CommandLine.ITypeConverter {
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java
index 7e13a15c721..eb4090d8a65 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/util/GrailsVersionProvider.java
@@ -18,11 +18,13 @@
  */
 package org.grails.forge.cli.util;
 
+import java.util.Objects;
+
 import jakarta.inject.Singleton;
-import org.grails.forge.util.VersionInfo;
+
 import picocli.CommandLine.IVersionProvider;
 
-import java.util.Objects;
+import org.grails.forge.util.VersionInfo;
 
 /**
  * Generates version information. Example usage:
@@ -49,8 +51,8 @@ public class GrailsVersionProvider implements IVersionProvider {
 
     public String[] getVersion() {
         return new String[] {
-                "Grails Version: " + VersionInfo.getGrailsVersion(),
-                "JVM Version: " + Objects.requireNonNullElse(System.getProperty("java.version"), "")
+            "Grails Version: " + VersionInfo.getGrailsVersion(),
+            "JVM Version: " + Objects.requireNonNullElse(System.getProperty("java.version"), "")
         };
     }
 }
diff --git a/grails-forge/grails-forge-core/build.gradle b/grails-forge/grails-forge-core/build.gradle
index 11445540639..1378c370ddd 100644
--- a/grails-forge/grails-forge-core/build.gradle
+++ b/grails-forge/grails-forge-core/build.gradle
@@ -128,7 +128,7 @@ nohttp {
     source.exclude('**/pom.rocker.raw')
 }
 
-['processResources', 'sourcesJar', 'spotlessJavaMisc', 'checkstyleNohttp'].each { name ->
+['processResources', 'sourcesJar', 'checkstyleNohttp'].each { name ->
     tasks.named(name).configure {
         it.dependsOn(copyGrailsWrapper, grailsVersionInfoTask)
     }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java
index 408933655ae..013224b9b1f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java
@@ -18,17 +18,21 @@
  */
 package org.grails.forge.analytics;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Objects;
+
 import io.micronaut.core.annotation.Creator;
 import io.micronaut.core.annotation.Introspected;
 import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
-import org.grails.forge.options.*;
+import org.grails.forge.options.DevelopmentReloading;
+import org.grails.forge.options.GormImpl;
+import org.grails.forge.options.JdkVersion;
+import org.grails.forge.options.ServletImpl;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Objects;
-
 @Introspected
 public class Generated {
     private final ApplicationType type;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ApplicationType.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ApplicationType.java
index 2d53ab634a9..60ef046c5d1 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ApplicationType.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ApplicationType.java
@@ -18,11 +18,11 @@
  */
 package org.grails.forge.application;
 
+import java.util.Locale;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.naming.Named;
 
-import java.util.Locale;
-
 public enum ApplicationType implements Named {
 
     WEB("Web Application", "A Grails® framework Web Application"),
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java
index f499008902b..32bdb002a41 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/ContextFactory.java
@@ -18,8 +18,15 @@
  */
 package org.grails.forge.application;
 
-import io.micronaut.core.annotation.Nullable;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.DefaultCoordinateResolver;
 import org.grails.forge.feature.AvailableFeatures;
@@ -28,12 +35,12 @@
 import org.grails.forge.feature.FeatureContext;
 import org.grails.forge.feature.validation.FeatureValidator;
 import org.grails.forge.io.ConsoleOutput;
-import org.grails.forge.options.*;
-
-import java.util.Collections;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Set;
+import org.grails.forge.options.BuildTool;
+import org.grails.forge.options.DevelopmentReloading;
+import org.grails.forge.options.GormImpl;
+import org.grails.forge.options.Language;
+import org.grails.forge.options.Options;
+import org.grails.forge.options.ServletImpl;
 
 @Singleton
 public class ContextFactory {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/PluginAvailableFeatures.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/PluginAvailableFeatures.java
index 61855d3ed77..49c76e26cb3 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/PluginAvailableFeatures.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/PluginAvailableFeatures.java
@@ -18,13 +18,14 @@
  */
 package org.grails.forge.application;
 
+import java.util.List;
+
 import jakarta.inject.Named;
 import jakarta.inject.Singleton;
+
 import org.grails.forge.feature.BaseAvailableFeatures;
 import org.grails.forge.feature.Feature;
 
-import java.util.List;
-
 @Named("plugin")
 @Singleton
 public class PluginAvailableFeatures extends BaseAvailableFeatures {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/Project.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/Project.java
index 8847b9d52d5..db9e2478a8b 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/Project.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/Project.java
@@ -18,11 +18,11 @@
  */
 package org.grails.forge.application;
 
-import org.grails.forge.util.NameUtils;
-
 import java.util.HashMap;
 import java.util.Map;
 
+import org.grails.forge.util.NameUtils;
+
 public class Project extends ProjectIdentifier {
 
     private static final String PACKAGE_NAME = "packageName";
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/RestApiAvailableFeatures.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/RestApiAvailableFeatures.java
index 206d959267e..856287a2766 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/RestApiAvailableFeatures.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/RestApiAvailableFeatures.java
@@ -18,13 +18,14 @@
  */
 package org.grails.forge.application;
 
+import java.util.List;
+
 import jakarta.inject.Named;
 import jakarta.inject.Singleton;
+
 import org.grails.forge.feature.BaseAvailableFeatures;
 import org.grails.forge.feature.Feature;
 
-import java.util.List;
-
 @Named("rest_api")
 @Singleton
 public class RestApiAvailableFeatures extends BaseAvailableFeatures {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebAvailableFeatures.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebAvailableFeatures.java
index ea6a84209b8..2d3896c4b74 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebAvailableFeatures.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebAvailableFeatures.java
@@ -18,13 +18,14 @@
  */
 package org.grails.forge.application;
 
+import java.util.List;
+
 import jakarta.inject.Named;
 import jakarta.inject.Singleton;
+
 import org.grails.forge.feature.BaseAvailableFeatures;
 import org.grails.forge.feature.Feature;
 
-import java.util.List;
-
 @Named("web")
 @Singleton
 public class WebAvailableFeatures extends BaseAvailableFeatures {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebPluginAvailableFeatures.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebPluginAvailableFeatures.java
index 25b7c36b462..abe8f78303e 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebPluginAvailableFeatures.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/WebPluginAvailableFeatures.java
@@ -18,13 +18,14 @@
  */
 package org.grails.forge.application;
 
+import java.util.List;
+
 import jakarta.inject.Named;
 import jakarta.inject.Singleton;
+
 import org.grails.forge.feature.BaseAvailableFeatures;
 import org.grails.forge.feature.Feature;
 
-import java.util.List;
-
 @Named("web_plugin")
 @Singleton
 public class WebPluginAvailableFeatures extends BaseAvailableFeatures {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java
index 71502385d3a..9c81866bf66 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/DefaultProjectGenerator.java
@@ -18,10 +18,17 @@
  */
 package org.grails.forge.application.generator;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+
+import jakarta.inject.Singleton;
+
 import io.micronaut.context.BeanContext;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.inject.qualifiers.Qualifiers;
-import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.ContextFactory;
 import org.grails.forge.application.OperatingSystem;
@@ -39,11 +46,6 @@
 import org.grails.forge.template.Template;
 import org.grails.forge.template.TemplateRenderer;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.function.Function;
-
 @Singleton
 public class DefaultProjectGenerator implements ProjectGenerator {
     private final ContextFactory contextFactory;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java
index d0713701b85..a27a41d8216 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/GeneratorContext.java
@@ -18,15 +18,31 @@
  */
 package org.grails.forge.application.generator;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
 import com.fizzed.rocker.RockerModel;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.application.Project;
 import org.grails.forge.build.BuildPlugin;
 import org.grails.forge.build.BuildProperties;
-import org.grails.forge.build.dependencies.*;
+import org.grails.forge.build.dependencies.Coordinate;
+import org.grails.forge.build.dependencies.CoordinateResolver;
+import org.grails.forge.build.dependencies.Dependency;
+import org.grails.forge.build.dependencies.DependencyContext;
+import org.grails.forge.build.dependencies.LookupFailedException;
+import org.grails.forge.build.dependencies.Scope;
 import org.grails.forge.build.gradle.GradleRepository;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.Features;
@@ -35,15 +51,20 @@
 import org.grails.forge.feature.config.BootstrapConfiguration;
 import org.grails.forge.feature.config.Configuration;
 import org.grails.forge.feature.other.template.markdownLink;
-import org.grails.forge.options.*;
+import org.grails.forge.options.DevelopmentReloading;
+import org.grails.forge.options.GormImpl;
+import org.grails.forge.options.JdkVersion;
+import org.grails.forge.options.Language;
+import org.grails.forge.options.Options;
+import org.grails.forge.options.ServletImpl;
+import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.TestRockerModelProvider;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.RockerWritable;
 import org.grails.forge.template.Template;
 import org.grails.forge.template.Writable;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.*;
-
 /**
  * A context object used when generating projects.
  *
@@ -294,7 +315,7 @@ public String getIntegrationTestSourcePath(String path) {
     }
 
     RockerModel parseModel(RockerModel javaTemplate, RockerModel groovyTemplate) {
-       return groovyTemplate;
+        return groovyTemplate;
     }
 
     public void addTemplate(String name, String path, TestRockerModelProvider testRockerModelProvider) {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/ProjectGenerator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/ProjectGenerator.java
index 685eab9b22e..c1b4120edeb 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/ProjectGenerator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/application/generator/ProjectGenerator.java
@@ -18,8 +18,11 @@
  */
 package org.grails.forge.application.generator;
 
+import java.util.List;
+
 import io.micronaut.context.annotation.DefaultImplementation;
 import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.application.Project;
@@ -27,8 +30,6 @@
 import org.grails.forge.io.OutputHandler;
 import org.grails.forge.options.Options;
 
-import java.util.List;
-
 @DefaultImplementation(DefaultProjectGenerator.class)
 public interface ProjectGenerator {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/BuildPlugin.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/BuildPlugin.java
index 6af46a707a0..a4ade3e5e90 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/BuildPlugin.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/BuildPlugin.java
@@ -21,6 +21,7 @@
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.core.order.Ordered;
+
 import org.grails.forge.build.dependencies.CoordinateResolver;
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.template.Writable;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Coordinate.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Coordinate.java
index 5fb61cdf75e..c97e7e5a0b8 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Coordinate.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Coordinate.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.build.dependencies;
 
+import java.util.Comparator;
+
 import io.micronaut.core.annotation.Introspected;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.core.order.OrderUtil;
 
-import java.util.Comparator;
-
 @Introspected
 public interface Coordinate {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DefaultCoordinateResolver.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DefaultCoordinateResolver.java
index 2ff403db8ee..836b064fec9 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DefaultCoordinateResolver.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DefaultCoordinateResolver.java
@@ -18,13 +18,14 @@
  */
 package org.grails.forge.build.dependencies;
 
-import io.micronaut.context.annotation.Primary;
-import io.micronaut.core.annotation.NonNull;
-import jakarta.inject.Singleton;
-
 import java.util.Arrays;
 import java.util.Optional;
 
+import jakarta.inject.Singleton;
+
+import io.micronaut.context.annotation.Primary;
+import io.micronaut.core.annotation.NonNull;
+
 @Singleton
 @Primary
 public class DefaultCoordinateResolver implements CoordinateResolver {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java
index 1604a9cec2a..94603d6e558 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Dependency.java
@@ -18,11 +18,12 @@
  */
 package org.grails.forge.build.dependencies;
 
+import java.util.Objects;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
-import org.grails.forge.template.Writable;
 
-import java.util.Objects;
+import org.grails.forge.template.Writable;
 
 public final class Dependency {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyContext.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyContext.java
index 8c18b25f5da..eb4236990ca 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyContext.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyContext.java
@@ -19,10 +19,11 @@
 package org.grails.forge.build.dependencies;
 
 
+import java.util.Collection;
+
 import io.micronaut.core.annotation.NonNull;
-import org.grails.forge.build.gradle.GradleRepository;
 
-import java.util.Collection;
+import org.grails.forge.build.gradle.GradleRepository;
 
 public interface DependencyContext {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyCoordinate.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyCoordinate.java
index 6df627bc3c2..3e845fc79d0 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyCoordinate.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/DependencyCoordinate.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.build.dependencies;
 
+import java.util.Objects;
+
 import io.micronaut.core.annotation.Introspected;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.core.order.Ordered;
 
-import java.util.Objects;
-
 @Introspected
 public class DependencyCoordinate implements Coordinate, Ordered {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/PomDependencyVersionResolver.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/PomDependencyVersionResolver.java
index 87a9f5c1ef8..5d445d9acba 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/PomDependencyVersionResolver.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/PomDependencyVersionResolver.java
@@ -18,18 +18,6 @@
  */
 package org.grails.forge.build.dependencies;
 
-import io.micronaut.core.annotation.NonNull;
-import io.micronaut.core.io.ResourceResolver;
-import io.micronaut.core.util.StringUtils;
-import jakarta.inject.Singleton;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
@@ -38,6 +26,20 @@
 import java.util.Optional;
 import java.util.stream.Collectors;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.core.io.ResourceResolver;
+import io.micronaut.core.util.StringUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
 @Singleton
 public class PomDependencyVersionResolver implements CoordinateResolver {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java
index 67a619d9ae3..d1878a56ef6 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/dependencies/Scope.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.build.dependencies;
 
-import io.micronaut.core.annotation.NonNull;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
+import io.micronaut.core.annotation.NonNull;
+
 public class Scope {
 
     public static final Scope ANNOTATION_PROCESSOR = new Scope(Source.MAIN, Collections.singletonList(Phase.ANNOTATION_PROCESSING));
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/DefaultGradleRepository.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/DefaultGradleRepository.java
index 4bcebb23d83..6db443de899 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/DefaultGradleRepository.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/DefaultGradleRepository.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.build.gradle;
 
-import io.micronaut.core.annotation.NonNull;
-
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import io.micronaut.core.annotation.NonNull;
+
 public class DefaultGradleRepository implements GradleRepository {
     private final int order;
     private final String url;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java
index 62afcc40ae6..c16cbc4e9b2 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuild.java
@@ -18,11 +18,6 @@
  */
 package org.grails.forge.build.gradle;
 
-import io.micronaut.core.annotation.NonNull;
-import org.grails.forge.template.Writable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -34,6 +29,12 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import io.micronaut.core.annotation.NonNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.grails.forge.template.Writable;
+
 public class GradleBuild {
     private static final Logger LOG = LoggerFactory.getLogger(GradleBuild.class);
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuildCreator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuildCreator.java
index 82beefc4619..c37844d15d1 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuildCreator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleBuildCreator.java
@@ -18,15 +18,17 @@
  */
 package org.grails.forge.build.gradle;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
+import jakarta.inject.Singleton;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.order.OrderUtil;
-import jakarta.inject.Singleton;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.options.BuildTool;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 @Singleton
 public class GradleBuildCreator {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java
index a4b43954c8c..cfee3593883 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleConfiguration.java
@@ -18,14 +18,15 @@
  */
 package org.grails.forge.build.gradle;
 
+import java.util.Optional;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.order.Ordered;
+
 import org.grails.forge.build.dependencies.Phase;
 import org.grails.forge.build.dependencies.Scope;
 import org.grails.forge.options.DevelopmentReloading;
 
-import java.util.Optional;
-
 public enum GradleConfiguration implements Ordered {
     CLASSPATH("classpath", -2),
     PROFILE("profile", -1),
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java
index 0f72ed14a4b..5f25714b34c 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleDependency.java
@@ -18,20 +18,21 @@
  */
 package org.grails.forge.build.gradle;
 
+import static org.grails.forge.build.gradle.GradleConfiguration.INTEGRATION_TEST_IMPLEMENTATION_TEST_FIXTURES;
+
+import java.util.Comparator;
+import java.util.Objects;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.core.order.OrderUtil;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.build.dependencies.DependencyCoordinate;
 import org.grails.forge.template.Writable;
 
-import java.util.Comparator;
-import java.util.Objects;
-
-import static org.grails.forge.build.gradle.GradleConfiguration.INTEGRATION_TEST_IMPLEMENTATION_TEST_FIXTURES;
-
 public class GradleDependency extends DependencyCoordinate {
 
     public static final Comparator COMPARATOR = (o1, o2) -> {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java
index bd85c6ba142..a8c214b3ee7 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradlePlugin.java
@@ -18,18 +18,22 @@
  */
 package org.grails.forge.build.gradle;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.build.BuildPlugin;
-import org.grails.forge.build.dependencies.*;
+import org.grails.forge.build.dependencies.Coordinate;
+import org.grails.forge.build.dependencies.CoordinateResolver;
+import org.grails.forge.build.dependencies.LookupFailedException;
+import org.grails.forge.build.dependencies.Scope;
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.template.Writable;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
 public class GradlePlugin implements BuildPlugin {
 
     private final String id;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleRepository.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleRepository.java
index 06ab59206b5..a7f816088df 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleRepository.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/build/gradle/GradleRepository.java
@@ -18,14 +18,14 @@
  */
 package org.grails.forge.build.gradle;
 
-import io.micronaut.core.annotation.NonNull;
-import io.micronaut.core.order.Ordered;
-
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.core.order.Ordered;
+
 public interface GradleRepository extends Ordered {
     @NonNull
     String toSnippet(String basePadding);
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
index 16e549a42f1..6999e687fc4 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/oauth/AccessToken.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.client.github.oauth;
 
+import jakarta.validation.constraints.NotNull;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.micronaut.core.annotation.Introspected;
 
-import jakarta.validation.constraints.NotNull;
-
 /**
  * @author Pavol Gressa
  * @since 6.0.0
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubSecretsPublicKey.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubSecretsPublicKey.java
index 5916bfab3a7..ff1b00c99a6 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubSecretsPublicKey.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubSecretsPublicKey.java
@@ -47,4 +47,3 @@ public String getKeyId() {
         return keyId;
     }
 }
-
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubUser.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubUser.java
index ce3836943ca..a05cd0aeb98 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubUser.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubUser.java
@@ -38,7 +38,7 @@ public class GitHubUser {
     @JsonCreator
     public GitHubUser(
             @JsonProperty("login") String login,
-            @JsonProperty("email")  String email,
+            @JsonProperty("email") String email,
             @JsonProperty("name") String name) {
         this.login = login;
         this.email = email;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubWorkflowRuns.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubWorkflowRuns.java
index e95f19f5809..e4b8d2e495d 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubWorkflowRuns.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/client/github/v3/GitHubWorkflowRuns.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.client.github.v3;
 
+import java.util.List;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.micronaut.core.annotation.Introspected;
 
-import java.util.List;
-
 /**
  * GitHub workflow runs.
  *
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java
index b6e95a2e9d3..0b45573c63f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/defaults/LanguageDefaults.java
@@ -20,6 +20,7 @@
 
 import io.micronaut.core.annotation.Creator;
 import io.micronaut.core.annotation.Introspected;
+
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.options.DevelopmentReloading;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java
index 62a2d4aeab0..5583f2ad6e4 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/diff/FeatureDiffer.java
@@ -18,11 +18,18 @@
  */
 package org.grails.forge.diff;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import jakarta.inject.Singleton;
+
 import com.github.difflib.DiffUtils;
 import com.github.difflib.UnifiedDiffUtils;
 import com.github.difflib.patch.Patch;
 import io.micronaut.core.annotation.Nullable;
-import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.application.Project;
@@ -32,11 +39,6 @@
 import org.grails.forge.io.MapOutputHandler;
 import org.grails.forge.options.Options;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Methods for diffing projects and features.
  *
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/ApplicationFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/ApplicationFeature.java
index 2ae4e2c080b..263aa8c35c6 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/ApplicationFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/ApplicationFeature.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature;
 
 import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.generator.GeneratorContext;
 
 public interface ApplicationFeature extends Feature {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/AvailableFeatures.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/AvailableFeatures.java
index e3aac954790..94d8800df89 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/AvailableFeatures.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/AvailableFeatures.java
@@ -18,11 +18,11 @@
  */
 package org.grails.forge.feature;
 
-import io.micronaut.core.annotation.NonNull;
-
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import io.micronaut.core.annotation.NonNull;
+
 public interface AvailableFeatures extends Iterable {
 
     Optional findFeature(@NonNull String name);
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/BaseAvailableFeatures.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/BaseAvailableFeatures.java
index e1d19144070..a208a668b4d 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/BaseAvailableFeatures.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/BaseAvailableFeatures.java
@@ -18,9 +18,6 @@
  */
 package org.grails.forge.feature;
 
-import io.micronaut.core.annotation.NonNull;
-import org.grails.forge.application.ApplicationType;
-
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -30,6 +27,10 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import io.micronaut.core.annotation.NonNull;
+
+import org.grails.forge.application.ApplicationType;
+
 public class BaseAvailableFeatures implements AvailableFeatures {
     private final Map features;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Category.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Category.java
index ea5ff9e9983..5d992362fd6 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Category.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Category.java
@@ -25,35 +25,35 @@
  * @since 6.0.0
  */
 public class Category {
-    public static final String API                  = "API";
-    public static final String BPM                  = "BPM";
-    public static final String CACHE                = "Cache";
-    public static final String CICD                 = "CI/CD";
-    public static final String CLIENT               = "Client";
-    public static final String CLOUD                = "Cloud";
-    public static final String CONFIGURATION        = "Configuration";
-    public static final String DATABASE             = "Database";
-    public static final String DEV_TOOLS            = "Development Tools";
-    public static final String DISTRIBUTED_CONFIG   = "Distributed Configuration";
-    public static final String DOCUMENTATION        = "Documentation";
-    public static final String IOT                  = "Internet of Things";
-    public static final String LANGUAGES            = "Languages";
-    public static final String LOGGING              = "Logging";
-    public static final String MANAGEMENT           = "Management";
-    public static final String MESSAGING            = "Messaging";
-    public static final String OTHER                = "Other";
-    public static final String PACKAGING            = "Packaging";
-    public static final String REACTIVE             = "Reactive";
-    public static final String RESILIENCE           = "Resilience";
-    public static final String SEARCH               = "Search Engine";
-    public static final String SECURITY             = "Security";
-    public static final String SERVER               = "Server";
-    public static final String SERVERLESS           = "Serverless";
-    public static final String SERVICE_DISCOVERY    = "Service Discovery";
-    public static final String SPRING               = "Spring Framework";
-    public static final String SSL                  = "SSL";
-    public static final String TESTING              = "Testing";
-    public static final String TRACING              = "Distributed Tracing";
-    public static final String VALIDATION           = "Validation";
-    public static final String VIEW                 = "View Rendering";
+    public static final String API = "API";
+    public static final String BPM = "BPM";
+    public static final String CACHE = "Cache";
+    public static final String CICD = "CI/CD";
+    public static final String CLIENT = "Client";
+    public static final String CLOUD = "Cloud";
+    public static final String CONFIGURATION = "Configuration";
+    public static final String DATABASE = "Database";
+    public static final String DEV_TOOLS = "Development Tools";
+    public static final String DISTRIBUTED_CONFIG = "Distributed Configuration";
+    public static final String DOCUMENTATION = "Documentation";
+    public static final String IOT = "Internet of Things";
+    public static final String LANGUAGES = "Languages";
+    public static final String LOGGING = "Logging";
+    public static final String MANAGEMENT = "Management";
+    public static final String MESSAGING = "Messaging";
+    public static final String OTHER = "Other";
+    public static final String PACKAGING = "Packaging";
+    public static final String REACTIVE = "Reactive";
+    public static final String RESILIENCE = "Resilience";
+    public static final String SEARCH = "Search Engine";
+    public static final String SECURITY = "Security";
+    public static final String SERVER = "Server";
+    public static final String SERVERLESS = "Serverless";
+    public static final String SERVICE_DISCOVERY = "Service Discovery";
+    public static final String SPRING = "Spring Framework";
+    public static final String SSL = "SSL";
+    public static final String TESTING = "Testing";
+    public static final String TRACING = "Distributed Tracing";
+    public static final String VALIDATION = "Validation";
+    public static final String VIEW = "View Rendering";
 }
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/DefaultFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/DefaultFeature.java
index 54b1473cce9..7ae949e37d9 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/DefaultFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/DefaultFeature.java
@@ -18,11 +18,11 @@
  */
 package org.grails.forge.feature;
 
+import java.util.Set;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 /**
  * A default feature is one that should be applied to a
  * project conditionally without being explicitly selected.
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Feature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Feature.java
index 2abe72d73a1..9a9e655cd78 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Feature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Feature.java
@@ -24,6 +24,7 @@
 import io.micronaut.core.naming.Described;
 import io.micronaut.core.naming.Named;
 import io.micronaut.core.order.Ordered;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
index f8dea471f4e..4acbcad6a25 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/FeatureContext.java
@@ -18,7 +18,15 @@
  */
 package org.grails.forge.feature;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+
 import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.feature.reloading.ReloadingFeature;
@@ -27,8 +35,6 @@
 import org.grails.forge.options.JdkVersion;
 import org.grails.forge.options.Options;
 
-import java.util.*;
-
 import static java.util.stream.Collectors.collectingAndThen;
 import static java.util.stream.Collectors.toSet;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java
index 75cded6bf65..dc29eacba43 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/Features.java
@@ -18,6 +18,12 @@
  */
 package org.grails.forge.feature;
 
+import java.util.ArrayList;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.lang.LanguageFeature;
 import org.grails.forge.feature.reloading.ReloadingFeature;
@@ -27,12 +33,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.ArrayList;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 public class Features extends ArrayList {
 
     private final Set featureList;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/asciidoctor/Asciidoctor.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/asciidoctor/Asciidoctor.java
index 869bdd76c9c..7b31822f088 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/asciidoctor/Asciidoctor.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/asciidoctor/Asciidoctor.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.asciidoctor;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java
index 78c47bc36f5..fe8282abc58 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/assetPipeline/AssetPipeline.java
@@ -18,8 +18,13 @@
  */
 package org.grails.forge.feature.assetPipeline;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.List;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.CoordinateResolver;
@@ -31,9 +36,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.URLTemplate;
 
-import java.util.Set;
-import java.util.List;
-
 @Singleton
 public class AssetPipeline implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Dockerfile.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Dockerfile.java
index cf213384a9c..2cdcdf63d32 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Dockerfile.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Dockerfile.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.feature.build.gradle;
 
-import io.micronaut.core.annotation.NonNull;
-import io.micronaut.core.annotation.Nullable;
-
 import java.util.ArrayList;
 import java.util.List;
 
+import io.micronaut.core.annotation.NonNull;
+import io.micronaut.core.annotation.Nullable;
+
 public class Dockerfile {
     @Nullable
     private String baseImage;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java
index fc71a88a464..c6749ef7f2e 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/Gradle.java
@@ -18,7 +18,11 @@
  */
 package org.grails.forge.feature.build.gradle;
 
+import java.util.Set;
+import java.util.function.Function;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
@@ -39,9 +43,6 @@
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.Set;
-import java.util.function.Function;
-
 @Singleton
 public class Gradle implements BuildFeature {
     private static final String WRAPPER_JAR = "gradle/wrapper/gradle-wrapper.jar";
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java
index b3046a01770..53286b94255 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleBuildSrc.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.build.gradle;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.CoordinateResolver;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java
index afc86b0fe6a..28317031d4f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/GradleSettingsFile.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.build.gradle;
 
+import java.util.function.Function;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
@@ -30,8 +33,6 @@
 import org.grails.forge.options.BuildTool;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.function.Function;
-
 @Singleton
 public class GradleSettingsFile implements GradleSettingsFileFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java
index b933875e843..c2a868b7bdb 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/EHCache.java
@@ -18,12 +18,13 @@
  */
 package org.grails.forge.feature.cache;
 
+import java.util.Map;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 
-import java.util.Map;
-
 @Singleton
 public class EHCache implements CacheFeature {
 
@@ -45,7 +46,7 @@ public String getDescription() {
 
     @Override
     public void apply(GeneratorContext generatorContext) {
-        Map config  = generatorContext.getConfiguration();
+        Map config = generatorContext.getConfiguration();
         config.put("grails.cache.ehcache.ehcacheXmlLocation", "classpath:ehcache.xml");
         config.put("grails.cache.ehcache.lockTimeout", 200);
         generatorContext.addDependency(Dependency.builder()
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java
index 09f91bde398..f307e8d1cb4 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/cache/GrailsCache.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.cache;
 
+import java.util.Map;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -26,8 +29,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.Map;
-
 @Singleton
 public class GrailsCache implements Feature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Configuration.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Configuration.java
index 7313f52a028..3f11813959a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Configuration.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Configuration.java
@@ -18,15 +18,15 @@
  */
 package org.grails.forge.feature.config;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
 import io.micronaut.core.util.CollectionUtils;
 import io.micronaut.core.util.StringUtils;
 
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Objects;
-
 /**
  * Models application environment configuration to specify where the configuration is rooted
  * for the given configuration values (key/value pairs).
@@ -50,7 +50,7 @@ public class Configuration extends LinkedHashMap {
      */
     public Configuration(@NonNull String sourceSet, @NonNull String fileName, @NonNull String templateKey, @Nullable String environment) {
         super();
-        this.path = environment != null && environment.equals("test") ? "src/" + sourceSet  + "/resources/" : "grails-app/conf/";
+        this.path = environment != null && environment.equals("test") ? "src/" + sourceSet + "/resources/" : "grails-app/conf/";
         this.fileName = fileName;
         this.templateKey = templateKey;
         this.environment = environment;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/ConfigurationFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/ConfigurationFeature.java
index 0020b375bc8..4470642e2a3 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/ConfigurationFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/ConfigurationFeature.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.feature.config;
 
+import java.util.function.Function;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.Category;
 import org.grails.forge.feature.OneOfFeature;
 import org.grails.forge.template.Template;
 
-import java.util.function.Function;
-
 public interface ConfigurationFeature extends OneOfFeature {
 
     String ENVIRONMENTS_KEY = "environments";
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Properties.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Properties.java
index 080c423ef21..f48ef0c4a4d 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Properties.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Properties.java
@@ -18,14 +18,15 @@
  */
 package org.grails.forge.feature.config;
 
+import java.util.function.Function;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.FeaturePhase;
 import org.grails.forge.template.PropertiesTemplate;
 import org.grails.forge.template.Template;
 
-import java.util.function.Function;
-
 @Singleton
 public class Properties implements ConfigurationFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Yaml.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Yaml.java
index 28cc738f7e7..792570e1874 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Yaml.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/config/Yaml.java
@@ -18,7 +18,11 @@
  */
 package org.grails.forge.feature.config;
 
+import java.util.Set;
+import java.util.function.Function;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
@@ -27,9 +31,6 @@
 import org.grails.forge.template.Template;
 import org.grails.forge.template.YamlTemplate;
 
-import java.util.Set;
-import java.util.function.Function;
-
 @Singleton
 public class Yaml implements ConfigurationFeature, DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverConfigurationFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverConfigurationFeature.java
index 4fc8641e0b5..e87044e4113 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverConfigurationFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverConfigurationFeature.java
@@ -18,16 +18,16 @@
  */
 package org.grails.forge.feature.database;
 
-import org.grails.forge.feature.Feature;
-
 import java.util.Map;
 import java.util.Optional;
 
+import org.grails.forge.feature.Feature;
+
 import static org.grails.forge.feature.config.ConfigurationFeature.DEV_ENVIRONMENT_KEY;
-import static org.grails.forge.feature.config.ConfigurationFeature.TEST_ENVIRONMENT_KEY;
-import static org.grails.forge.feature.config.ConfigurationFeature.PROD_ENVIRONMENT_KEY;
 import static org.grails.forge.feature.config.ConfigurationFeature.ENVIRONMENTS_KEY;
+import static org.grails.forge.feature.config.ConfigurationFeature.PROD_ENVIRONMENT_KEY;
 import static org.grails.forge.feature.config.ConfigurationFeature.PROPERTIES_KEY;
+import static org.grails.forge.feature.config.ConfigurationFeature.TEST_ENVIRONMENT_KEY;
 import static org.grails.forge.feature.database.HibernateGorm.PREFIX;
 
 /**
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverFeature.java
index ead67ce4ba3..895c699d7cb 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/DatabaseDriverFeature.java
@@ -18,14 +18,14 @@
  */
 package org.grails.forge.feature.database;
 
+import java.util.Collections;
+import java.util.Map;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Category;
 import org.grails.forge.feature.FeatureContext;
 import org.grails.forge.feature.OneOfFeature;
 
-import java.util.Collections;
-import java.util.Map;
-
 public abstract class DatabaseDriverFeature implements OneOfFeature {
 
     private final TestContainers testContainers;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GormFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GormFeature.java
index 6fb6af98166..728b0d6fd83 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GormFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GormFeature.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.feature.database;
 
+import java.util.Map;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Category;
 import org.grails.forge.feature.DefaultFeature;
 
-import java.util.Map;
-
 public abstract class GormFeature implements DefaultFeature {
 
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java
index fb958659208..53bc73ccb1c 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java
@@ -18,8 +18,10 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.core.annotation.Nullable;
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java
index 93e924e9d70..413df0fa1cc 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.context.annotation.Primary;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.context.annotation.Primary;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +31,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 @Primary
 public class H2 extends DatabaseDriverFeature implements DefaultFeature {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java
index 568030e73f1..9969e6a91a7 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/HibernateGorm.java
@@ -18,8 +18,13 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.context.annotation.Primary;
+import java.util.Map;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.context.annotation.Primary;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,9 +33,6 @@
 import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.Options;
 
-import java.util.Map;
-import java.util.Set;
-
 @Primary
 @Singleton
 public class HibernateGorm extends GormFeature implements DatabaseDriverConfigurationFeature {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java
index d81b0e1523f..4a787541cf5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoGorm.java
@@ -18,8 +18,13 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.core.annotation.Nullable;
+import java.util.Map;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,9 +33,6 @@
 import org.grails.forge.options.GormImpl;
 import org.grails.forge.options.Options;
 
-import java.util.Map;
-import java.util.Set;
-
 @Singleton
 public class MongoGorm extends GormOneOfFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java
index 6ce42eef78e..a421acd3ced 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MongoSync.java
@@ -18,14 +18,15 @@
  */
 package org.grails.forge.feature.database;
 
+import java.util.Map;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.feature.Category;
 
-import java.util.Map;
-
 @Singleton
 public class MongoSync extends MongoFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java
index 6518bc3ae06..7e76c2bc445 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/MySQL.java
@@ -18,8 +18,10 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.core.annotation.NonNull;
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java
index 7c06dd46f9d..2465ab3f048 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/PostgreSQL.java
@@ -18,8 +18,10 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.core.annotation.NonNull;
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java
index 040905a7906..a1d444ee21e 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/SQLServer.java
@@ -18,8 +18,10 @@
  */
 package org.grails.forge.feature.database;
 
-import io.micronaut.core.annotation.NonNull;
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java
index 10b4b6e8d57..7562f0b8998 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/TestContainers.java
@@ -18,9 +18,13 @@
  */
 package org.grails.forge.feature.database;
 
+import java.util.Optional;
+
+import jakarta.inject.Singleton;
+
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.core.annotation.Nullable;
-import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -31,8 +35,6 @@
 import org.grails.forge.feature.test.Spock;
 import org.grails.forge.template.StringTemplate;
 
-import java.util.Optional;
-
 @Singleton
 public class TestContainers implements Feature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/GitHubWorkflowFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/GitHubWorkflowFeature.java
index 8d7e3e210f6..1b2b8496161 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/GitHubWorkflowFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/GitHubWorkflowFeature.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.feature.github.workflows;
 
+import java.util.Collections;
+import java.util.List;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Category;
 import org.grails.forge.feature.Feature;
 
-import java.util.Collections;
-import java.util.List;
-
 /**
  * GitHub workflow feature.
  *
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/plain/PlainGithubWorkflowFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/plain/PlainGithubWorkflowFeature.java
index ab01213311e..d9cfce37fef 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/plain/PlainGithubWorkflowFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/github/workflows/plain/PlainGithubWorkflowFeature.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.github.workflows.plain;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.github.workflows.GitHubWorkflowFeature;
 import org.grails.forge.feature.github.workflows.plain.templates.plainGithubWorkflow;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java
index a784fc573a5..96717f97556 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsBase.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.grails;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,8 +31,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.URLTemplate;
 
-import java.util.Set;
-
 @Singleton
 public class GrailsBase implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsConsole.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsConsole.java
index 4ab1fdc74e0..8371553190b 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsConsole.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsConsole.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.grails;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -26,8 +29,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class GrailsConsole implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java
index fa87cac0c27..054a59261c5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsDefaultPlugins.java
@@ -18,7 +18,11 @@
  */
 package org.grails.forge.feature.grails;
 
+import java.util.Arrays;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,9 +32,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.URLTemplate;
 
-import java.util.Arrays;
-import java.util.Set;
-
 @Singleton
 public class GrailsDefaultPlugins implements DefaultFeature {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java
index 1a3c0400288..3080fea8288 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsGradlePlugin.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.grails;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.CoordinateResolver;
@@ -30,8 +33,6 @@
 import org.grails.forge.feature.web.GrailsWeb;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 class GrailsGradlePlugin implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsUrlMappings.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsUrlMappings.java
index ca51e392ca6..14154b16ced 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsUrlMappings.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsUrlMappings.java
@@ -18,16 +18,17 @@
  */
 package org.grails.forge.feature.grails;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
+import org.grails.forge.feature.grails.templates.urlMappings;
 import org.grails.forge.options.Options;
 import org.grails.forge.template.RockerTemplate;
-import org.grails.forge.feature.grails.templates.urlMappings;
-
-import java.util.Set;
 
 @Singleton
 public class GrailsUrlMappings implements DefaultFeature {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java
index 5c81045d989..2f6d124d325 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grails/GrailsWebConsole.java
@@ -18,15 +18,16 @@
  */
 package org.grails.forge.feature.grails;
 
+import java.util.Map;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.feature.Category;
 import org.grails.forge.feature.Feature;
 
-import java.util.Map;
-
 @Singleton
 public class GrailsWebConsole implements Feature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsProfiles/GrailsProfiles.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsProfiles/GrailsProfiles.java
index 53806b0ba3d..99315373420 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsProfiles/GrailsProfiles.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsProfiles/GrailsProfiles.java
@@ -18,7 +18,11 @@
  */
 package org.grails.forge.feature.grailsProfiles;
 
+import java.util.Map;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,9 +32,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Map;
-import java.util.Set;
-
 @Singleton
 public class GrailsProfiles implements DefaultFeature {
     @Override
@@ -55,8 +56,6 @@ public boolean supports(ApplicationType applicationType) {
 
     @Override
     public void apply(GeneratorContext generatorContext) {
-
-
         final Map config = generatorContext.getConfiguration();
         // Required by profile commands when package is not set
         config.put("grails.codegen.defaultPackage", generatorContext.getProject().getPackageName());
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsWrapper/GrailsWrapper.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsWrapper/GrailsWrapper.java
index 569db93881c..68a098a8ff7 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsWrapper/GrailsWrapper.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/grailsWrapper/GrailsWrapper.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.grailsWrapper;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.application.generator.GeneratorContext;
@@ -28,8 +31,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.BinaryTemplate;
 
-import java.util.Set;
-
 @Singleton
 public class GrailsWrapper implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/lang/groovy/GrailsApplication.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/lang/groovy/GrailsApplication.java
index 964d8534809..4ee6e1224a0 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/lang/groovy/GrailsApplication.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/lang/groovy/GrailsApplication.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.lang.groovy;
 
-import io.micronaut.core.annotation.Nullable;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.Nullable;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.gradle.GradlePlugin;
@@ -30,8 +34,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.Set;
-
 @Singleton
 public class GrailsApplication implements GrailsApplicationFeature, DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java
index 23e340a951d..808fd66f4b3 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/logging/Logback.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.logging;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.application.generator.GeneratorContext;
@@ -29,8 +32,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.Set;
-
 @Singleton
 public class Logback implements LoggingFeature, DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/GrailsMicronaut.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/GrailsMicronaut.java
index 7e849717ed6..fb2e9b571a7 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/GrailsMicronaut.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/GrailsMicronaut.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.micronaut;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Optional;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
@@ -30,8 +34,6 @@
 import org.grails.forge.feature.FeatureContext;
 import org.grails.forge.options.JdkVersion;
 
-import java.util.Optional;
-
 @Singleton
 public class GrailsMicronaut implements Feature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautHttpClient.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautHttpClient.java
index 8b2315dbb78..3dfba102234 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautHttpClient.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/micronaut/MicronautHttpClient.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.micronaut;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Optional;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Coordinate;
@@ -30,8 +34,6 @@
 import org.grails.forge.feature.FeatureContext;
 import org.grails.forge.options.JdkVersion;
 
-import java.util.Optional;
-
 @Singleton
 public class MicronautHttpClient implements Feature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java
index 413d849cbab..8b946ae8f1f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/migration/DatabaseMigrationPlugin.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.migration;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.feature.migration.templates.dbMigrationGradle;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/AppName.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/AppName.java
index 0677e277093..cfa81250421 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/AppName.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/AppName.java
@@ -18,7 +18,11 @@
  */
 package org.grails.forge.feature.other;
 
+import java.util.Map;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.DefaultFeature;
@@ -26,9 +30,6 @@
 import org.grails.forge.feature.FeaturePhase;
 import org.grails.forge.options.Options;
 
-import java.util.Map;
-import java.util.Set;
-
 @Singleton
 public class AppName implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java
index bcc607cca8b..70c929642e5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/GrailsQuartz.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.other;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java
index ca7d76baf0c..3d048436612 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/HibernateValidator.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.other;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/Readme.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/Readme.java
index c82545081c8..873738880ef 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/Readme.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/Readme.java
@@ -18,8 +18,16 @@
  */
 package org.grails.forge.feature.other;
 
-import io.micronaut.core.annotation.NonNull;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.DefaultFeature;
@@ -32,12 +40,6 @@
 import org.grails.forge.template.Template;
 import org.grails.forge.template.Writable;
 
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 @Singleton
 public class Readme implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/ShadePlugin.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/ShadePlugin.java
index 4181f191bb6..599cc3e4d81 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/ShadePlugin.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/other/ShadePlugin.java
@@ -18,8 +18,10 @@
  */
 package org.grails.forge.feature.other;
 
-import io.micronaut.core.annotation.NonNull;
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.gradle.GradlePlugin;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java
index 274f271d673..327cceee08c 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/Jrebel.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.reloading;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.gradle.GradlePlugin;
@@ -26,8 +29,6 @@
 import org.grails.forge.options.DevelopmentReloading;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class Jrebel implements ReloadingFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
index d00b1d93b39..ea9cdc4135f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/reloading/SpringBootDevTools.java
@@ -18,6 +18,8 @@
  */
 package org.grails.forge.feature.reloading;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
 
 import org.grails.forge.application.ApplicationType;
@@ -31,8 +33,6 @@
 import org.grails.forge.options.DevelopmentReloading;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class SpringBootDevTools implements ReloadingFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/sitemesh3/Sitemesh3.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/sitemesh3/Sitemesh3.java
index 73fd1dc66a3..fe322f9c22e 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/sitemesh3/Sitemesh3.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/sitemesh3/Sitemesh3.java
@@ -19,6 +19,7 @@
 package org.grails.forge.feature.sitemesh3;
 
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java
index 33f00095f24..1b962326def 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootAutoconfigure.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.spring;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +30,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class SpringBootAutoconfigure implements DefaultFeature {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java
index cd9175a322e..219a2bf8e86 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootJettyFeature.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.spring;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +31,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.options.ServletImpl;
 
-import java.util.Set;
-
 @Singleton
 public class SpringBootJettyFeature extends SpringBootEmbeddedServlet {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java
index bb833b238fd..5cde71f42f8 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootStarterFeature.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.spring;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -26,8 +29,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class SpringBootStarterFeature implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java
index f74ef4cfb3d..ec1cd8e447a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootTomcatFeature.java
@@ -18,9 +18,13 @@
  */
 package org.grails.forge.feature.spring;
 
+import java.util.Set;
+
+import jakarta.inject.Singleton;
+
 import io.micronaut.context.annotation.Primary;
 import io.micronaut.core.annotation.NonNull;
-import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,8 +32,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.options.ServletImpl;
 
-import java.util.Set;
-
 @Primary
 @Singleton
 public class SpringBootTomcatFeature extends SpringBootEmbeddedServlet {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java
index 3d946901aaa..843762ab22d 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootUndertowFeature.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.spring;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +31,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.options.ServletImpl;
 
-import java.util.Set;
-
 @Singleton
 public class SpringBootUndertowFeature extends SpringBootEmbeddedServlet {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootVirtualThreads.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootVirtualThreads.java
index 8d19a87e668..f8fe65695ca 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootVirtualThreads.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringBootVirtualThreads.java
@@ -18,12 +18,13 @@
  */
 package org.grails.forge.feature.spring;
 
+import java.util.Map;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 
-import java.util.Map;
-
 @Singleton
 public class SpringBootVirtualThreads implements SpringThreadingFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringResources.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringResources.java
index 79eb8285248..27155ef3786 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringResources.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/spring/SpringResources.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.spring;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.feature.Category;
@@ -28,8 +31,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.Set;
-
 @Singleton
 public class SpringResources implements DefaultFeature {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java
index d91f61c9096..5d2c70e4b2f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithTestcontainers.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.test;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.Project;
 import org.grails.forge.application.generator.GeneratorContext;
@@ -29,11 +33,12 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.FeatureContext;
 import org.grails.forge.feature.FeaturePhase;
-import org.grails.forge.options.*;
+import org.grails.forge.options.DefaultTestRockerModelProvider;
+import org.grails.forge.options.Options;
+import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.TestRockerModelProvider;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.Set;
-
 @Singleton
 public class GebWithTestcontainers implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java
index c27ee16d777..5076eb68710 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GebWithWebDriverBinaries.java
@@ -18,21 +18,28 @@
  */
 package org.grails.forge.feature.test;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.stream.Stream;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.Project;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.build.gradle.GradlePlugin;
-import org.grails.forge.feature.*;
+import org.grails.forge.feature.Category;
+import org.grails.forge.feature.Feature;
+import org.grails.forge.feature.FeatureContext;
+import org.grails.forge.feature.FeaturePhase;
+import org.grails.forge.feature.test.template.gebConfig;
 import org.grails.forge.feature.test.template.webdriverBinariesPlugin;
-import org.grails.forge.options.*;
+import org.grails.forge.options.DefaultTestRockerModelProvider;
+import org.grails.forge.options.TestFramework;
+import org.grails.forge.options.TestRockerModelProvider;
 import org.grails.forge.template.RockerTemplate;
 import org.grails.forge.template.RockerWritable;
-import org.grails.forge.feature.test.template.gebConfig;
-
-import java.util.stream.Stream;
 
 @Singleton
 public class GebWithWebDriverBinaries implements Feature {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java
index 47f7b7de1fd..e854153b3e5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GormTestingSupport.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.test;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +30,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class GormTestingSupport implements DefaultFeature {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java
index b88dc39da6d..793b840d828 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/GrailsWebTestingSupport.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.test;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +30,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class GrailsWebTestingSupport implements DefaultFeature {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java
index 02cf19a9376..91da385437d 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Mockito.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.test;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +30,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class Mockito implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java
index 6acafa48f62..2c3d1f3dae5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/MockitoValidator.java
@@ -18,14 +18,15 @@
  */
 package org.grails.forge.feature.test;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.validation.FeatureValidator;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class MockitoValidator implements FeatureValidator {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java
index 53ce37d421a..b2fe04c0510 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/Spock.java
@@ -18,8 +18,12 @@
  */
 package org.grails.forge.feature.test;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +31,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class Spock implements Feature, DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java
index f1946b4a513..fe9f0ed5d00 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/test/ViewsJsonTestingSupport.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.test;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,8 +30,6 @@
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class ViewsJsonTestingSupport implements DefaultFeature {
     @Override
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/CompositeFeatureValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/CompositeFeatureValidator.java
index e5d16f60b34..fde4574989a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/CompositeFeatureValidator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/CompositeFeatureValidator.java
@@ -18,15 +18,17 @@
  */
 package org.grails.forge.feature.validation;
 
-import io.micronaut.context.annotation.Primary;
+import java.util.List;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.context.annotation.Primary;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.List;
-import java.util.Set;
-
 @Primary
 @Singleton
 public class CompositeFeatureValidator implements FeatureValidator {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/FeatureValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/FeatureValidator.java
index 77f77d73f9a..599b6a14ae2 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/FeatureValidator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/FeatureValidator.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.feature.validation;
 
+import java.util.Set;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 public interface FeatureValidator {
 
     void validatePreProcessing(Options options, ApplicationType applicationType, Set features);
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/OneOfFeatureValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/OneOfFeatureValidator.java
index 4561b6fec5f..7bf0a110ef7 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/OneOfFeatureValidator.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/validation/OneOfFeatureValidator.java
@@ -18,16 +18,17 @@
  */
 package org.grails.forge.feature.validation;
 
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.OneOfFeature;
 import org.grails.forge.options.Options;
 
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 @Singleton
 public class OneOfFeatureValidator implements FeatureValidator {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java
index 207777d7a29..ec3428aaa55 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/GrailsGsp.java
@@ -18,8 +18,14 @@
  */
 package org.grails.forge.feature.view;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -32,10 +38,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.template.URLTemplate;
 
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-
 @Singleton
 public class GrailsGsp implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java
index e0ea7078a59..0385eed5f37 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java
@@ -18,7 +18,10 @@
  */
 package org.grails.forge.feature.view;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -28,8 +31,6 @@
 import org.grails.forge.options.Options;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.Set;
-
 @Singleton
 public class Scaffolding implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java
index 82b6d16a107..0f9df588485 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/json/ViewJson.java
@@ -18,8 +18,14 @@
  */
 package org.grails.forge.feature.view.json;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
@@ -27,15 +33,15 @@
 import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.view.GrailsViews;
-import org.grails.forge.feature.view.json.templates.*;
+import org.grails.forge.feature.view.json.templates._errors;
+import org.grails.forge.feature.view.json.templates._object;
+import org.grails.forge.feature.view.json.templates.error;
+import org.grails.forge.feature.view.json.templates.index;
+import org.grails.forge.feature.view.json.templates.notFound;
 import org.grails.forge.feature.web.GrailsWeb;
 import org.grails.forge.options.Options;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-
 @Singleton
 public class ViewJson extends GrailsViews implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java
index 76260932fba..730c21e7062 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/markup/ViewMarkup.java
@@ -18,20 +18,26 @@
  */
 package org.grails.forge.feature.view.markup;
 
-import io.micronaut.core.annotation.NonNull;
+import java.util.Arrays;
+import java.util.Map;
+
 import jakarta.inject.Singleton;
+
+import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.application.generator.GeneratorContext;
 import org.grails.forge.build.dependencies.Dependency;
 import org.grails.forge.build.gradle.GradlePlugin;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.feature.view.GrailsViews;
-import org.grails.forge.feature.view.markup.templates.*;
+import org.grails.forge.feature.view.markup.templates._errors;
+import org.grails.forge.feature.view.markup.templates._object;
+import org.grails.forge.feature.view.markup.templates.error;
+import org.grails.forge.feature.view.markup.templates.index;
+import org.grails.forge.feature.view.markup.templates.notFound;
 import org.grails.forge.feature.web.GrailsWeb;
 import org.grails.forge.template.RockerTemplate;
 
-import java.util.Arrays;
-import java.util.Map;
-
 @Singleton
 public class ViewMarkup extends GrailsViews implements Feature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java
index faf85e9bdf7..bddc07dad3f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/web/GrailsWeb.java
@@ -18,14 +18,15 @@
  */
 package org.grails.forge.feature.web;
 
+import java.util.Set;
+
 import jakarta.inject.Singleton;
+
 import org.grails.forge.application.ApplicationType;
 import org.grails.forge.feature.DefaultFeature;
 import org.grails.forge.feature.Feature;
 import org.grails.forge.options.Options;
 
-import java.util.Set;
-
 @Singleton
 public class GrailsWeb implements DefaultFeature {
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/MapOutputHandler.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/MapOutputHandler.java
index 54620a607fc..8e8f86db483 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/MapOutputHandler.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/MapOutputHandler.java
@@ -18,14 +18,14 @@
  */
 package org.grails.forge.io;
 
-import org.grails.forge.template.Template;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.grails.forge.template.Template;
+
 public class MapOutputHandler implements OutputHandler {
 
     private final Map templates;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/OutputHandler.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/OutputHandler.java
index 9586fbcb0d6..ba80515e47a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/OutputHandler.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/OutputHandler.java
@@ -18,11 +18,11 @@
  */
 package org.grails.forge.io;
 
-import org.grails.forge.template.Template;
-
 import java.io.Closeable;
 import java.io.IOException;
 
+import org.grails.forge.template.Template;
+
 public interface OutputHandler extends Closeable {
 
     boolean exists(String path);
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/ZipOutputHandler.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/ZipOutputHandler.java
index 301dbbffe84..8a66ad6b1e1 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/ZipOutputHandler.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/io/ZipOutputHandler.java
@@ -18,13 +18,6 @@
  */
 package org.grails.forge.io;
 
-import io.micronaut.core.util.StringUtils;
-import org.apache.commons.compress.archivers.zip.UnixStat;
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
-import org.grails.forge.application.Project;
-import org.grails.forge.template.Template;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -35,6 +28,14 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import io.micronaut.core.util.StringUtils;
+import org.apache.commons.compress.archivers.zip.UnixStat;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
+
+import org.grails.forge.application.Project;
+import org.grails.forge.template.Template;
+
 public class ZipOutputHandler implements OutputHandler {
 
     private final ZipArchiveOutputStream zipOutputStream;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/BuildTool.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/BuildTool.java
index 0d064083c23..b878892c4c4 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/BuildTool.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/BuildTool.java
@@ -18,14 +18,15 @@
  */
 package org.grails.forge.options;
 
-import io.micronaut.core.annotation.NonNull;
-import org.grails.forge.application.Project;
-import org.grails.forge.build.gradle.GradleDsl;
-
 import java.util.Locale;
 import java.util.Objects;
 import java.util.Optional;
 
+import io.micronaut.core.annotation.NonNull;
+
+import org.grails.forge.application.Project;
+import org.grails.forge.build.gradle.GradleDsl;
+
 public enum BuildTool {
     GRADLE("build/libs", "build.gradle", "-*-all.jar");
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java
index e6896565a53..24771c41613 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/DevelopmentReloading.java
@@ -18,10 +18,10 @@
  */
 package org.grails.forge.options;
 
-import io.micronaut.core.annotation.NonNull;
-
 import java.util.Locale;
 
+import io.micronaut.core.annotation.NonNull;
+
 public enum DevelopmentReloading {
 
     DEVTOOLS("Spring Boot DevTools"),
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java
index a110247a311..e4d957156c4 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Language.java
@@ -18,15 +18,16 @@
  */
 package org.grails.forge.options;
 
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Set;
+
 import io.micronaut.core.annotation.NonNull;
+
 import org.grails.forge.defaults.IncludesDefaults;
 import org.grails.forge.defaults.LanguageDefaults;
 import org.grails.forge.feature.Feature;
 
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.Set;
-
 public enum Language implements IncludesDefaults {
     GROOVY("groovy", new LanguageDefaults(DevelopmentReloading.DEVTOOLS, BuildTool.GRADLE));
 
@@ -68,7 +69,7 @@ public String getTestSrcDir() {
     }
 
     public String getIntegrationSrcDir() {
-        return  "src/integration-test/" + getName();
+        return "src/integration-test/" + getName();
     }
 
     public String getSourcePath(String path) {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
index b3ab6a01bb3..3062d1c7f6a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/Options.java
@@ -18,14 +18,19 @@
  */
 package org.grails.forge.options;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
 import io.micronaut.core.convert.ArgumentConversionContext;
 import io.micronaut.core.convert.value.ConvertibleValues;
 import io.micronaut.core.convert.value.ConvertibleValuesMap;
+
 import org.grails.forge.application.OperatingSystem;
 import org.grails.forge.util.VersionInfo;
 
-import java.util.*;
-
 public class Options implements ConvertibleValues {
 
     private final OperatingSystem operatingSystem;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java
index 32f75e126fd..efce46973f5 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/TestFramework.java
@@ -18,12 +18,12 @@
  */
 package org.grails.forge.options;
 
-import io.micronaut.core.annotation.NonNull;
-
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 
+import io.micronaut.core.annotation.NonNull;
+
 public enum TestFramework {
     SPOCK;
 
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/Config4kTemplate.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/Config4kTemplate.java
index 1a9d72b8384..4d1e93cbb92 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/Config4kTemplate.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/Config4kTemplate.java
@@ -18,15 +18,15 @@
  */
 package org.grails.forge.template;
 
-import com.typesafe.config.Config;
-import com.typesafe.config.ConfigFactory;
-import com.typesafe.config.ConfigRenderOptions;
-
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Map;
 
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import com.typesafe.config.ConfigRenderOptions;
+
 public class Config4kTemplate implements Template {
     private final String path;
     private final Config config;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/DefaultTemplateRenderer.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/DefaultTemplateRenderer.java
index bc82ef30a15..d6df3de665c 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/DefaultTemplateRenderer.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/DefaultTemplateRenderer.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.template;
 
-import org.grails.forge.io.OutputHandler;
-
 import java.io.IOException;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.grails.forge.io.OutputHandler;
+
 public class DefaultTemplateRenderer implements TemplateRenderer {
 
     private final Map replacements;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerTemplate.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerTemplate.java
index 4ba35df5f55..f9ed0823f25 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerTemplate.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerTemplate.java
@@ -18,10 +18,10 @@
  */
 package org.grails.forge.template;
 
-import com.fizzed.rocker.RockerModel;
-
 import java.io.OutputStream;
 
+import com.fizzed.rocker.RockerModel;
+
 public class RockerTemplate implements Template {
 
     private final String path;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerWritable.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerWritable.java
index 14943d3ef0c..ebbf31c6093 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerWritable.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/RockerWritable.java
@@ -18,11 +18,11 @@
  */
 package org.grails.forge.template;
 
+import java.io.OutputStream;
+
 import com.fizzed.rocker.RockerModel;
 import com.fizzed.rocker.runtime.OutputStreamOutput;
 
-import java.io.OutputStream;
-
 public class RockerWritable implements Writable {
 
     private final RockerModel model;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/TemplateRenderer.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/TemplateRenderer.java
index 3eb8b7d4ef4..ac32eeb6744 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/TemplateRenderer.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/TemplateRenderer.java
@@ -18,13 +18,13 @@
  */
 package org.grails.forge.template;
 
-import org.grails.forge.application.Project;
-import org.grails.forge.io.OutputHandler;
-
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.Collections;
 
+import org.grails.forge.application.Project;
+import org.grails.forge.io.OutputHandler;
+
 public interface TemplateRenderer extends Closeable {
 
     default RenderResult render(Template template) throws IOException {
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/YamlTemplate.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/YamlTemplate.java
index e933423c032..b0789c811c8 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/YamlTemplate.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/template/YamlTemplate.java
@@ -18,9 +18,6 @@
  */
 package org.grails.forge.template;
 
-import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.Yaml;
-
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -28,6 +25,9 @@
 import java.util.Map;
 import java.util.regex.Pattern;
 
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
 public class YamlTemplate implements Template {
 
     private static final Pattern DOT_PATTERN = Pattern.compile("\\.");
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
index 0df87f80386..33829d88e98 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/GitHubUtil.java
@@ -18,22 +18,24 @@
  */
 package org.grails.forge.util;
 
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import jakarta.validation.constraints.NotNull;
+
 import io.micronaut.core.util.StringUtils;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.transport.PushResult;
 import org.eclipse.jgit.transport.RemoteRefUpdate;
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+
 import org.grails.forge.client.github.v3.GitHubRepository;
 import org.grails.forge.client.github.v3.GitHubUser;
 
-import jakarta.validation.constraints.NotNull;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
-
 /**
  * Utility class for GitHub operations.
  *
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java
index 0dc11099a0c..6c5e2ff674f 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/IOFeatureUtil.java
@@ -18,15 +18,20 @@
  */
 package org.grails.forge.util;
 
-import org.grails.forge.application.generator.GeneratorContext;
-import org.grails.forge.template.URLTemplate;
-
 import java.io.IOException;
 import java.net.URI;
-import java.nio.file.*;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.ProviderNotFoundException;
 import java.util.function.BiFunction;
 import java.util.stream.Stream;
 
+import org.grails.forge.application.generator.GeneratorContext;
+import org.grails.forge.template.URLTemplate;
+
 /**
  * Feature Utility class for IO operations.
  *
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/NameUtils.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/NameUtils.java
index 8e33ff63615..8150329c319 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/NameUtils.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/NameUtils.java
@@ -18,10 +18,6 @@
  */
 package org.grails.forge.util;
 
-import io.micronaut.core.util.StringUtils;
-import org.grails.forge.application.Project;
-import org.grails.forge.application.ProjectIdentifier;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -31,6 +27,11 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import io.micronaut.core.util.StringUtils;
+
+import org.grails.forge.application.Project;
+import org.grails.forge.application.ProjectIdentifier;
+
 public final class NameUtils {
     public static final String MICRONAUT = "micronaut";
     private static final String PROPERTY_SET_PREFIX = "set";
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/VersionInfo.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/VersionInfo.java
index 29078abbd61..5f4581f284a 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/VersionInfo.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/util/VersionInfo.java
@@ -18,9 +18,6 @@
  */
 package org.grails.forge.util;
 
-import io.micronaut.core.annotation.NonNull;
-import org.grails.forge.options.JdkVersion;
-
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
@@ -32,6 +29,10 @@
 import java.util.Map;
 import java.util.Properties;
 
+import io.micronaut.core.annotation.NonNull;
+
+import org.grails.forge.options.JdkVersion;
+
 public class VersionInfo {
 
     private static final Properties VERSIONS = new Properties();
diff --git a/grails-forge/grails-forge-web-netty/src/main/java/org/grails/forge/netty/analytics/AnalyticsClient.java b/grails-forge/grails-forge-web-netty/src/main/java/org/grails/forge/netty/analytics/AnalyticsClient.java
index 049be55a3fa..43f2608b5ec 100644
--- a/grails-forge/grails-forge-web-netty/src/main/java/org/grails/forge/netty/analytics/AnalyticsClient.java
+++ b/grails-forge/grails-forge-web-netty/src/main/java/org/grails/forge/netty/analytics/AnalyticsClient.java
@@ -18,17 +18,18 @@
  */
 package org.grails.forge.netty.analytics;
 
+import java.util.concurrent.CompletableFuture;
+
 import io.micronaut.context.annotation.Requires;
 import io.micronaut.core.annotation.NonNull;
 import io.micronaut.http.HttpStatus;
 import io.micronaut.http.annotation.Body;
 import io.micronaut.http.annotation.Post;
 import io.micronaut.http.client.annotation.Client;
+
 import org.grails.forge.analytics.Generated;
 import org.grails.forge.api.analytics.AnalyticsOperations;
 
-import java.util.concurrent.CompletableFuture;
-
 @Requires(property = AnalyticsClient.SERVICE_ANALYTICS)
 @Client("analytics")
 public interface AnalyticsClient extends AnalyticsOperations {
diff --git a/grails-geb/build.gradle b/grails-geb/build.gradle
index db3b5b47ea5..19a20382d81 100644
--- a/grails-geb/build.gradle
+++ b/grails-geb/build.gradle
@@ -26,6 +26,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gradle/common/build.gradle b/grails-gradle/common/build.gradle
index 9ec66022fff..17f053b9eb0 100644
--- a/grails-gradle/common/build.gradle
+++ b/grails-gradle/common/build.gradle
@@ -25,6 +25,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gradle/gradlew.bat b/grails-gradle/gradlew.bat
index aa5f10b069f..24c62d56f2d 100755
--- a/grails-gradle/gradlew.bat
+++ b/grails-gradle/gradlew.bat
@@ -1,82 +1,82 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem      https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables, and ensure extensions are enabled
-setlocal EnableExtensions
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:execute
-@rem Setup the command line
-
-
-
-@rem Execute Gradle
-@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
-@rem which allows us to clear the local environment before executing the java command
-endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
-
-:exitWithErrorLevel
-@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
-"%COMSPEC%" /c exit %ERRORLEVEL%
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables, and ensure extensions are enabled
+setlocal EnableExtensions
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:execute
+@rem Setup the command line
+
+
+
+@rem Execute Gradle
+@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
+@rem which allows us to clear the local environment before executing the java command
+endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
+
+:exitWithErrorLevel
+@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
+"%COMSPEC%" /c exit %ERRORLEVEL%
diff --git a/grails-gradle/model/build.gradle b/grails-gradle/model/build.gradle
index 2cd0762d4de..3c5a2a78517 100644
--- a/grails-gradle/model/build.gradle
+++ b/grails-gradle/model/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gradle/plugins/build.gradle b/grails-gradle/plugins/build.gradle
index 78bca0abee3..61328fd8426 100644
--- a/grails-gradle/plugins/build.gradle
+++ b/grails-gradle/plugins/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gradle/tasks/build.gradle b/grails-gradle/tasks/build.gradle
index 5970381fa23..080f0c3a526 100644
--- a/grails-gradle/tasks/build.gradle
+++ b/grails-gradle/tasks/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/core/build.gradle b/grails-gsp/core/build.gradle
index a032e6f9742..0ae5f361163 100644
--- a/grails-gsp/core/build.gradle
+++ b/grails-gsp/core/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-layout/build.gradle b/grails-gsp/grails-layout/build.gradle
index 59e02446ec0..26bcbfe943f 100644
--- a/grails-gsp/grails-layout/build.gradle
+++ b/grails-gsp/grails-layout/build.gradle
@@ -26,6 +26,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-sitemesh3/build.gradle b/grails-gsp/grails-sitemesh3/build.gradle
index 494e1dd0c92..db052a8e440 100644
--- a/grails-gsp/grails-sitemesh3/build.gradle
+++ b/grails-gsp/grails-sitemesh3/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-taglib/build.gradle b/grails-gsp/grails-taglib/build.gradle
index 6ddf4cdd5c5..51dd10f1ea6 100644
--- a/grails-gsp/grails-taglib/build.gradle
+++ b/grails-gsp/grails-taglib/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-web-gsp-taglib/build.gradle b/grails-gsp/grails-web-gsp-taglib/build.gradle
index e29c66a4ae4..a0451923835 100644
--- a/grails-gsp/grails-web-gsp-taglib/build.gradle
+++ b/grails-gsp/grails-web-gsp-taglib/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-web-gsp/build.gradle b/grails-gsp/grails-web-gsp/build.gradle
index b5c19fef864..d8c1b800cd6 100644
--- a/grails-gsp/grails-web-gsp/build.gradle
+++ b/grails-gsp/grails-web-gsp/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-web-jsp/build.gradle b/grails-gsp/grails-web-jsp/build.gradle
index 92a20f8bcd2..161b1b7080e 100644
--- a/grails-gsp/grails-web-jsp/build.gradle
+++ b/grails-gsp/grails-web-jsp/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/grails-web-taglib/build.gradle b/grails-gsp/grails-web-taglib/build.gradle
index f6c5fed7d1e..01b51a7a1ab 100644
--- a/grails-gsp/grails-web-taglib/build.gradle
+++ b/grails-gsp/grails-web-taglib/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-gsp/plugin/build.gradle b/grails-gsp/plugin/build.gradle
index 82e924f5a12..1319cb88a14 100644
--- a/grails-gsp/plugin/build.gradle
+++ b/grails-gsp/plugin/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-i18n/build.gradle b/grails-i18n/build.gradle
index c08aa68d99e..fe6aabf734a 100644
--- a/grails-i18n/build.gradle
+++ b/grails-i18n/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-interceptors/build.gradle b/grails-interceptors/build.gradle
index a54d1af3542..0fd0309ddf6 100644
--- a/grails-interceptors/build.gradle
+++ b/grails-interceptors/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-logging/build.gradle b/grails-logging/build.gradle
index 40ca7b5ae21..a9a548d9d03 100644
--- a/grails-logging/build.gradle
+++ b/grails-logging/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-mimetypes/build.gradle b/grails-mimetypes/build.gradle
index 20cd89b716d..91f68011133 100644
--- a/grails-mimetypes/build.gradle
+++ b/grails-mimetypes/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-profiles/profile/skeleton/gradlew.bat b/grails-profiles/profile/skeleton/gradlew.bat
index aa5f10b069f..24c62d56f2d 100755
--- a/grails-profiles/profile/skeleton/gradlew.bat
+++ b/grails-profiles/profile/skeleton/gradlew.bat
@@ -1,82 +1,82 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem      https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables, and ensure extensions are enabled
-setlocal EnableExtensions
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:execute
-@rem Setup the command line
-
-
-
-@rem Execute Gradle
-@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
-@rem which allows us to clear the local environment before executing the java command
-endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
-
-:exitWithErrorLevel
-@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
-"%COMSPEC%" /c exit %ERRORLEVEL%
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables, and ensure extensions are enabled
+setlocal EnableExtensions
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:execute
+@rem Setup the command line
+
+
+
+@rem Execute Gradle
+@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
+@rem which allows us to clear the local environment before executing the java command
+endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
+
+:exitWithErrorLevel
+@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
+"%COMSPEC%" /c exit %ERRORLEVEL%
diff --git a/grails-rest-transforms/build.gradle b/grails-rest-transforms/build.gradle
index ad80cb4057f..76bb9311e24 100644
--- a/grails-rest-transforms/build.gradle
+++ b/grails-rest-transforms/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-scaffolding/build.gradle b/grails-scaffolding/build.gradle
index 93dfa5f2a48..e6dd2c16722 100644
--- a/grails-scaffolding/build.gradle
+++ b/grails-scaffolding/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-services/build.gradle b/grails-services/build.gradle
index c13a91ef248..ecfb2e96cdd 100644
--- a/grails-services/build.gradle
+++ b/grails-services/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-shell-cli/build.gradle b/grails-shell-cli/build.gradle
index b63e2a865ce..c4f35d3a73e 100644
--- a/grails-shell-cli/build.gradle
+++ b/grails-shell-cli/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-shell-cli/src/test/resources/gradle-sample/gradlew.bat b/grails-shell-cli/src/test/resources/gradle-sample/gradlew.bat
index aa5f10b069f..24c62d56f2d 100644
--- a/grails-shell-cli/src/test/resources/gradle-sample/gradlew.bat
+++ b/grails-shell-cli/src/test/resources/gradle-sample/gradlew.bat
@@ -1,82 +1,82 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem      https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables, and ensure extensions are enabled
-setlocal EnableExtensions
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:execute
-@rem Setup the command line
-
-
-
-@rem Execute Gradle
-@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
-@rem which allows us to clear the local environment before executing the java command
-endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
-
-:exitWithErrorLevel
-@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
-"%COMSPEC%" /c exit %ERRORLEVEL%
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables, and ensure extensions are enabled
+setlocal EnableExtensions
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:execute
+@rem Setup the command line
+
+
+
+@rem Execute Gradle
+@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
+@rem which allows us to clear the local environment before executing the java command
+endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
+
+:exitWithErrorLevel
+@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
+"%COMSPEC%" /c exit %ERRORLEVEL%
diff --git a/grails-spring/build.gradle b/grails-spring/build.gradle
index 45048ac9c32..ec02285899e 100644
--- a/grails-spring/build.gradle
+++ b/grails-spring/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-test-core/build.gradle b/grails-test-core/build.gradle
index f23de34dc12..26ceabd96b6 100644
--- a/grails-test-core/build.gradle
+++ b/grails-test-core/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy
index 8a958f9f598..f7158f36d8a 100644
--- a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy
+++ b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LoginPage.groovy
@@ -36,6 +36,6 @@ class LoginPage extends Page {
         this.username = username
         this.password = password
         loginButton.click()
-        waitFor { title != pageTitle }
+        waitFor(30) { title != pageTitle }
     }
 }
diff --git a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy
index dcaaae57cff..e099989d935 100644
--- a/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy
+++ b/grails-test-examples/scaffolding/src/integrationTest/groovy/com/example/pages/LogoutPage.groovy
@@ -32,6 +32,6 @@ class LogoutPage extends Page {
 
     void logout() {
         logoutButton.click()
-        waitFor { title != pageTitle }
+        waitFor(30) { title != pageTitle }
     }
 }
diff --git a/grails-test-suite-base/build.gradle b/grails-test-suite-base/build.gradle
index 6e5b9a320d0..d7f6a04d322 100644
--- a/grails-test-suite-base/build.gradle
+++ b/grails-test-suite-base/build.gradle
@@ -26,6 +26,7 @@ plugins {
     id 'org.apache.grails.buildsrc.compile'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-core/build.gradle b/grails-testing-support-core/build.gradle
index 223b2a9ba9d..1a9cda1ee52 100644
--- a/grails-testing-support-core/build.gradle
+++ b/grails-testing-support-core/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-datamapping/build.gradle b/grails-testing-support-datamapping/build.gradle
index 715fbe3f983..38f00d96a6a 100755
--- a/grails-testing-support-datamapping/build.gradle
+++ b/grails-testing-support-datamapping/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-dbcleanup-core/build.gradle b/grails-testing-support-dbcleanup-core/build.gradle
index 70f9682077e..f4698b0eb03 100644
--- a/grails-testing-support-dbcleanup-core/build.gradle
+++ b/grails-testing-support-dbcleanup-core/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 
diff --git a/grails-testing-support-dbcleanup-h2/build.gradle b/grails-testing-support-dbcleanup-h2/build.gradle
index 2bc1cc0adff..b3c18b7b211 100644
--- a/grails-testing-support-dbcleanup-h2/build.gradle
+++ b/grails-testing-support-dbcleanup-h2/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 
diff --git a/grails-testing-support-dbcleanup-postgresql/build.gradle b/grails-testing-support-dbcleanup-postgresql/build.gradle
index 6ff298cbc1e..5f99ce69962 100644
--- a/grails-testing-support-dbcleanup-postgresql/build.gradle
+++ b/grails-testing-support-dbcleanup-postgresql/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-http-client/build.gradle b/grails-testing-support-http-client/build.gradle
index 7d8119d07d2..feff4743f34 100644
--- a/grails-testing-support-http-client/build.gradle
+++ b/grails-testing-support-http-client/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-mongodb/build.gradle b/grails-testing-support-mongodb/build.gradle
index cad012a5cb0..ab82c26ffc2 100644
--- a/grails-testing-support-mongodb/build.gradle
+++ b/grails-testing-support-mongodb/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-views-gson/build.gradle b/grails-testing-support-views-gson/build.gradle
index c847e79679a..fd60e5e89e2 100644
--- a/grails-testing-support-views-gson/build.gradle
+++ b/grails-testing-support-views-gson/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-testing-support-web/build.gradle b/grails-testing-support-web/build.gradle
index 6b362c056de..34ecdc36876 100755
--- a/grails-testing-support-web/build.gradle
+++ b/grails-testing-support-web/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-url-mappings/build.gradle b/grails-url-mappings/build.gradle
index 9e548d1212b..8f4b6d8679c 100644
--- a/grails-url-mappings/build.gradle
+++ b/grails-url-mappings/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-validation/build.gradle b/grails-validation/build.gradle
index 38b907bf6d2..e9088f45873 100644
--- a/grails-validation/build.gradle
+++ b/grails-validation/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-views-core/build.gradle b/grails-views-core/build.gradle
index d30a0d560da..a6ffab62d23 100644
--- a/grails-views-core/build.gradle
+++ b/grails-views-core/build.gradle
@@ -27,6 +27,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-views-gson/build.gradle b/grails-views-gson/build.gradle
index de8b38ed5f6..caf186cb06e 100644
--- a/grails-views-gson/build.gradle
+++ b/grails-views-gson/build.gradle
@@ -26,6 +26,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-views-markup/build.gradle b/grails-views-markup/build.gradle
index 48de6f7f0cb..0ee258916dd 100644
--- a/grails-views-markup/build.gradle
+++ b/grails-views-markup/build.gradle
@@ -26,6 +26,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-web-boot/build.gradle b/grails-web-boot/build.gradle
index 3dbbd9fde67..0c6722dba51 100644
--- a/grails-web-boot/build.gradle
+++ b/grails-web-boot/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-web-common/build.gradle b/grails-web-common/build.gradle
index ff03053790d..c626d8f81b6 100644
--- a/grails-web-common/build.gradle
+++ b/grails-web-common/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-web-core/build.gradle b/grails-web-core/build.gradle
index cd9b52c6580..818a27a3763 100644
--- a/grails-web-core/build.gradle
+++ b/grails-web-core/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-web-databinding/build.gradle b/grails-web-databinding/build.gradle
index 92b7aecc41e..91422ef184e 100644
--- a/grails-web-databinding/build.gradle
+++ b/grails-web-databinding/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-web-mvc/build.gradle b/grails-web-mvc/build.gradle
index d16e9f41f32..32d7bc07f67 100644
--- a/grails-web-mvc/build.gradle
+++ b/grails-web-mvc/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-web-url-mappings/build.gradle b/grails-web-url-mappings/build.gradle
index 06c6b87870d..5aba4697dec 100644
--- a/grails-web-url-mappings/build.gradle
+++ b/grails-web-url-mappings/build.gradle
@@ -28,6 +28,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion
diff --git a/grails-wrapper/build.gradle b/grails-wrapper/build.gradle
index 71a80b3ee42..2a0373cbd36 100644
--- a/grails-wrapper/build.gradle
+++ b/grails-wrapper/build.gradle
@@ -25,6 +25,7 @@ plugins {
     id 'org.apache.grails.buildsrc.sbom'
     id 'org.apache.grails.gradle.grails-code-style'
     id 'org.apache.grails.gradle.grails-code-analysis'
+    id 'org.apache.grails.gradle.grails-jacoco'
 }
 
 version = projectVersion