diff --git a/.sdkmanrc b/.sdkmanrc index 8e35cc01738..7f5dd3018e3 100644 --- a/.sdkmanrc +++ b/.sdkmanrc @@ -2,5 +2,5 @@ java=17.0.18-librca # Keep gradle version synced with gradle.properties (gradleToolingApiVersion), all gradle-wrapper.properties files, # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw -gradle=8.14.4 +gradle=9.3.1 diff --git a/build-logic/docs-core/build.gradle b/build-logic/docs-core/build.gradle index 856409ccdf8..216b1da3ec9 100644 --- a/build-logic/docs-core/build.gradle +++ b/build-logic/docs-core/build.gradle @@ -38,10 +38,9 @@ apply { dependencies { gradleConf gradleApi() - // grails-docs classes are used in Gradle builds, - // so we must compile with Groovy 3 until Gradle upgrades to Groovy 4. - compileOnly "org.codehaus.groovy:groovy:${GroovySystem.version}" - compileOnly "org.codehaus.groovy:groovy-ant:${GroovySystem.version}" + // grails-docs classes are used in Gradle builds, using Gradle's embedded Groovy version + compileOnly "org.apache.groovy:groovy:${GroovySystem.version}" + compileOnly "org.apache.groovy:groovy-ant:${GroovySystem.version}" api "org.apache.commons:commons-text:${gradleBomDependencyVersions['commons-text.version']}" api "org.apache.ant:ant:${gradleBomDependencyVersions['ant.version']}" @@ -56,7 +55,7 @@ dependencies { transitive = false } - testImplementation "org.codehaus.groovy:groovy-test-junit5:${GroovySystem.version}" + testImplementation "org.apache.groovy:groovy-test-junit5:${GroovySystem.version}" testImplementation 'org.junit.jupiter:junit-jupiter-api:5.12.2' testImplementation 'org.junit.platform:junit-platform-runner:1.12.2' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.12.2' diff --git a/build-logic/docs-core/src/main/groovy/grails/doc/ant/DocPublisherTask.groovy b/build-logic/docs-core/src/main/groovy/grails/doc/ant/DocPublisherTask.groovy index 42f63eb8987..2195fe10036 100644 --- a/build-logic/docs-core/src/main/groovy/grails/doc/ant/DocPublisherTask.groovy +++ b/build-logic/docs-core/src/main/groovy/grails/doc/ant/DocPublisherTask.groovy @@ -18,6 +18,7 @@ */ package grails.doc.ant +import groovy.ant.AntBuilder import org.apache.tools.ant.BuildException import org.apache.tools.ant.Project import org.apache.tools.ant.Task diff --git a/build-logic/gradle/wrapper/gradle-wrapper.jar b/build-logic/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/build-logic/gradle/wrapper/gradle-wrapper.jar and b/build-logic/gradle/wrapper/gradle-wrapper.jar differ diff --git a/build-logic/gradle/wrapper/gradle-wrapper.properties b/build-logic/gradle/wrapper/gradle-wrapper.properties index 7712f940a25..5012f38a995 100644 --- a/build-logic/gradle/wrapper/gradle-wrapper.properties +++ b/build-logic/gradle/wrapper/gradle-wrapper.properties @@ -2,7 +2,7 @@ # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/build-logic/gradlew b/build-logic/gradlew index 23d15a93670..adff685a034 100755 --- a/build-logic/gradlew +++ b/build-logic/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/build-logic/gradlew.bat b/build-logic/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100755 --- a/build-logic/gradlew.bat +++ b/build-logic/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy index de7eab08f12..563de4ddc0d 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy @@ -92,9 +92,14 @@ class PublishPlugin implements Plugin { task.group = 'publishing' task.outputs.dir(artifactsDir) task.dependsOn(project.tasks.withType(Jar)) + + // Capture publishing extension at configuration time to avoid Task.project access at execution time + // See: https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution + def publishingExtension = project.extensions.getByType(PublishingExtension) + task.doLast { Map artifacts = [:] - project.extensions.getByType(PublishingExtension).publications.withType(MavenPublication).each { MavenPublication publication -> + publishingExtension.publications.withType(MavenPublication).each { MavenPublication publication -> publication.artifacts.each { MavenArtifact artifact -> if (!artifact.file.exists() || artifact.file.name in ['grails-plugin.xml', 'profile.yml']) { return diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy index 6f3d7b9eea8..ba20eaf8ac2 100644 --- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy +++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy @@ -91,6 +91,7 @@ class SbomPlugin implements Plugin { 'pkg:maven/org.jline/jline@3.23.0?type=jar' : 'BSD-2-Clause', // maps incorrectly because of https://github.com/CycloneDX/cyclonedx-core-java/issues/205 'pkg:maven/org.liquibase.ext/liquibase-hibernate5@4.27.0?type=jar': 'Apache-2.0', // maps incorrectly because of https://github.com/liquibase/liquibase/issues/2445 & the base pom does not define a license 'pkg:maven/com.oracle.coherence.ce/coherence-bom@25.03.1?type=pom': 'UPL-1.0', // does not have map based on license id + 'pkg:maven/com.oracle.coherence.ce/coherence-bom@25.03.2?type=pom': 'UPL-1.0', // does not have map based on license id 'pkg:maven/com.oracle.coherence.ce/coherence-bom@22.06.2?type=pom': 'UPL-1.0', // does not have map based on license id 'pkg:maven/opensymphony/sitemesh@2.6.0?type=jar' : 'OpenSymphony', // custom license approved by legal LEGAL-707 'pkg:maven/org.jruby/jzlib@1.1.5?type=jar' : 'BSD-3-Clause'// https://web.archive.org/web/20240822213507/http://www.jcraft.com/jzlib/LICENSE.txt shows it's a 3 clause @@ -205,13 +206,17 @@ class SbomPlugin implements Plugin { // cyclonedx does not support "choosing" the license placed in the sbom // see: https://github.com/CycloneDX/cyclonedx-gradle-plugin/issues/16 + // Capture project name at configuration time to avoid deprecated Task.project access at execution time + // See: https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution + def projectName = project.name + def projectPath = project.path + ZonedDateTime buildDate = lookupProperty(project, 'buildDate') doLast { // json schema is documented here: https://cyclonedx.org/docs/1.6/json/ def rewriteSbom = { File f -> def bom = new JsonSlurper().parse(f) // timestamp is not reproducible: https://github.com/CycloneDX/cyclonedx-gradle-plugin/issues/292 - ZonedDateTime buildDate = lookupProperty(project, 'buildDate') bom['metadata']['timestamp'] = DateTimeFormatter.ISO_INSTANT.format(buildDate.truncatedTo(ChronoUnit.SECONDS)) // components[*] @@ -219,7 +224,7 @@ class SbomPlugin implements Plugin { comps.each { c -> // .licenses => choose a license that is compatible with ASF policy if multiple licensed if (c instanceof Map && c.licenses instanceof List && !(c.licenses as List).empty) { - def chosen = pickLicense(task, c['bom-ref'] as String, c.licenses as List) + def chosen = pickLicense(logger, projectName, c['bom-ref'] as String, c.licenses as List) if (chosen != null) { c.licenses = [chosen] } @@ -252,7 +257,7 @@ class SbomPlugin implements Plugin { f.setText(JsonOutput.prettyPrint(JsonOutput.toJson(bom)), StandardCharsets.UTF_8.name()) - logger.info('Rewrote JSON SBOM ({}) to pick preferred license', project.relativePath(f)) + logger.info('Rewrote JSON SBOM ({}) to pick preferred license', projectPath) } sbomOutputLocation.get().with { rewriteSbom(it.asFile) } @@ -262,29 +267,39 @@ class SbomPlugin implements Plugin { } } + /** + * Picks the most appropriate license for a dependency from a list of license choices. + * This method is called at execution time and should not access Task.project. + * + * @param logger the logger to use for logging + * @param projectName the name of the project (captured at configuration time) + * @param bomRef the bom reference for the dependency + * @param licenseChoices the list of license choices + * @return the chosen license + */ @CompileDynamic - private static Object pickLicense(CycloneDxTask task, String bomRef, List licenseChoices) { + private static Object pickLicense(org.gradle.api.logging.Logger logger, String projectName, String bomRef, List licenseChoices) { if (!bomRef) { - throw new GradleException("No bomRef found for a dependency of ${task.project.name}, cannot pick license") + throw new GradleException("No bomRef found for a dependency of ${projectName}, cannot pick license") } - task.logger.info('Picking license for {} from {} choices', bomRef, licenseChoices.size()) + logger.info('Picking license for {} from {} choices', bomRef, licenseChoices.size()) if (LICENSE_MAPPING.containsKey(bomRef)) { // There are several reasons that cyclone will get the license wrong, usually due to upstream not publishing information or publishing it incorrectly // see the licenseMapping map above for details def licenseId = LICENSE_MAPPING[bomRef] - task.logger.lifecycle('Forcing license for {} to {}', bomRef, licenseId) + logger.lifecycle('Forcing license for {} to {}', bomRef, licenseId) def licenseBlock = LICENSES[licenseId] if (!licenseBlock) { - throw new GradleException("Cannot find license information for id ${licenseId} to use for bomRef ${bomRef} in project ${task.project.name}") + throw new GradleException("Cannot find license information for id ${licenseId} to use for bomRef ${bomRef} in project ${projectName}") } return licenseBlock } if (!(licenseChoices instanceof List) || licenseChoices.isEmpty()) { - throw new GradleException("No License was found for dependency: ${bomRef} in project ${task.project.name}") + throw new GradleException("No License was found for dependency: ${bomRef} in project ${projectName}") } def licenseIds = licenseChoices.findAll { it instanceof Map && it.license instanceof Map && it.license.id } @@ -296,13 +311,13 @@ class SbomPlugin implements Plugin { def defaultLicense = licenseChoices[0] // pick the first one found def defaultLicenseId = defaultLicense.license.id as String if (defaultLicenseId == null) { - throw new GradleException("Could not determine License id for dependency: ${bomRef} in project ${task.project.name} for value ${defaultLicense}") + throw new GradleException("Could not determine License id for dependency: ${bomRef} in project ${projectName} for value ${defaultLicense}") } if (!(defaultLicenseId in PREFERRED_LICENSES)) { - def projectLicenseExemptions = LICENSE_EXCEPTIONS[task.project.name] ?: [:] + def projectLicenseExemptions = LICENSE_EXCEPTIONS[projectName] ?: [:] def permittedLicense = projectLicenseExemptions.get(bomRef) == defaultLicenseId if (!permittedLicense) { - throw new GradleException("Unpermitted License found for bom dependency: ${bomRef} in project ${task.project.name} : ${defaultLicenseId}") + throw new GradleException("Unpermitted License found for bom dependency: ${bomRef} in project ${projectName} : ${defaultLicenseId}") } } diff --git a/build-logic/settings.gradle b/build-logic/settings.gradle index 7300beab11b..522b7c4f6c3 100644 --- a/build-logic/settings.gradle +++ b/build-logic/settings.gradle @@ -56,8 +56,8 @@ pluginManagement { } plugins { - id 'com.gradle.develocity' version '4.1.1' - id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.3' + id 'com.gradle.develocity' version '4.3.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.4.0' } def isCI = System.getenv().containsKey('CI') diff --git a/dependencies.gradle b/dependencies.gradle index ecbbca0f2e6..1036afdfe0e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -29,7 +29,7 @@ ext { 'byte-buddy.version' : '1.17.7', 'commons-text.version' : '1.13.1', 'directory-watcher.version' : '0.19.1', - 'gradle-spock.version' : '2.3-groovy-3.0', + 'gradle-spock.version' : '2.3-groovy-4.0', 'grails-publish-plugin.version' : '0.0.4', 'jansi.version' : '1.18', 'javaparser-core.version' : '3.27.0', diff --git a/gradle.properties b/gradle.properties index 34b94b81606..3b059caa2b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,7 +34,7 @@ expectitCoreVersion=0.9.0 gparsVersion=1.2.1 # Keep gradle version synced with .sdkmanrc, all gradle-wrapper.properties files, # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw -gradleToolingApiVersion=8.14.4 +gradleToolingApiVersion=9.3.1 hibernate5Version=5.6.15.Final javassistVersion=3.30.2-GA jnrPosixVersion=3.1.20 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7712f940a25..5012f38a995 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,7 +2,7 @@ # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a93670..adff685a034 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee8452..e509b2dd8fe 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/grails-data-graphql/settings.gradle b/grails-data-graphql/settings.gradle index 000d12c5101..22c1c843756 100644 --- a/grails-data-graphql/settings.gradle +++ b/grails-data-graphql/settings.gradle @@ -18,29 +18,37 @@ */ plugins { - id "com.gradle.enterprise" version "3.15.1" - id 'com.gradle.common-custom-user-data-gradle-plugin' version '1.12.1' + id 'com.gradle.develocity' version '4.3.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.4.0' } -gradleEnterprise { +def isCI = System.getenv().containsKey('CI') +def isLocal = !isCI +def isReproducibleBuild = System.getenv('SOURCE_DATE_EPOCH') != null +if (isReproducibleBuild) { + gradle.settingsEvaluated { + logger.warn('*************** Remote Build Cache Disabled due to Reproducible Build ********************') + logger.warn("Build date will be set to (SOURCE_DATE_EPOCH=${System.getenv("SOURCE_DATE_EPOCH")})") + } +} + +develocity { server = 'https://develocity.apache.org' buildScan { - publishAlwaysIf(System.getenv('CI') == 'true') - publishIfAuthenticated() - uploadInBackground = System.getenv("CI") == null - capture { - taskInputFiles = true - } + tag('grails') + tag('grails-data-graphql') + publishing.onlyIf { it.authenticated } + uploadInBackground = isLocal } } buildCache { - local { enabled = System.getenv('CI') != 'true' } - remote(gradleEnterprise.buildCache) { - def isAuthenticated = System.getenv('GRADLE_ENTERPRISE_ACCESS_KEY') - push = System.getenv('CI') == 'true' && isAuthenticated - enabled = true - }} + local { enabled = (isLocal && !isReproducibleBuild) || (isCI && isReproducibleBuild) } + remote(develocity.buildCache) { + push = isCI + enabled = !isReproducibleBuild + } +} include 'core' include 'plugin' diff --git a/grails-data-hibernate5/docs/build.gradle b/grails-data-hibernate5/docs/build.gradle index aed57721871..8f2bed53a1a 100644 --- a/grails-data-hibernate5/docs/build.gradle +++ b/grails-data-hibernate5/docs/build.gradle @@ -33,8 +33,12 @@ ext { configurations { documentation { + canBeConsumed = false + canBeResolved = true attributes { - attribute(Bundling.BUNDLING_ATTRIBUTE, (Bundling) (objects.named(Bundling, 'external'))) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL)) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) } } } diff --git a/grails-data-mongodb/docs/build.gradle b/grails-data-mongodb/docs/build.gradle index 89cfce45305..d51714c4ee9 100644 --- a/grails-data-mongodb/docs/build.gradle +++ b/grails-data-mongodb/docs/build.gradle @@ -33,8 +33,12 @@ ext { configurations { documentation { + canBeConsumed = false + canBeResolved = true attributes { - attribute(Bundling.BUNDLING_ATTRIBUTE, (Bundling) (objects.named(Bundling, 'external'))) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL)) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) } } } diff --git a/grails-data-neo4j/build.gradle b/grails-data-neo4j/build.gradle index f2bd3608d09..6437c7d70cb 100644 --- a/grails-data-neo4j/build.gradle +++ b/grails-data-neo4j/build.gradle @@ -25,7 +25,7 @@ buildscript { dependencies { classpath "org.codehaus.groovy.modules.http-builder:http-builder:0.7.2" classpath "org.apache.grails:grails-gradle-plugins:$grailsGradlePluginVersion" - classpath "org.asciidoctor:asciidoctor-gradle-jvm:4.0.2" + classpath "org.asciidoctor:asciidoctor-gradle-jvm:4.0.5" classpath "com.github.erdi:webdriver-binaries-gradle-plugin:3.2" } } diff --git a/grails-data-neo4j/docs/build.gradle b/grails-data-neo4j/docs/build.gradle index 783d22faa2a..2cec032f482 100644 --- a/grails-data-neo4j/docs/build.gradle +++ b/grails-data-neo4j/docs/build.gradle @@ -38,17 +38,21 @@ apply plugin: 'org.asciidoctor.jvm.convert' configurations { documentation { + canBeConsumed = false + canBeResolved = true attributes { - attribute(Bundling.BUNDLING_ATTRIBUTE, (Bundling) (objects.named(Bundling, 'external'))) + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category, Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL)) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage, Usage.JAVA_RUNTIME)) } } } dependencies { documentation "org.fusesource.jansi:jansi:$jansiVersion" - documentation "org.codehaus.groovy:groovy" - documentation "org.codehaus.groovy:groovy-templates" - documentation "org.codehaus.groovy:groovy-dateutil" + documentation "org.apache.groovy:groovy" + documentation "org.apache.groovy:groovy-templates" + documentation "org.apache.groovy:groovy-dateutil" documentation "com.github.javaparser:javaparser-core:$javaParserCoreVersion" for (p in coreProjects) { documentation "org.apache.grails:grails-datastore-$p:$datastoreVersion" diff --git a/grails-data-neo4j/settings.gradle b/grails-data-neo4j/settings.gradle index 278e834d5c9..bc27f99e994 100644 --- a/grails-data-neo4j/settings.gradle +++ b/grails-data-neo4j/settings.gradle @@ -18,33 +18,37 @@ */ plugins { - id "com.gradle.enterprise" version "3.16.2" - id 'com.gradle.common-custom-user-data-gradle-plugin' version '1.12.1' + id 'com.gradle.develocity' version '4.3.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.4.0' } -gradleEnterprise { +def isCI = System.getenv().containsKey('CI') +def isLocal = !isCI +def isReproducibleBuild = System.getenv('SOURCE_DATE_EPOCH') != null +if (isReproducibleBuild) { + gradle.settingsEvaluated { + logger.warn('*************** Remote Build Cache Disabled due to Reproducible Build ********************') + logger.warn("Build date will be set to (SOURCE_DATE_EPOCH=${System.getenv("SOURCE_DATE_EPOCH")})") + } +} + +develocity { server = 'https://develocity.apache.org' buildScan { - publishAlwaysIf(System.getenv('CI') == 'true') - publishIfAuthenticated() - uploadInBackground = System.getenv("CI") == null - capture { - taskInputFiles = true - } + tag('grails') + tag('grails-data-neo4j') + publishing.onlyIf { it.authenticated } + uploadInBackground = isLocal } } buildCache { - local { enabled = System.getenv('CI') != 'true' } - remote(HttpBuildCache) { - push = System.getenv('CI') == 'true' - enabled = true - url = 'https://develocity.apache.org/cache/' - credentials { - username = System.getenv('GRADLE_ENTERPRISE_BUILD_CACHE_NODE_USER') - password = System.getenv('GRADLE_ENTERPRISE_BUILD_CACHE_NODE_KEY') - } - }} + local { enabled = (isLocal && !isReproducibleBuild) || (isCI && isReproducibleBuild) } + remote(develocity.buildCache) { + push = isCI + enabled = !isReproducibleBuild + } +} // core include "grails-datastore-gorm-neo4j" @@ -73,4 +77,3 @@ include 'examples-test-data-service' project(":examples-test-data-service").projectDir = new File(settingsDir, "examples/test-data-service") findProject(':boot-plugin').name = 'gorm-neo4j-spring-boot' - diff --git a/grails-doc/build.gradle b/grails-doc/build.gradle index 1802c28395b..afdb70781a1 100644 --- a/grails-doc/build.gradle +++ b/grails-doc/build.gradle @@ -314,12 +314,13 @@ docsTask.configure { Sync it -> } tasks.register('dist', Zip).configure { Zip it -> - it.dependsOn(docsTask) + it.dependsOn(docsTask, tasks.named('groovydoc')) it.from(outputDir) } -artifacts { - archives dist +// Make dist a direct dependency of assemble instead of using deprecated archives configuration +tasks.named('assemble').configure { + dependsOn(tasks.named('dist')) } // the groovy plugin is applied to this project, but we do not build a jar file since diff --git a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java index 7e02e9dc23b..b519161c3d8 100644 --- a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java +++ b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerPlugin.java @@ -21,9 +21,9 @@ import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.internal.plugins.DslObject; +import org.gradle.api.plugins.ExtensionAware; import org.gradle.api.plugins.JavaLibraryPlugin; -import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskProvider; @@ -52,9 +52,9 @@ public void apply(Project project) { project.getLayout().getBuildDirectory().dir("classes") ); - // Create own source set extension - SourceSetContainer sourceSets = project.getConvention().getPlugin( - JavaPluginConvention.class).getSourceSets(); + // Create own source set extension using the modern JavaPluginExtension API + SourceSetContainer sourceSets = project.getExtensions() + .getByType(JavaPluginExtension.class).getSourceSets(); sourceSets.all(sourceSet -> processSourceSet(project, sourceSet, rockerConfig)); } @@ -62,10 +62,10 @@ public void apply(Project project) { private static void processSourceSet(Project project, SourceSet sourceSet, RockerConfiguration rockerConfig) { // for each source set we will: - // 1) Add a new 'rocker' property to the source set + // 1) Add a new 'rocker' extension to the source set RockerSourceSetProperty rockerProperty = new RockerSourceSetProperty(project); - new DslObject(sourceSet).getConvention().getPlugins().put( + ((ExtensionAware) sourceSet).getExtensions().add( "rocker", rockerProperty); // 2) Create a rocker task for this sourceSet following the gradle diff --git a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java index ffcc0f7d499..5aef586e2be 100644 --- a/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java +++ b/grails-forge/buildSrc/src/main/java/org/grails/forge/rocker/plugin/RockerSourceSetProperty.java @@ -23,7 +23,10 @@ import org.gradle.api.Action; import org.gradle.api.Project; import org.gradle.api.tasks.SourceSet; -import org.gradle.util.ConfigureUtil; +import org.gradle.util.internal.ClosureBackedAction; + +import java.io.File; +import java.util.Set; /** * The rocker property added to the {@link SourceSet}. @@ -45,7 +48,7 @@ public TemplateDirectorySet getRocker() { } public RockerSourceSetProperty rocker(Closure configureClosure) { - ConfigureUtil.configure(configureClosure, getRocker()); + new ClosureBackedAction<>(configureClosure).execute(getRocker()); return this; } @@ -54,4 +57,24 @@ public RockerSourceSetProperty rocker( configureAction.execute(getRocker()); return this; } + + // Delegate methods to TemplateDirectorySet for DSL compatibility + public RockerSourceSetProperty srcDir(Object srcDir) { + templateDirs.srcDir(srcDir); + return this; + } + + public RockerSourceSetProperty srcDirs(Object... srcDirs) { + templateDirs.srcDirs(srcDirs); + return this; + } + + public RockerSourceSetProperty setSrcDirs(Iterable srcPaths) { + templateDirs.setSrcDirs(srcPaths); + return this; + } + + public Set getSrcDirs() { + return templateDirs.getSrcDirs(); + } } diff --git a/grails-forge/gradle.properties b/grails-forge/gradle.properties index e0adeeda0be..3f47d44463e 100644 --- a/grails-forge/gradle.properties +++ b/grails-forge/gradle.properties @@ -23,27 +23,28 @@ title=Grails Application Forge projectDesc=Generates Grails applications -# for forge build process which is a micronaut 3.x.x app with picocli +# for forge build process which is a micronaut 4.x.x app with picocli grailsPublishGradleVersion=0.0.2 antVersion=1.10.15 antlr4Version=4.8-1!! -asciidoctorGradleJvmVersion=4.0.4 +asciidoctorGradleJvmVersion=4.0.5 cglibVersion=3.3.0 +byteBuddyVersion=1.15.11 commonsCompressVersion=1.27.1 gradleSdkvendorPluginVersion=3.0.0 -groovyVersion=3.0.25 +groovyVersion=4.0.30 jacksonDatabindVersion=2.18.3 -jakartaInjectVersion=1.0.5 +jakartaInjectVersion=2.0.1 # match the jansi version in grails-bom jansiVersion=1.18 javaDiffUtils=4.15 jgitVersion=6.10.0.202406032230-r logbackClassicVersion=1.5.17 -micronautApplicationPluginVersion=3.7.10 -micronautBuildVersion=1.1.5 +micronautApplicationPluginVersion=4.5.3 +micronautBuildVersion=2.2.1 micronautDocsVersion=2.0.0 micronautGradlePlugins=5.4.10 -micronautVersion=3.10.4 +micronautVersion=4.10.7 nexusPublishVersion=1.3.0 nohttpGradleVersion=0.0.11 objenesisVersion=3.4 @@ -55,7 +56,7 @@ rockerVersion=2.2.1 shadowVersion=8.3.6 slf4jVersion=2.0.17 snakeyamlVersion=2.4 -spockVersion=2.1-groovy-3.0 +spockVersion=2.3-groovy-4.0 spotlessVersion=6.25.0 testRetryVersion=1.6.2 typesafeConfigVersion=1.4.3 diff --git a/grails-forge/gradle/doc-config.gradle b/grails-forge/gradle/doc-config.gradle index d7b0eaf7fba..1c393c66f0d 100644 --- a/grails-forge/gradle/doc-config.gradle +++ b/grails-forge/gradle/doc-config.gradle @@ -28,8 +28,8 @@ configurations.register('documentation') { } dependencies { - documentation "org.codehaus.groovy:groovy-templates:$groovyVersion" - documentation "org.codehaus.groovy:groovy-dateutil:$groovyVersion" + documentation "org.apache.groovy:groovy-templates:$groovyVersion" + documentation "org.apache.groovy:groovy-dateutil:$groovyVersion" } tasks.withType(Groovydoc).configureEach { diff --git a/grails-forge/gradle/micronaut-openapi-config.gradle b/grails-forge/gradle/micronaut-openapi-config.gradle index c71afdfa2b8..8fc0c93b0bf 100644 --- a/grails-forge/gradle/micronaut-openapi-config.gradle +++ b/grails-forge/gradle/micronaut-openapi-config.gradle @@ -21,7 +21,7 @@ import groovy.transform.CompileStatic def openApiOutputFile = layout.buildDirectory.file('generated/openapi/openapi.properties') def openApiPropertiesTask = tasks.register('openApiProperties', WriteProperties) openApiPropertiesTask.configure { WriteProperties it -> - it.outputFile(openApiOutputFile.get().asFile) + it.destinationFile.set(openApiOutputFile) it.properties( 'swagger-ui.enabled': true, 'redoc.enabled': true, diff --git a/grails-forge/gradle/test-config.gradle b/grails-forge/gradle/test-config.gradle index 2f840abf40f..71714cd08a0 100644 --- a/grails-forge/gradle/test-config.gradle +++ b/grails-forge/gradle/test-config.gradle @@ -17,6 +17,13 @@ * under the License. */ +// Add JUnit Platform launcher dependency required by Gradle 9 for running tests +// Also add ByteBuddy for Spock mocking on Java 17+ (CGLIB doesn't support Java 17 class files) +dependencies { + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testImplementation "net.bytebuddy:byte-buddy:$byteBuddyVersion" +} + tasks.withType(Test).configureEach { onlyIf { ![ @@ -34,7 +41,8 @@ tasks.withType(Test).configureEach { } environment('GRAILS_REPO_URL', uri(rootProject.layout.projectDirectory.dir('../build/local-maven'))) - jvmArgs('-Duser.country=US', '-Duser.language=en') + jvmArgs('-Duser.country=US', '-Duser.language=en', + '--add-opens', 'java.base/java.lang=ALL-UNNAMED') forkEvery = 100 maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 maxHeapSize = '2G' diff --git a/grails-forge/gradle/wrapper/gradle-wrapper.jar b/grails-forge/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/grails-forge/gradle/wrapper/gradle-wrapper.jar and b/grails-forge/gradle/wrapper/gradle-wrapper.jar differ diff --git a/grails-forge/gradle/wrapper/gradle-wrapper.properties b/grails-forge/gradle/wrapper/gradle-wrapper.properties index 7712f940a25..5012f38a995 100644 --- a/grails-forge/gradle/wrapper/gradle-wrapper.properties +++ b/grails-forge/gradle/wrapper/gradle-wrapper.properties @@ -2,7 +2,7 @@ # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/grails-forge/gradlew b/grails-forge/gradlew index 23d15a93670..adff685a034 100755 --- a/grails-forge/gradlew +++ b/grails-forge/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/grails-forge/gradlew.bat b/grails-forge/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100644 --- a/grails-forge/gradlew.bat +++ b/grails-forge/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/grails-forge/grails-cli/build.gradle b/grails-forge/grails-cli/build.gradle index 58ad37096fb..21a9062acab 100644 --- a/grails-forge/grails-cli/build.gradle +++ b/grails-forge/grails-cli/build.gradle @@ -124,8 +124,10 @@ shadowJarTask.configure { ShadowJar it -> 'about.html' // restatement of the Eclipse Distribution License - Version 1.0 for jakarta ) } -// publish shadow jar separately from the regular library -artifacts { archives shadowJarTask } +// Make shadow jar a direct dependency of assemble instead of using deprecated archives configuration +tasks.named('assemble').configure { + dependsOn(shadowJarTask) +} TaskProvider cliStartScripts = tasks.register('createCliStartScripts', CreateStartScripts) cliStartScripts.configure { CreateStartScripts t -> diff --git a/grails-forge/grails-forge-analytics-postgres/build.gradle b/grails-forge/grails-forge-analytics-postgres/build.gradle index be824be68b3..14864feb0b4 100644 --- a/grails-forge/grails-forge-analytics-postgres/build.gradle +++ b/grails-forge/grails-forge-analytics-postgres/build.gradle @@ -18,7 +18,6 @@ */ plugins { - id 'com.gradleup.shadow' id 'org.apache.grails.buildsrc.properties' id 'io.micronaut.application' version "$micronautApplicationPluginVersion" } @@ -39,6 +38,7 @@ dependencies { implementation "org.postgresql:postgresql:$postgresqlVersion" runtimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion" + runtimeOnly 'io.micronaut:micronaut-jackson-databind' testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion" 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 e34efc3f8d1..14e02bf7463 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 @@ -28,7 +28,7 @@ import io.micronaut.scheduling.annotation.ExecuteOn; import org.grails.forge.analytics.Generated; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import java.util.List; import java.util.stream.Collectors; 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 a76606ff4c4..d18d9d8b0a0 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 @@ -27,7 +27,7 @@ import org.grails.forge.options.JdkVersion; import org.grails.forge.options.TestFramework; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotBlank; import java.time.LocalDateTime; import java.util.Collections; import java.util.Objects; diff --git a/grails-forge/grails-forge-api/build.gradle b/grails-forge/grails-forge-api/build.gradle index 91fb090a05b..3af4420ef56 100644 --- a/grails-forge/grails-forge-api/build.gradle +++ b/grails-forge/grails-forge-api/build.gradle @@ -28,17 +28,18 @@ version = projectVersion group = 'org.apache.grails.forge' dependencies { - annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") - implementation platform("io.micronaut:micronaut-bom:$micronautVersion") + annotationProcessor platform("io.micronaut.platform:micronaut-platform:$micronautVersion") + implementation platform("io.micronaut.platform:micronaut-platform:$micronautVersion") annotationProcessor 'io.micronaut:micronaut-inject-java' - testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") + annotationProcessor 'io.micronaut.validation:micronaut-validation-processor' + testAnnotationProcessor platform("io.micronaut.platform:micronaut-platform:$micronautVersion") testAnnotationProcessor 'io.micronaut:micronaut-inject-java' annotationProcessor 'com.google.code.findbugs:jsr305' annotationProcessor "io.micronaut.docs:micronaut-docs-asciidoc-config-props:$micronautDocsVersion" annotationProcessor 'io.micronaut.openapi:micronaut-openapi' - api platform("io.micronaut:micronaut-bom:$micronautVersion") + api platform("io.micronaut.platform:micronaut-platform:$micronautVersion") api project(':grails-forge-core'), { exclude group:'org.slf4j', module:'slf4j-nop' @@ -47,8 +48,8 @@ dependencies { api 'io.micronaut:micronaut-http-client' api 'io.micronaut:micronaut-inject' api 'io.micronaut:micronaut-runtime' - api 'io.micronaut:micronaut-validation' - api group: 'javax.inject', name: 'javax.inject', version: '1' + api 'io.micronaut.validation:micronaut-validation' + api "jakarta.inject:jakarta.inject-api:$jakartaInjectVersion" implementation 'io.swagger.core.v3:swagger-annotations' implementation 'io.projectreactor:reactor-core' @@ -57,6 +58,7 @@ dependencies { testImplementation 'io.micronaut:micronaut-http-client' testImplementation 'io.micronaut:micronaut-http-server-netty' testImplementation 'io.micronaut.test:micronaut-test-spock' + testRuntimeOnly 'io.micronaut:micronaut-jackson-databind' testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion" @@ -64,15 +66,15 @@ dependencies { testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion" } - testImplementation "org.codehaus.groovy:groovy:$groovyVersion" + testImplementation "org.apache.groovy:groovy:$groovyVersion" testImplementation "org.spockframework:spock-core:$spockVersion", { - exclude group: 'org.codehaus.groovy', module: 'groovy-all' + exclude group: 'org.apache.groovy', module: 'groovy-all' } testImplementation "cglib:cglib-nodep:$cglibVersion" testImplementation "org.objenesis:objenesis:$objenesisVersion" testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion" - testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion" + testImplementation "org.apache.groovy:groovy-test:$groovyVersion" } apply { @@ -85,7 +87,7 @@ apply { configurations.configureEach { resolutionStrategy { eachDependency { DependencyResolveDetails details -> - if (details.requested.group == 'org.codehaus.groovy') { + if (details.requested.group == 'org.apache.groovy') { details.useVersion(groovyVersion) } if (details.requested.name == 'spock-core') { 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 d91c31b33a5..07c6faa2ef3 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 @@ -38,7 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; import java.util.Collections; import java.util.List; 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 2fa9bcae1b1..94820ac1596 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 @@ -46,7 +46,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; import java.net.URI; import java.util.List; 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 845439c2720..c836b61f65f 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 @@ -31,7 +31,7 @@ import org.grails.forge.options.JdkVersion; import org.grails.forge.options.ServletImpl; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; import java.util.List; /** 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 a013fae7f02..1b415cba2f2 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 @@ -46,7 +46,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import java.io.File; import java.io.IOException; import java.nio.file.Files; 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 d8c2fa4f1e6..388f220e3c4 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 @@ -29,7 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import java.net.URI; import java.util.UUID; 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 74849ffea46..bcf7fb2061f 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 @@ -47,9 +47,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +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; @@ -64,6 +65,7 @@ */ @Controller @ExecuteOn(TaskExecutors.IO) +@Validated public class ZipCreateController extends AbstractCreateController implements ZipCreateOperation { public static final String MEDIA_TYPE_APPLICATION_ZIP = "application/zip"; 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 43dcf1131f1..8e23a4e39ba 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 @@ -30,7 +30,7 @@ import org.grails.forge.options.ServletImpl; import org.grails.forge.options.JdkVersion; -import javax.validation.constraints.Pattern; +import jakarta.validation.constraints.Pattern; import java.util.List; /** 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 62f9c9c9e4f..21258a50005 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 @@ -41,9 +41,9 @@ import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +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; 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 6249b23f457..d72a6031a6d 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 @@ -26,8 +26,8 @@ import io.swagger.v3.oas.annotations.Parameter; import org.reactivestreams.Publisher; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import java.io.IOException; import java.util.List; diff --git a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy index 278c6259b59..29dfa9c7f19 100644 --- a/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy +++ b/grails-forge/grails-forge-api/src/test/groovy/org/grails/forge/api/DiffClient.groovy @@ -29,8 +29,8 @@ import org.grails.forge.options.BuildTool import org.grails.forge.options.JdkVersion import org.grails.forge.options.Language -import javax.validation.constraints.NotBlank -import javax.validation.constraints.NotNull +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.NotNull @Client('/diff') interface DiffClient { diff --git a/grails-forge/grails-forge-cli/build.gradle b/grails-forge/grails-forge-cli/build.gradle index b44a145b51d..48d11c0cf39 100644 --- a/grails-forge/grails-forge-cli/build.gradle +++ b/grails-forge/grails-forge-cli/build.gradle @@ -68,10 +68,10 @@ ext { } dependencies { - annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") - implementation platform("io.micronaut:micronaut-bom:$micronautVersion") + annotationProcessor platform("io.micronaut.platform:micronaut-platform:$micronautVersion") + implementation platform("io.micronaut.platform:micronaut-platform:$micronautVersion") annotationProcessor 'io.micronaut:micronaut-inject-java' - testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") + testAnnotationProcessor platform("io.micronaut.platform:micronaut-platform:$micronautVersion") testAnnotationProcessor 'io.micronaut:micronaut-inject-java' generateConfig "info.picocli:picocli-codegen:$picocliVersion" @@ -84,7 +84,7 @@ dependencies { exclude group: 'org.apache.grails', module: 'grails-bom' exclude group: 'org.apache.groovy' } - compileOnly 'org.codehaus.groovy:groovy' + compileOnly 'org.apache.groovy:groovy' implementation "com.fizzed:rocker-runtime:$rockerVersion" implementation "info.picocli:picocli:$picocliVersion" implementation "info.picocli:picocli-shell-jline3:$picocliVersion" @@ -102,15 +102,15 @@ dependencies { testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion" } - testImplementation "org.codehaus.groovy:groovy:$groovyVersion" + testImplementation "org.apache.groovy:groovy:$groovyVersion" testImplementation "org.spockframework:spock-core:$spockVersion", { - exclude group: 'org.codehaus.groovy', module: 'groovy-all' + exclude group: 'org.apache.groovy', module: 'groovy-all' } testImplementation "cglib:cglib-nodep:$cglibVersion" testImplementation "org.objenesis:objenesis:$objenesisVersion" testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion" - testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion" + testImplementation "org.apache.groovy:groovy-test:$groovyVersion" } rocker { @@ -162,7 +162,7 @@ jarTask.configure { Jar it -> configurations.configureEach { resolutionStrategy { eachDependency { DependencyResolveDetails details -> - if (details.requested.group == 'org.codehaus.groovy') { + if (details.requested.group == 'org.apache.groovy') { details.useVersion(groovyVersion) } if (details.requested.name == 'spock-core') { diff --git a/grails-forge/grails-forge-core/build.gradle b/grails-forge/grails-forge-core/build.gradle index 84a50c8cca2..dcd03b78939 100644 --- a/grails-forge/grails-forge-core/build.gradle +++ b/grails-forge/grails-forge-core/build.gradle @@ -41,13 +41,15 @@ sourceSets { } dependencies { - annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") - implementation platform("io.micronaut:micronaut-bom:$micronautVersion") + annotationProcessor platform("io.micronaut.platform:micronaut-platform:$micronautVersion") + implementation platform("io.micronaut.platform:micronaut-platform:$micronautVersion") annotationProcessor 'io.micronaut:micronaut-inject-java' - testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion") + testAnnotationProcessor platform("io.micronaut.platform:micronaut-platform:$micronautVersion") testAnnotationProcessor 'io.micronaut:micronaut-inject-java' - api platform("io.micronaut:micronaut-bom:$micronautVersion") // TODO: Should this be api? + api platform("io.micronaut.platform:micronaut-platform:$micronautVersion") // TODO: Should this be api? + api "com.fasterxml.jackson.core:jackson-databind:$jacksonDatabindVersion" + api 'jakarta.validation:jakarta.validation-api' api "com.fizzed:rocker-runtime:$rockerVersion" api "io.github.java-diff-utils:java-diff-utils:$javaDiffUtils" api 'io.micronaut:micronaut-http' @@ -61,21 +63,21 @@ dependencies { compileOnly 'com.google.code.findbugs:jsr305' - testImplementation 'org.codehaus.groovy:groovy-yaml' + testImplementation 'org.apache.groovy:groovy-yaml' if (project.hasProperty('micronautVersion')) { testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion" } - testImplementation "org.codehaus.groovy:groovy:$groovyVersion" + testImplementation "org.apache.groovy:groovy:$groovyVersion" testImplementation "org.spockframework:spock-core:$spockVersion", { - exclude group: 'org.codehaus.groovy', module: 'groovy-all' + exclude group: 'org.apache.groovy', module: 'groovy-all' } testImplementation "cglib:cglib-nodep:$cglibVersion" testImplementation "org.objenesis:objenesis:$objenesisVersion" testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion" - testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion" + testImplementation "org.apache.groovy:groovy-test:$groovyVersion" } @@ -136,7 +138,7 @@ nohttp { configurations.configureEach { resolutionStrategy { eachDependency { DependencyResolveDetails details -> - if (details.requested.group == 'org.codehaus.groovy') { + if (details.requested.group == 'org.apache.groovy') { details.useVersion(groovyVersion) } if (details.requested.name == 'spock-core') { 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 704b31278a1..16e549a42f1 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 @@ -22,7 +22,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.core.annotation.Introspected; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; /** * @author Pavol Gressa diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw index e5d545a479a..bca77824424 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw @@ -34,7 +34,7 @@ Features features) @* Keep gradle version synced with .sdkmanrc, gradle.properties (gradleToolingApiVersion), all gradle-wrapper.properties files *@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME 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 24fca64eacc..0df87f80386 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 @@ -27,7 +27,7 @@ import org.grails.forge.client.github.v3.GitHubRepository; import org.grails.forge.client.github.v3.GitHubUser; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import java.io.IOException; import java.nio.file.Path; import java.util.List; diff --git a/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew b/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew index 23d15a93670..adff685a034 100755 --- a/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew +++ b/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew.bat b/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100644 --- a/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew.bat +++ b/grails-forge/grails-forge-core/src/main/resources/gradle/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/grails-forge/grails-forge-core/src/main/resources/gradle/wrapper/gradle-wrapper.jar b/grails-forge/grails-forge-core/src/main/resources/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/grails-forge/grails-forge-core/src/main/resources/gradle/wrapper/gradle-wrapper.jar and b/grails-forge/grails-forge-core/src/main/resources/gradle/wrapper/gradle-wrapper.jar differ diff --git a/grails-forge/grails-forge-web-netty/build.gradle b/grails-forge/grails-forge-web-netty/build.gradle index f53150b74d9..067765a4b97 100644 --- a/grails-forge/grails-forge-web-netty/build.gradle +++ b/grails-forge/grails-forge-web-netty/build.gradle @@ -18,7 +18,6 @@ */ plugins { - id 'com.gradleup.shadow' id 'org.apache.grails.buildsrc.properties' id 'io.micronaut.application' version "$micronautApplicationPluginVersion" } @@ -32,6 +31,7 @@ dependencies { implementation 'io.micronaut.gcp:micronaut-gcp-http-client' runtimeOnly 'ch.qos.logback:logback-classic' + runtimeOnly 'io.micronaut:micronaut-jackson-databind' testImplementation 'io.micronaut:micronaut-http-client' testImplementation 'io.micronaut.test:micronaut-test-spock' diff --git a/grails-forge/settings.gradle b/grails-forge/settings.gradle index 32ea13941ec..89ac8ba2410 100644 --- a/grails-forge/settings.gradle +++ b/grails-forge/settings.gradle @@ -28,8 +28,8 @@ pluginManagement { } plugins { - id 'com.gradle.develocity' version '4.2.2' - id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.3' + id 'com.gradle.develocity' version '4.3.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.4.0' id 'org.apache.grails.buildsrc.repo' } diff --git a/grails-forge/test-core/build.gradle b/grails-forge/test-core/build.gradle index 4011685591a..701646929f9 100644 --- a/grails-forge/test-core/build.gradle +++ b/grails-forge/test-core/build.gradle @@ -59,15 +59,15 @@ dependencies { testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion" } - testImplementation "org.codehaus.groovy:groovy:$groovyVersion" + testImplementation "org.apache.groovy:groovy:$groovyVersion" testImplementation "org.spockframework:spock-core:$spockVersion", { - exclude group: 'org.codehaus.groovy', module: 'groovy-all' + exclude group: 'org.apache.groovy', module: 'groovy-all' } testImplementation "cglib:cglib-nodep:$cglibVersion" testImplementation "org.objenesis:objenesis:$objenesisVersion" testRuntimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion" - testImplementation "org.codehaus.groovy:groovy-test:$groovyVersion" + testImplementation "org.apache.groovy:groovy-test:$groovyVersion" } apply { diff --git a/grails-gradle/bom/build.gradle b/grails-gradle/bom/build.gradle index d2298cb59e7..9be9eb6f281 100644 --- a/grails-gradle/bom/build.gradle +++ b/grails-gradle/bom/build.gradle @@ -43,8 +43,9 @@ dependencies { exclude group: 'com.fasterxml.jackson' } - // Because gradle uses groovy 3, we must use groovy 3 compatible versions for the grails-gradle-bom - api platform("org.codehaus.groovy:groovy-bom:${GroovySystem.version}") + // Use Gradle's embedded Groovy version for the grails-gradle-bom + // Groovy 4+ uses org.apache.groovy coordinates + api platform("org.apache.groovy:groovy-bom:${GroovySystem.version}") api platform(gradleBomPlatformDependencies['gradle-spock-bom']) constraints { diff --git a/grails-gradle/common/build.gradle b/grails-gradle/common/build.gradle index 7262486f446..4c54b6af938 100644 --- a/grails-gradle/common/build.gradle +++ b/grails-gradle/common/build.gradle @@ -37,14 +37,14 @@ dependencies { compileOnly platform(project(':grails-gradle-bom')) // compile with the Groovy version provided by Gradle - // to ensure build compatibility with Gradle, currently Groovy 3.0.x + // Groovy 4+ uses org.apache.groovy coordinates // see: https://docs.gradle.org/current/userguide/compatibility.html#groovy - compileOnly 'org.codehaus.groovy:groovy' + compileOnly 'org.apache.groovy:groovy' testImplementation platform(project(':grails-gradle-bom')) testImplementation 'org.slf4j:slf4j-simple' testImplementation('org.spockframework:spock-core') { transitive = false } - testImplementation 'org.codehaus.groovy:groovy-test-junit5' + testImplementation 'org.apache.groovy:groovy-test-junit5' // for easier setting of environment variables in tests testImplementation 'uk.org.webcompere:system-stubs-core:2.1.8' diff --git a/grails-gradle/gradle/wrapper/gradle-wrapper.jar b/grails-gradle/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/grails-gradle/gradle/wrapper/gradle-wrapper.jar and b/grails-gradle/gradle/wrapper/gradle-wrapper.jar differ diff --git a/grails-gradle/gradle/wrapper/gradle-wrapper.properties b/grails-gradle/gradle/wrapper/gradle-wrapper.properties index 7712f940a25..5012f38a995 100644 --- a/grails-gradle/gradle/wrapper/gradle-wrapper.properties +++ b/grails-gradle/gradle/wrapper/gradle-wrapper.properties @@ -2,7 +2,7 @@ # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/grails-gradle/gradlew b/grails-gradle/gradlew index 23d15a93670..adff685a034 100755 --- a/grails-gradle/gradlew +++ b/grails-gradle/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/grails-gradle/gradlew.bat b/grails-gradle/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100755 --- a/grails-gradle/gradlew.bat +++ b/grails-gradle/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/grails-gradle/model/build.gradle b/grails-gradle/model/build.gradle index 7df57487ca4..695a9fe6242 100644 --- a/grails-gradle/model/build.gradle +++ b/grails-gradle/model/build.gradle @@ -41,13 +41,13 @@ dependencies { implementation platform(project(':grails-gradle-bom')) // compile grails-gradle-model with the Groovy version provided by Gradle - // to ensure build compatibility with Gradle, currently Groovy 3.0.x + // Groovy 4+ uses org.apache.groovy coordinates // when used by grails-gradle-plugin // see: https://docs.gradle.org/current/userguide/compatibility.html#groovy - compileOnly 'org.codehaus.groovy:groovy' - compileOnly 'org.codehaus.groovy:groovy-xml' + compileOnly 'org.apache.groovy:groovy' + compileOnly 'org.apache.groovy:groovy-xml' - testImplementation 'org.codehaus.groovy:groovy-test-junit5' + testImplementation 'org.apache.groovy:groovy-test-junit5' testImplementation 'org.junit.jupiter:junit-jupiter-api' testImplementation 'org.junit.platform:junit-platform-runner' @@ -67,8 +67,8 @@ dependencies { api 'org.slf4j:jcl-over-slf4j' // Testing - testImplementation 'org.codehaus.groovy:groovy' - testImplementation 'org.codehaus.groovy:groovy-xml' + testImplementation 'org.apache.groovy:groovy' + testImplementation 'org.apache.groovy:groovy-xml' testImplementation 'org.slf4j:slf4j-simple' testImplementation('org.spockframework:spock-core') { transitive = false diff --git a/grails-gradle/model/src/test/groovy/grails/io/IOUtilsSpec.groovy b/grails-gradle/model/src/test/groovy/grails/io/IOUtilsSpec.groovy index 61a2f5dca70..24dec7ccac7 100644 --- a/grails-gradle/model/src/test/groovy/grails/io/IOUtilsSpec.groovy +++ b/grails-gradle/model/src/test/groovy/grails/io/IOUtilsSpec.groovy @@ -32,7 +32,7 @@ class IOUtilsSpec extends Specification { void "Test findJarResource finds a JAR resource"() { expect: IOUtils.findJarResource(Specification) - IOUtils.findJarResource(Specification).path.endsWith('spock-core-2.3-groovy-3.0.jar!/') + IOUtils.findJarResource(Specification).path.endsWith('spock-core-2.3-groovy-4.0.jar!/') } void 'findRootResourcesURL - appends / if not present'() { diff --git a/grails-gradle/plugins/build.gradle b/grails-gradle/plugins/build.gradle index cedf995b7aa..7d68df41f9b 100644 --- a/grails-gradle/plugins/build.gradle +++ b/grails-gradle/plugins/build.gradle @@ -40,9 +40,8 @@ dependencies { implementation platform(project(':grails-gradle-bom')) // compile grails-gradle-plugin with the Groovy version provided by Gradle - // to ensure build compatibility with Gradle, currently Groovy 3.0.x // see: https://docs.gradle.org/current/userguide/compatibility.html#groovy - compileOnly "org.codehaus.groovy:groovy" + compileOnly "org.apache.groovy:groovy" implementation project(':grails-gradle-common') implementation project(':grails-gradle-tasks') diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextCommandTask.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextCommandTask.groovy index ae1e2a8b014..36387d4f9b7 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextCommandTask.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextCommandTask.groovy @@ -22,6 +22,8 @@ import groovy.transform.CompileStatic import org.gradle.api.tasks.JavaExec +import javax.inject.Inject + /** * * @@ -29,8 +31,9 @@ import org.gradle.api.tasks.JavaExec * @since 3.0 */ @CompileStatic -class ApplicationContextCommandTask extends JavaExec { +abstract class ApplicationContextCommandTask extends JavaExec { + @Inject ApplicationContextCommandTask() { mainClass.set('grails.ui.command.GrailsApplicationContextCommandRunner') dependsOn('classes', 'findMainClass') diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextScriptTask.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextScriptTask.groovy index 5bd5207d8c7..9cbda9b09f0 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextScriptTask.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/commands/ApplicationContextScriptTask.groovy @@ -22,9 +22,12 @@ import groovy.transform.CompileStatic import org.gradle.api.tasks.JavaExec +import javax.inject.Inject + @CompileStatic -class ApplicationContextScriptTask extends JavaExec { +abstract class ApplicationContextScriptTask extends JavaExec { + @Inject ApplicationContextScriptTask() { mainClass.set('grails.ui.script.GrailsApplicationScriptRunner') dependsOn('classes', 'findMainClass') diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy index bdfcc62c318..1743af49101 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/core/GrailsGradlePlugin.groovy @@ -404,13 +404,20 @@ ${importStatements} buildPropertiesTask.inputs.properties(buildPropertiesContents) buildPropertiesTask.outputs.file(buildInfoFile) + + // Capture build directory at configuration time to avoid Task.project access at execution time + // See: https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution + def buildDir = project.layout.buildDirectory.asFile.get() + buildPropertiesTask.doLast { - project.buildDir.mkdirs() - ant.mkdir(dir: buildInfoFile.parentFile) - ant.propertyfile(file: buildInfoFile) { - for (me in buildPropertiesTask.inputs.properties) { - entry(key: me.key, value: me.value) - } + buildDir.mkdirs() + buildInfoFile.parentFile.mkdirs() + Properties props = new Properties() + buildPropertiesTask.inputs.properties.each { key, value -> + props.setProperty(key as String, value as String) + } + buildInfoFile.withOutputStream { out -> + props.store(out, null) } PropertyFileUtils.makePropertiesFileReproducible(buildInfoFile) } @@ -939,12 +946,17 @@ ${importStatements} @CompileDynamic protected TaskProvider createNative2AsciiTask(TaskContainer tasks, src, dest) { TaskProvider native2asciiTask = tasks.register('native2ascii').configure { + it.inputs.dir(src) + it.outputs.dir(dest) + + // Capture ant builder at configuration time to avoid Task.project access at execution time + // See: https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution + def antBuilder = it.ant + it.doLast { - it.ant.native2ascii(src: src, dest: dest, + antBuilder.native2ascii(src: src, dest: dest, includes: '**/*.properties', encoding: 'UTF-8') } - it.inputs.dir(src) - it.outputs.dir(dest) } native2asciiTask diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/GrailsProfileGradlePlugin.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/GrailsProfileGradlePlugin.groovy index 2d5d778d868..1a4ffb7a7b1 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/GrailsProfileGradlePlugin.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/GrailsProfileGradlePlugin.groovy @@ -30,11 +30,11 @@ import org.gradle.api.attributes.Usage import org.gradle.api.component.SoftwareComponentFactory import org.gradle.api.file.CopySpec import org.gradle.api.file.Directory -import org.gradle.api.file.SyncSpec import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.GroovyPlugin import org.gradle.api.plugins.JavaLibraryPlugin +import org.gradle.api.tasks.Sync import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.Jar @@ -87,48 +87,30 @@ class GrailsProfileGradlePlugin implements Plugin { project.configurations.named('runtimeElements') .configure { it.extendsFrom(runtimeOnlyConfiguration.get()) } - TaskProvider processProfileResourcesTask = project.tasks.register('processProfileResources') - processProfileResourcesTask.configure { Task task -> + // Use Sync task type instead of project.sync in doLast to avoid Task.project access at execution time + // See: https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution + TaskProvider processProfileResourcesTask = project.tasks.register('processProfileResources', Sync) + processProfileResourcesTask.configure { Sync task -> task.group = 'build' - task.inputs.dir(project.provider { - def directory = project.layout.projectDirectory.dir('commands') - directory.asFile.exists() ? directory : null - }).optional().skipWhenEmpty() - task.inputs.dir(project.provider { - def directory = project.layout.projectDirectory.dir('templates') - directory.asFile.exists() ? directory : null - }).optional().skipWhenEmpty() - task.inputs.dir(project.provider { - def directory = project.layout.projectDirectory.dir('features') - directory.asFile.exists() ? directory : null - }).optional().skipWhenEmpty() - task.inputs.dir(project.provider { - def directory = project.layout.projectDirectory.dir('skeleton') - directory.asFile.exists() ? directory : null - }).optional().skipWhenEmpty() - task.doLast { - project.sync { SyncSpec sync -> - sync.from(project.layout.projectDirectory.dir('commands')) { CopySpec s -> - s.exclude('*.groovy') - s.into('commands') - } - - sync.from(project.layout.projectDirectory.dir('templates')) { CopySpec s -> - s.into('templates') - } + task.from(project.layout.projectDirectory.dir('commands')) { CopySpec s -> + s.exclude('*.groovy') + s.into('commands') + } - sync.from(project.layout.projectDirectory.dir('features')) { CopySpec s -> - s.into('features') - } + task.from(project.layout.projectDirectory.dir('templates')) { CopySpec s -> + s.into('templates') + } - sync.from(project.layout.projectDirectory.dir('skeleton')) { CopySpec s -> - s.into('skeleton') - } + task.from(project.layout.projectDirectory.dir('features')) { CopySpec s -> + s.into('features') + } - sync.into(project.layout.buildDirectory.dir('resources/profile/META-INF/grails-profile')) - } + task.from(project.layout.projectDirectory.dir('skeleton')) { CopySpec s -> + s.into('skeleton') } + + task.into(project.layout.buildDirectory.dir('resources/profile/META-INF/grails-profile')) } TaskProvider compileTask = project.tasks.register('compileProfile', ProfileCompilerTask) diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/tasks/ProfileCompilerTask.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/tasks/ProfileCompilerTask.groovy index 354917d36e7..1cb990f892a 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/tasks/ProfileCompilerTask.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/profiles/tasks/ProfileCompilerTask.groovy @@ -67,7 +67,7 @@ import org.grails.gradle.plugin.profiles.GrailsProfileGradlePlugin */ @CompileStatic @CacheableTask -class ProfileCompilerTask extends AbstractCompile { +abstract class ProfileCompilerTask extends AbstractCompile { public static final String DEFAULT_COMPATIBILITY = JavaVersion.VERSION_17.majorVersion public static final String PROFILE_NAME = 'name' diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/run/GrailsRunTask.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/run/GrailsRunTask.groovy index 19f7d936840..8bc12581b54 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/run/GrailsRunTask.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/run/GrailsRunTask.groovy @@ -29,4 +29,4 @@ import org.gradle.api.tasks.JavaExec * @since 3.2 */ @CompileStatic -class GrailsRunTask extends JavaExec {} +abstract class GrailsRunTask extends JavaExec {} diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/json/GsonViewCompilerTask.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/json/GsonViewCompilerTask.groovy index fe77a1a3f06..5ffa1b4fd59 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/json/GsonViewCompilerTask.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/json/GsonViewCompilerTask.groovy @@ -36,7 +36,7 @@ import org.grails.gradle.plugin.views.AbstractGroovyTemplateCompileTask */ @CompileStatic @CacheableTask -class GsonViewCompilerTask extends AbstractGroovyTemplateCompileTask { +abstract class GsonViewCompilerTask extends AbstractGroovyTemplateCompileTask { @Inject GsonViewCompilerTask(ExecOperations execOperations, ObjectFactory objectFactory) { diff --git a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/markup/MarkupViewCompilerTask.groovy b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/markup/MarkupViewCompilerTask.groovy index 26d13458079..b10bbc9c442 100644 --- a/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/markup/MarkupViewCompilerTask.groovy +++ b/grails-gradle/plugins/src/main/groovy/org/grails/gradle/plugin/views/markup/MarkupViewCompilerTask.groovy @@ -39,7 +39,7 @@ import org.grails.gradle.plugin.views.AbstractGroovyTemplateCompileTask */ @CompileStatic @CacheableTask -class MarkupViewCompilerTask extends AbstractGroovyTemplateCompileTask { +abstract class MarkupViewCompilerTask extends AbstractGroovyTemplateCompileTask { @Input final Property fileExtension diff --git a/grails-gradle/settings.gradle b/grails-gradle/settings.gradle index 7d0b8a0a1b2..6cc11fe99a6 100644 --- a/grails-gradle/settings.gradle +++ b/grails-gradle/settings.gradle @@ -25,8 +25,8 @@ pluginManagement { } plugins { - id 'com.gradle.develocity' version '4.1.1' - id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.3' + id 'com.gradle.develocity' version '4.3.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.4.0' id 'org.apache.grails.buildsrc.repo' } diff --git a/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.jar b/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.jar and b/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.jar differ diff --git a/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.properties b/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.properties index 7712f940a25..5012f38a995 100644 --- a/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.properties +++ b/grails-profiles/base/skeleton/gradle/wrapper/gradle-wrapper.properties @@ -2,7 +2,7 @@ # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/grails-profiles/base/skeleton/gradlew b/grails-profiles/base/skeleton/gradlew index 23d15a93670..adff685a034 100755 --- a/grails-profiles/base/skeleton/gradlew +++ b/grails-profiles/base/skeleton/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/grails-profiles/base/skeleton/gradlew.bat b/grails-profiles/base/skeleton/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100755 --- a/grails-profiles/base/skeleton/gradlew.bat +++ b/grails-profiles/base/skeleton/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.jar b/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.jar index 1b33c55baab..61285a659d1 100644 Binary files a/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.jar and b/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.jar differ diff --git a/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.properties b/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.properties index 7712f940a25..5012f38a995 100644 --- a/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.properties +++ b/grails-profiles/profile/skeleton/gradle/wrapper/gradle-wrapper.properties @@ -2,7 +2,7 @@ # and grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/build/gradle/templates/gradleWrapperProperties.rocker.raw distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/grails-profiles/profile/skeleton/gradlew b/grails-profiles/profile/skeleton/gradlew index 23d15a93670..adff685a034 100755 --- a/grails-profiles/profile/skeleton/gradlew +++ b/grails-profiles/profile/skeleton/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/grails-profiles/profile/skeleton/gradlew.bat b/grails-profiles/profile/skeleton/gradlew.bat index db3a6ac207e..c4bdd3ab8e3 100755 --- a/grails-profiles/profile/skeleton/gradlew.bat +++ b/grails-profiles/profile/skeleton/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/grails-shell-cli/src/test/resources/gradle-sample/build.gradle b/grails-shell-cli/src/test/resources/gradle-sample/build.gradle index 16e2ff3030c..c10c0a7fc1e 100644 --- a/grails-shell-cli/src/test/resources/gradle-sample/build.gradle +++ b/grails-shell-cli/src/test/resources/gradle-sample/build.gradle @@ -20,5 +20,9 @@ apply plugin:'java' subprojects { - task hello << {println 'Hello World!'} + tasks.register('hello') { + doLast { + println 'Hello World!' + } + } } diff --git a/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.jar b/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.jar index 3d0dee6e8ed..61285a659d1 100644 Binary files a/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.jar and b/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.jar differ diff --git a/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.properties b/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.properties index 008fdb61cba..725a08358fb 100644 --- a/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.properties +++ b/grails-shell-cli/src/test/resources/gradle-sample/gradle/wrapper/gradle-wrapper.properties @@ -17,9 +17,10 @@ # under the License. # -#Tue Sep 30 10:07:59 EEST 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-bin.zip diff --git a/grails-shell-cli/src/test/resources/gradle-sample/gradlew b/grails-shell-cli/src/test/resources/gradle-sample/gradlew index 91a7e269e19..adff685a034 100755 --- a/grails-shell-cli/src/test/resources/gradle-sample/gradlew +++ b/grails-shell-cli/src/test/resources/gradle-sample/gradlew @@ -1,79 +1,128 @@ -#!/usr/bin/env bash +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed 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. +# +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -82,83 +131,118 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" 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 8a0b282aa68..c4bdd3ab8e3 100644 --- a/grails-shell-cli/src/test/resources/gradle-sample/gradlew.bat +++ b/grails-shell-cli/src/test/resources/gradle-sample/gradlew.bat @@ -1,4 +1,22 @@ -@if "%DEBUG%" == "" @echo off +@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 @@ -8,26 +26,30 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@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= - set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +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%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +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 goto fail @@ -35,54 +57,35 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +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 goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/grails-shell-cli/src/test/resources/gradle-sample/subproj/build.gradle b/grails-shell-cli/src/test/resources/gradle-sample/subproj/build.gradle index c3289a593c6..bcb11dda5c0 100644 --- a/grails-shell-cli/src/test/resources/gradle-sample/subproj/build.gradle +++ b/grails-shell-cli/src/test/resources/gradle-sample/subproj/build.gradle @@ -19,4 +19,8 @@ apply plugin:'java' -task hello2 << {println 'Another hello world!'} +tasks.register('hello2') { + doLast { + println 'Another hello world!' + } +} diff --git a/grails-shell-cli/src/test/resources/gradle-sample/subproj2/build.gradle b/grails-shell-cli/src/test/resources/gradle-sample/subproj2/build.gradle index 1897fb902d8..063901a4f8f 100644 --- a/grails-shell-cli/src/test/resources/gradle-sample/subproj2/build.gradle +++ b/grails-shell-cli/src/test/resources/gradle-sample/subproj2/build.gradle @@ -19,4 +19,8 @@ apply plugin:'java' -task hello3 << {println 'Third hello world!'} +tasks.register('hello3') { + doLast { + println 'Third hello world!' + } +} diff --git a/settings.gradle b/settings.gradle index 691f9cbdf00..8316e051a35 100644 --- a/settings.gradle +++ b/settings.gradle @@ -29,11 +29,16 @@ pluginManagement { } plugins { - id 'com.gradle.develocity' version '4.2.2' - id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.3' + id 'com.gradle.develocity' version '4.3.2' + id 'com.gradle.common-custom-user-data-gradle-plugin' version '2.4.0' id 'org.apache.grails.buildsrc.repo' } +// NOTE: Known Gradle deprecation warnings (scheduled for removal in Gradle 10): +// 1. StartParameter.isConfigurationCacheRequested - from org.asciidoctor.jvm.convert plugin (4.0.5) +// Fix available in asciidoctor-gradle-plugin 5.0.0+ (currently alpha) +// Tracking: https://github.com/asciidoctor/asciidoctor-gradle-plugin/issues/756 + def isCI = System.getenv().containsKey('CI') def isLocal = !isCI def isReproducibleBuild = System.getenv('SOURCE_DATE_EPOCH') != null