You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by ja...@apache.org on 2026/04/24 11:26:23 UTC
(grails-core) branch upgrade/gradle-9.3.1 updated: Address PR review feedback: telemetry override, forge BOM adoption, publish plugin bump
This is an automated email from the ASF dual-hosted git repository.
jamesfredley pushed a commit to branch upgrade/gradle-9.3.1
in repository https://gitbox.apache.org/repos/asf/grails-core.git
The following commit(s) were added to refs/heads/upgrade/gradle-9.3.1 by this push:
new e1f3013070 Address PR review feedback: telemetry override, forge BOM adoption, publish plugin bump
e1f3013070 is described below
commit e1f3013070027135fe60a151002e91c072e86c63
Author: James Fredley <ja...@users.noreply.github.com>
AuthorDate: Fri Apr 24 07:26:08 2026 -0400
Address PR review feedback: telemetry override, forge BOM adoption, publish plugin bump
Review feedback from apache/grails-core#15365:
* OpenTelemetry version (replace BOM import with explicit constraints):
Selenium 4.41+ needs OpenTelemetry 1.59+, which is newer than the 1.55.x
that Spring Boot 4.0.5 manages. The previous fix relied on importing the
opentelemetry-bom AFTER the spring-boot-bom so ordering would favour the
newer version, but BOM import order is not guaranteed by Gradle or Maven
resolution (same class of issue as the hibernate PR). Replace the BOM
import with an explicit list of opentelemetry module constraints in the
grails-bom constraints block; explicit constraints always win over any
imported BOM's transitively-managed version, regardless of ordering.
* grails-publish 0.0.4 -> 1.0.0-SNAPSHOT: adopt the Gradle 9 / Java 21
compatible build of the publish plugin. Add the apache snapshots repo to
root, grails-gradle, and grails-gradle/buildSrc pluginManagement blocks
so the composite build classpath resolves the snapshot before the
org.apache.grails.buildsrc.repo settings plugin itself is available.
* grails-forge: bump groovyVersion 4.0.30 -> 4.0.31 to match grails-core;
drop ':$micronautVersion' suffix from micronaut-inject-groovy references
in grails-forge-api, grails-forge-cli, grails-forge-core, grails-forge-
web-netty, grails-forge-analytics-postgres, and test-core so the
micronaut-platform BOM (already applied in each file) manages the
version. Apply the micronaut-platform BOM in test-core which was using
direct versions only.
* grails-forge-web-netty: runtimeOnly io.micronaut:micronaut-jackson-
databind -> io.micronaut.serde:micronaut-serde-jackson. The forge stack
is a Micronaut 4 serde-jackson application; the legacy jackson-databind
runtime was a copy-paste from an earlier generator template.
* grails-test-examples-micronaut: import the micronaut-platform BOM and
drop the per-artifact micronautHttpClientVersion / micronautSerde-
JacksonVersion references. Delete the now-unused properties from the
root gradle.properties.
* grails-bom/build.gradle: drop the java-platform plugin guard on the
extractConstraints task. The task is only consumed internally, so the
external-use guard no longer needs to exist.
* grails-doc/build.gradle: disable the per-project groovydoc' task
instead of adding a dependency from dist'. grails-doc has no real
source to document - the groovy plugin is only applied for version
resolution, so the default groovydoc output is empty/unused. The user-
facing groovydoc is produced by the aggregateGroovydoc task, which is
already wired into the docs task.
* Drop grails-doc/src/en/ref/Configuration/Application Properties.adoc.
This 866-line new documentation file is unrelated to the Gradle 9 /
Micronaut 4 upgrade and will be submitted separately.
Assisted-by: claude-code:claude-opus-4-7
---
dependencies.gradle | 47 +-
gradle.properties | 3 -
grails-bom/build.gradle | 3 -
grails-doc/build.gradle | 13 +-
.../ref/Configuration/Application Properties.adoc | 866 ---------------------
grails-forge/gradle.properties | 4 +-
.../grails-forge-analytics-postgres/build.gradle | 2 +-
grails-forge/grails-forge-api/build.gradle | 6 +-
grails-forge/grails-forge-cli/build.gradle | 4 +-
grails-forge/grails-forge-core/build.gradle | 4 +-
grails-forge/grails-forge-web-netty/build.gradle | 4 +-
grails-forge/test-core/build.gradle | 8 +-
grails-gradle/buildSrc/settings.gradle | 17 +
grails-gradle/settings.gradle | 17 +
grails-test-examples/micronaut/build.gradle | 7 +-
settings.gradle | 17 +
16 files changed, 117 insertions(+), 905 deletions(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index c73e40d4f5..f882a65a7a 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -31,7 +31,7 @@ ext {
'directory-watcher.version' : '0.19.1',
'gradle-groovy.version' : '4.0.31',
'gradle-spock.version' : '2.3-groovy-4.0',
- 'grails-publish-plugin.version' : '0.0.4',
+ 'grails-publish-plugin.version' : '1.0.0-SNAPSHOT',
'jansi.version' : '1.18',
'javaparser-core.version' : '3.28.0',
'jline.version' : '2.14.6',
@@ -82,10 +82,10 @@ ext {
'liquibase-hibernate5.version': '4.27.0',
'mongodb.version' : '5.6.4',
// Selenium 4.41+ requires OpenTelemetry 1.59+, which is newer than the
- // 1.55.x that Spring Boot 4.0.5 manages. Declare the OpenTelemetry BOM
- // version so the grails-bom aligns all transitive OpenTelemetry modules
- // on the higher version (Gradle picks the highest in conflict, and the
- // dependency validator compares resolved versus BOM-declared values).
+ // 1.55.x that Spring Boot 4.0.5 manages. Pin the version on the individual
+ // OpenTelemetry modules (see the constraints block in grails-bom/build.gradle)
+ // so the explicit constraint overrides whatever Spring Boot's imported BOM
+ // declares, regardless of platform import ordering.
'opentelemetry.version' : '1.59.0',
'rxjava.version' : '1.3.8',
'rxjava2.version' : '2.2.21',
@@ -108,10 +108,6 @@ ext {
'spock-bom' : "org.spockframework:spock-bom:${bomDependencyVersions['spock.version']}",
'groovy-bom' : "org.apache.groovy:groovy-bom:${bomDependencyVersions['groovy.version']}",
- // opentelemetry-bom must be imported AFTER spring-boot-bom (applied in grails-bom)
- // so its 1.59.x constraints override spring-boot 4.0.5's 1.55.x constraints that
- // Selenium 4.41 upgrades transitively anyway.
- 'opentelemetry-bom' : "io.opentelemetry:opentelemetry-bom:${bomDependencyVersions['opentelemetry.version']}",
'selenium-bom' : "org.seleniumhq.selenium:selenium-bom:${bomDependencyVersions['selenium.version']}",
]
@@ -174,6 +170,39 @@ ext {
'mongodb-driver-core' : "org.mongodb:mongodb-driver-core:${bomDependencyVersions['mongodb.version']}",
'mongodb-driver-sync' : "org.mongodb:mongodb-driver-sync:${bomDependencyVersions['mongodb.version']}",
'mongodb-record-codec' : "org.mongodb:bson-record-codec:${bomDependencyVersions['mongodb.version']}",
+ // start - individual opentelemetry modules pinned explicitly. Selenium 4.41+ requires
+ // OpenTelemetry 1.59+ while Spring Boot 4.0.5's BOM declares 1.55.x. Importing the
+ // opentelemetry-bom as a platform would only win over Spring Boot's BOM through
+ // import order, which neither Gradle nor Maven guarantees for transitive resolution.
+ // Explicit module constraints override any imported BOM's managed version, so this
+ // works regardless of platform ordering and keeps the dependency validator's
+ // "resolved vs BOM-declared" check consistent.
+ // The module list mirrors io.opentelemetry:opentelemetry-bom:1.59.0 dependencyManagement.
+ 'opentelemetry-api' : "io.opentelemetry:opentelemetry-api:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-common' : "io.opentelemetry:opentelemetry-common:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-context' : "io.opentelemetry:opentelemetry-context:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-common' : "io.opentelemetry:opentelemetry-exporter-common:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-logging' : "io.opentelemetry:opentelemetry-exporter-logging:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-logging-otlp' : "io.opentelemetry:opentelemetry-exporter-logging-otlp:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-otlp' : "io.opentelemetry:opentelemetry-exporter-otlp:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-otlp-common' : "io.opentelemetry:opentelemetry-exporter-otlp-common:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-sender-grpc-managed-channel' : "io.opentelemetry:opentelemetry-exporter-sender-grpc-managed-channel:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-sender-jdk' : "io.opentelemetry:opentelemetry-exporter-sender-jdk:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-sender-okhttp' : "io.opentelemetry:opentelemetry-exporter-sender-okhttp:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-exporter-zipkin' : "io.opentelemetry:opentelemetry-exporter-zipkin:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-extension-kotlin' : "io.opentelemetry:opentelemetry-extension-kotlin:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-extension-trace-propagators' : "io.opentelemetry:opentelemetry-extension-trace-propagators:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-opentracing-shim' : "io.opentelemetry:opentelemetry-opentracing-shim:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk' : "io.opentelemetry:opentelemetry-sdk:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-common' : "io.opentelemetry:opentelemetry-sdk-common:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-extension-autoconfigure' : "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-extension-autoconfigure-spi' : "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-extension-jaeger-remote-sampler' : "io.opentelemetry:opentelemetry-sdk-extension-jaeger-remote-sampler:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-logs' : "io.opentelemetry:opentelemetry-sdk-logs:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-metrics' : "io.opentelemetry:opentelemetry-sdk-metrics:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-testing' : "io.opentelemetry:opentelemetry-sdk-testing:${bomDependencyVersions['opentelemetry.version']}",
+ 'opentelemetry-sdk-trace' : "io.opentelemetry:opentelemetry-sdk-trace:${bomDependencyVersions['opentelemetry.version']}",
+ // end - opentelemetry modules
'rxjava' : "io.reactivex:rxjava:${bomDependencyVersions['rxjava.version']}",
'rxjava2' : "io.reactivex.rxjava2:rxjava:${bomDependencyVersions['rxjava2.version']}",
'rxjava3' : "io.reactivex.rxjava3:rxjava:${bomDependencyVersions['rxjava3.version']}",
diff --git a/gradle.properties b/gradle.properties
index c720ed4574..816080c951 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -60,9 +60,6 @@ micronautPlatformVersion=5.0.0-M1
ersatzVersion=4.0.1
grailsSpringSecurityVersion=7.0.2-SNAPSHOT
jbossTransactionApiVersion=2.0.0.Final
-# Note: we do not import the micronaut bom in our tests to avoid spring version mismatches
-micronautHttpClientVersion=4.10.18
-micronautSerdeJacksonVersion=2.16.2
# build dependencies for code quality checks
checkstyleVersion=11.0.0
diff --git a/grails-bom/build.gradle b/grails-bom/build.gradle
index b1b1bc9080..7c5d6e771d 100644
--- a/grails-bom/build.gradle
+++ b/grails-bom/build.gradle
@@ -109,9 +109,6 @@ configurations.register('bomDependencies').configure {
tasks.register('extractConstraints', ExtractDependenciesTask).configure { ExtractDependenciesTask it ->
// Capture project services at configuration time so the task avoids the deprecated Task.project at execution time
it.captureProjectServices(project.dependencies, project.configurations)
- if (!project.pluginManager.hasPlugin('java-platform')) {
- throw new GradleException("The 'java-platform' plugin must be applied to the project to use ExtractDependenciesTask.")
- }
it.configuration = configurations.named('bomDependencies')
it.configurationName = 'bomDependencies'
it.destination = project.layout.buildDirectory.file('grails-bom-constraints.adoc')
diff --git a/grails-doc/build.gradle b/grails-doc/build.gradle
index 4cb97bd82e..d8f45b9c43 100644
--- a/grails-doc/build.gradle
+++ b/grails-doc/build.gradle
@@ -306,7 +306,7 @@ docsTask.configure { Sync it ->
}
tasks.register('dist', Zip).configure { Zip it ->
- it.dependsOn(docsTask, tasks.named('groovydoc'))
+ it.dependsOn(docsTask)
it.from(outputDir)
}
@@ -320,3 +320,14 @@ tasks.named('assemble').configure {
tasks.withType(Jar).configureEach {
enabled = false
}
+
+// grails-doc has no real source to document - the groovy plugin is only applied so this
+// project can resolve dependency versions from the grails-bom for the guide's asciidoc
+// templates. The default `groovydoc` task would still write into build/docs/groovydoc,
+// which Gradle 9 then reports as an implicit input of the `dist` task. Disabling the
+// task removes both the empty output directory and the implicit dependency without a
+// bogus dependsOn. The user-facing groovydoc is produced by the `aggregateGroovydoc`
+// task (see `combinedGroovydoc` above), which is already wired into `docs`.
+tasks.named('groovydoc').configure {
+ it.enabled = false
+}
diff --git a/grails-doc/src/en/ref/Configuration/Application Properties.adoc b/grails-doc/src/en/ref/Configuration/Application Properties.adoc
deleted file mode 100644
index 8a6466ff1a..0000000000
--- a/grails-doc/src/en/ref/Configuration/Application Properties.adoc
+++ /dev/null
@@ -1,866 +0,0 @@
-////
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-////
-
-== Application Properties
-
-A comprehensive reference of all configuration properties specific to Grails and its bundled modules. These properties are set in `grails-app/conf/application.yml` (or `application.groovy`).
-
-Since Grails is built on Spring Boot, all https://docs.spring.io/spring-boot/{springBootVersion}/appendix/application-properties/index.html[Spring Boot Common Application Properties] are also available (for example `server.port`, `logging.*`, `spring.datasource.hikari.*`, and `management.*`). This reference covers only Grails-specific properties.
-
-=== Environment-Specific Configuration
-
-Properties in `application.yml` (or `application.groovy`) are global by default - they apply to all environments. To override a property for a specific environment, nest it under an `environments` block:
-
-[source,yaml]
-----
-# Global (applies to all environments)
-grails:
- serverURL: https://my.app.com
-
-# Environment-specific overrides
-environments:
- development:
- grails:
- serverURL: http://localhost:8080
- test:
- grails:
- serverURL: http://localhost:8080
- production:
- grails:
- serverURL: https://my.app.com
-----
-
-Or in `application.groovy`:
-
-[source,groovy]
-----
-grails.serverURL = 'https://my.app.com'
-
-environments {
- development {
- grails.serverURL = 'http://localhost:8080'
- }
- test {
- grails.serverURL = 'http://localhost:8080'
- }
- production {
- grails.serverURL = 'https://my.app.com'
- }
-}
-----
-
-=== Core Properties
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.bootstrap.skip`
-| Whether to skip execution of BootStrap.groovy classes on startup.
-| `false`
-
-| `grails.codegen.defaultPackage`
-| The default package used when generating artefacts with grails create-* commands.
-| `Set by project template`
-
-| `grails.enable.native2ascii`
-| Whether to perform native2ascii conversion of i18n properties files.
-| `true`
-
-| `grails.plugin.excludes`
-| List of plugin names to exclude from the plugin manager.
-| `[]`
-
-| `grails.plugin.includes`
-| List of plugin names to include in the plugin manager (all others excluded).
-| `[]`
-
-| `grails.profile`
-| The active Grails application profile (e.g., web, rest-api, plugin).
-| `Set by project template`
-
-| `grails.serverURL`
-| The server URL used to generate absolute links (e.g., https://my.app.com) and used by redirects.
-| `derived from request`
-
-| `grails.spring.bean.packages`
-| List of packages to scan for Spring beans.
-| `[]`
-
-| `grails.spring.disable.aspectj.autoweaving`
-| Whether to disable AspectJ auto-weaving.
-| `false`
-
-| `grails.spring.placeholder.prefix`
-| The prefix for property placeholder resolution.
-| `${`
-
-| `grails.spring.transactionManagement.proxies`
-| Whether to enable Spring proxy-based transaction management since @Transactional uses an AST transform and proxies are typically redundant.
-| `false`
-
-|===
-
-=== Web & Controllers
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.controllers.defaultScope`
-| The default scope for controllers (singleton, prototype, session).
-| `singleton`
-
-| `grails.controllers.upload.fileSizeThreshold`
-| File size threshold (in bytes) above which uploads are written to disk.
-| `0`
-
-| `grails.controllers.upload.location`
-| The directory for temporary file uploads.
-| `System.getProperty('java.io.tmpdir')`
-
-| `grails.controllers.upload.maxFileSize`
-| Maximum file size for uploads (in bytes).
-| `1048576`
-
-| `grails.controllers.upload.maxRequestSize`
-| Maximum request size for multipart uploads (in bytes).
-| `10485760`
-
-| `grails.exceptionresolver.logRequestParameters`
-| Whether to log request parameters in exception stack traces.
-| `true`
-
-| `grails.exceptionresolver.params.exclude`
-| List of parameter names to mask (replace with [*****]) in exception stack traces, typically used for password and creditCard.
-| `[]`
-
-| `grails.filter.encoding`
-| The character encoding for the Grails character encoding filter.
-| `UTF-8`
-
-| `grails.filter.forceEncoding`
-| Whether to force the encoding filter to set the encoding on the response.
-| `true`
-
-| `grails.logging.stackTraceFiltererClass`
-| Fully qualified class name of a custom StackTraceFilterer implementation.
-| `org.grails.exceptions.reporting.DefaultStackTraceFilterer`
-
-| `grails.web.linkGenerator.useCache`
-| Whether to cache links generated by the link generator.
-| `true`
-
-| `grails.web.servlet.path`
-| The path the Grails dispatcher servlet is mapped to.
-| `/**`
-
-| `grails.web.url.converter`
-| The URL token converter strategy, use hyphenated for hyphen-separated URLs.
-| `camelCase`
-
-|===
-
-=== CORS
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.cors.allowCredentials`
-| Whether credentials (cookies, authorization headers) are supported.
-| `false`
-
-| `grails.cors.allowedHeaders`
-| List of allowed request headers.
-| `["*"]`
-
-| `grails.cors.allowedMethods`
-| List of allowed HTTP methods.
-| `["*"]`
-
-| `grails.cors.allowedOrigins`
-| List of allowed origins (e.g., http://localhost:5000), only applies when grails.cors.enabled is true.
-| `["*"]`
-
-| `grails.cors.enabled`
-| Whether CORS support is enabled.
-| `false`
-
-| `grails.cors.exposedHeaders`
-| List of response headers to expose to the client.
-| `[]`
-
-| `grails.cors.filter`
-| Whether CORS is handled via a servlet filter (true) or an interceptor (false).
-| `true`
-
-| `grails.cors.mappings`
-| Map of URL patterns to per-path CORS configuration where defining any mapping disables the global /** mapping.
-| `{}`
-
-| `grails.cors.maxAge`
-| How long (in seconds) the preflight response can be cached.
-| `1800`
-
-|===
-
-=== Views & GSP
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.gsp.disable.caching.resources`
-| Whether to disable GSP resource caching.
-| `false`
-
-| `grails.gsp.enable.reload`
-| Whether to enable GSP reloading in production.
-| `false`
-
-| `grails.gsp.view.dir`
-| Custom directory for GSP view resolution.
-| `grails-app/views`
-
-| `grails.views.default.codec`
-| The default encoding codec for GSP output. Set to `html` to reduce XSS risk. Options: `none`, `html`, `base64`.
-| `none`
-
-| `grails.views.enable.jsessionid`
-| Whether to include the jsessionid in rendered links.
-| `false`
-
-| `grails.views.filteringCodecForContentType`
-| Map of content types to encoding codecs.
-| `{}`
-
-| `grails.views.gsp.codecs.expression`
-| The codec applied to GSP ${} expressions.
-| `html`
-
-| `grails.views.gsp.codecs.scriptlet`
-| The codec applied to GSP <% %> scriptlet output.
-| `html`
-
-| `grails.views.gsp.codecs.staticparts`
-| The codec applied to static HTML parts of GSP pages.
-| `none`
-
-| `grails.views.gsp.codecs.taglib`
-| The codec applied to tag library output.
-| `none`
-
-| `grails.views.gsp.encoding`
-| The file encoding for GSP source files.
-| `UTF-8`
-
-| `grails.views.gsp.htmlcodec`
-| The HTML codec for GSP output (xml or html).
-| `xml`
-
-| `grails.views.gsp.layout.preprocess`
-| Whether GSP layout preprocessing is enabled. Disabling allows Grails to parse rendered HTML but slows rendering.
-| `true`
-
-|===
-
-=== Content Negotiation & MIME Types
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.converters.encoding`
-| The character encoding for converter output (JSON or XML).
-| `UTF-8`
-
-| `grails.mime.disable.accept.header.userAgents`
-| List of user agent substrings (e.g., Gecko, WebKit) for which Accept header processing is disabled.
-| `[]`
-
-| `grails.mime.disable.accept.header.userAgentsXhr`
-| When true, XHR requests also respect the grails.mime.disable.accept.header.userAgents setting, while by default XHR requests ignore user agent filtering.
-| `false`
-
-| `grails.mime.file.extensions`
-| Whether to use the file extension to determine the MIME type in content negotiation.
-| `true`
-
-| `grails.mime.types`
-| Map of MIME type names to content type strings used for content negotiation.
-| `see web profile application.yml`
-
-| `grails.mime.use.accept.header`
-| Whether to use the Accept header for content negotiation.
-| `true`
-
-|===
-
-=== Data Binding
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.databinding.autoGrowCollectionLimit`
-| The maximum size to which indexed collections can auto-grow during data binding.
-| `256`
-
-| `grails.databinding.convertEmptyStringsToNull`
-| Whether empty String values are converted to null during data binding.
-| `true`
-
-| `grails.databinding.dateFormats`
-| List of date format strings used to parse date values during data binding.
-| `["yyyy-MM-dd HH:mm:ss.S", "yyyy-MM-dd'T'HH:mm:ss'Z'", "yyyy-MM-dd HH:mm:ss.S z", "yyyy-MM-dd'T'HH:mm:ssX"]`
-
-| `grails.databinding.dateParsingLenient`
-| Whether date parsing is lenient (accepting invalid dates like Feb 30).
-| `false`
-
-| `grails.databinding.trimStrings`
-| Whether to trim whitespace from String values during data binding.
-| `true`
-
-|===
-
-=== Internationalization
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.i18n.cache.seconds`
-| How long (in seconds) to cache resolved message bundles with -1 to cache indefinitely and 0 to disable caching.
-| `-1`
-
-| `grails.i18n.filecache.seconds`
-| How long (in seconds) to cache the message bundle file lookup with -1 to cache indefinitely.
-| `-1`
-
-|===
-
-=== Static Resources
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.resources.cachePeriod`
-| The cache period (in seconds) for static resource HTTP responses.
-| `0`
-
-| `grails.resources.enabled`
-| Whether serving static files from src/main/resources/public is enabled.
-| `true`
-
-| `grails.resources.pattern`
-| The URL path pattern for serving static resources.
-| `/static/**`
-
-|===
-
-=== URL Mappings
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.urlmapping.cache.maxsize`
-| The maximum size of the URL mapping cache.
-| `1000`
-
-|===
-
-=== Scaffolding
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.scaffolding.templates.domainSuffix`
-| The suffix appended to domain class names when generating scaffolding templates.
-|
-
-|===
-
-=== Development & Reloading
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.reload.excludes`
-| List of fully qualified class names to exclude from development reloading.
-| `[]`
-
-| `grails.reload.includes`
-| List of fully qualified class names to include in development reloading, when set only these classes are reloaded.
-| `[]`
-
-|===
-
-=== Events
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.events.spring`
-| Whether to bridge GORM/Grails events to the Spring ApplicationEventPublisher, allowing EventListener methods to receive domain events.
-| `true`
-
-|===
-
-=== JSON & Converters
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.converters.json.domain.include.class`
-| Whether to include the class property when marshalling domain objects to JSON.
-| `false`
-
-| `grails.converters.xml.domain.include.class`
-| Whether to include the class attribute when marshalling domain objects to XML.
-| `false`
-
-| `grails.json.legacy.builder`
-| Whether to use the legacy JSON builder.
-| `false`
-
-|===
-
-=== GORM
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.gorm.autoFlush`
-| Whether to automatically flush the Hibernate session between queries.
-| `false`
-
-| `grails.gorm.autowire`
-| Whether to autowire Spring beans into domain class instances.
-| `true`
-
-| `grails.gorm.custom.types`
-| Map of custom GORM types.
-| `{}`
-
-| `grails.gorm.default.constraints`
-| A closure applied as the default constraints for all domain classes.
-| `{}`
-
-| `grails.gorm.default.mapping`
-| A closure applied as the default mapping block for all domain classes.
-| `{}`
-
-| `grails.gorm.events.autoTimestampInsertOverwrite`
-| Whether auto-timestamp (dateCreated) overwrites a user-provided value on insert.
-| `true`
-
-| `grails.gorm.failOnError`
-| When true, save() throws ValidationException on validation failure instead of returning null and can also be a list of package names to apply selectively.
-| `false`
-
-| `grails.gorm.flushMode`
-| The default Hibernate flush mode (AUTO, COMMIT, MANUAL).
-| `AUTO`
-
-| `grails.gorm.markDirty`
-| Whether to mark a domain instance as dirty on an explicit save() call.
-| `true`
-
-| `grails.gorm.multiTenancy.mode`
-| The multi-tenancy mode: DISCRIMINATOR, DATABASE, SCHEMA, or NONE.
-| `NONE`
-
-| `grails.gorm.multiTenancy.tenantResolverClass`
-| Fully qualified class name of the TenantResolver implementation.
-| `required when mode is not NONE`
-
-| `grails.gorm.reactor.events`
-| Whether to translate GORM events into Reactor events, which is disabled by default for performance.
-| `false`
-
-|===
-
-=== DataSource
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `dataSource.dbCreate`
-| The schema generation strategy: create-drop, create, update, validate, or none, use none in production with a migration tool.
-| `create-drop (dev), none (prod)`
-
-| `dataSource.dialect`
-| The Hibernate dialect class name or class.
-| `auto-detected from driver`
-
-| `dataSource.driverClassName`
-| The JDBC driver class name.
-| `org.h2.Driver`
-
-| `dataSource.formatSql`
-| Whether to format logged SQL for readability.
-| `false`
-
-| `dataSource.jmxExport`
-| Whether to register JMX MBeans for the DataSource.
-| `true`
-
-| `dataSource.logSql`
-| Whether to log SQL statements to stdout.
-| `false`
-
-| `dataSource.password`
-| The database password.
-|
-
-| `dataSource.persistenceInterceptor`
-| For additional datasources, whether to wire up the persistence interceptor (the default datasource is always wired).
-| `false`
-
-| `dataSource.pooled`
-| Whether to use a connection pool.
-| `true`
-
-| `dataSource.readOnly`
-| Whether the DataSource is read-only (calls setReadOnly(true) on connections).
-| `false`
-
-| `dataSource.transactional`
-| For additional datasources, whether to include in the chained transaction manager.
-| `true`
-
-| `dataSource.type`
-| The connection pool implementation class when multiple are on the classpath.
-| `com.zaxxer.hikari.HikariDataSource`
-
-| `dataSource.url`
-| The JDBC connection URL.
-| `jdbc:h2:mem:devDb`
-
-| `dataSource.username`
-| The database username.
-| `sa`
-
-|===
-
-=== Hibernate
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `hibernate.cache.queries`
-| Whether to cache Hibernate queries.
-| `false`
-
-| `hibernate.cache.use_query_cache`
-| Whether to enable Hibernate's query cache.
-| `false`
-
-| `hibernate.cache.use_second_level_cache`
-| Whether to enable Hibernate's second-level cache.
-| `false`
-
-|===
-
-=== Database Migration Plugin
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.plugin.databasemigration.changelogFileName`
-| The name of the main changelog file. For named datasources uses `changelog-<name>.groovy`.
-| `changelog.groovy`
-
-| `grails.plugin.databasemigration.changelogLocation`
-| The directory containing changelog files.
-| `grails-app/migrations`
-
-| `grails.plugin.databasemigration.contexts`
-| Comma-delimited list of Liquibase contexts to use for all operations.
-|
-
-| `grails.plugin.databasemigration.databaseChangeLogLockTableName`
-| The name of the Liquibase lock table used to prevent concurrent migrations.
-| `DATABASECHANGELOGLOCK`
-
-| `grails.plugin.databasemigration.databaseChangeLogTableName`
-| The name of the Liquibase changelog tracking table.
-| `DATABASECHANGELOG`
-
-| `grails.plugin.databasemigration.dropOnStart`
-| Whether to drop all database tables before auto-running migrations at startup.
-| `false`
-
-| `grails.plugin.databasemigration.excludeObjects`
-| Comma-delimited list of database objects to ignore in diff and generate operations.
-|
-
-| `grails.plugin.databasemigration.includeObjects`
-| Comma-delimited list of database objects to include in diff and generate operations (all others excluded).
-|
-
-| `grails.plugin.databasemigration.skipUpdateOnStartMainClasses`
-| List of main class names for which startup migrations are skipped, preventing migrations when running CLI commands.
-| `["grails.ui.command.GrailsApplicationContextCommandRunner"]`
-
-| `grails.plugin.databasemigration.updateAllOnStart`
-| Whether to run changesets at startup for all configured datasources.
-| `false`
-
-| `grails.plugin.databasemigration.updateOnStart`
-| Whether to run changesets from the specified file at application startup.
-| `false`
-
-| `grails.plugin.databasemigration.updateOnStartContexts`
-| Liquibase contexts to activate when running migrations at startup. Empty means all contexts.
-| `[]`
-
-| `grails.plugin.databasemigration.updateOnStartDefaultSchema`
-| The default database schema to use when running migrations at startup.
-|
-
-| `grails.plugin.databasemigration.updateOnStartFileName`
-| The changelog file name to run at startup. For named datasources uses `changelog-<name>.groovy`.
-| `changelog.groovy`
-
-| `grails.plugin.databasemigration.updateOnStartLabels`
-| Liquibase labels to filter changesets when running migrations at startup. Empty means all labels.
-| `[]`
-
-|===
-
-=== Cache Plugin
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.cache.cacheManager`
-| The cache manager implementation class name. Use `GrailsConcurrentLinkedMapCacheManager` for bounded caches with maxCapacity support.
-| `GrailsConcurrentMapCacheManager`
-
-| `grails.cache.caches`
-| Map of cache-specific configurations keyed by cache name, each supporting a `maxCapacity` setting (used by GrailsConcurrentLinkedMapCacheManager).
-| `{}`
-
-| `grails.cache.clearAtStartup`
-| Whether to clear all caches when the application starts.
-| `false`
-
-| `grails.cache.ehcache.ehcacheXmlLocation`
-| Location of the Ehcache XML configuration file on the classpath.
-| `classpath:ehcache.xml`
-
-| `grails.cache.ehcache.lockTimeout`
-| The timeout in milliseconds for acquiring a lock on a cache element.
-| `200`
-
-| `grails.cache.enabled`
-| Whether the cache plugin is enabled.
-| `true`
-
-|===
-
-=== MongoDB GORM Plugin
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.mongodb.codecs`
-| List of custom MongoDB Codec classes to register for BSON serialization.
-| `[]`
-
-| `grails.mongodb.databaseName`
-| The MongoDB database name.
-|
-
-| `grails.mongodb.decimalType`
-| Whether to use Decimal128 for BigDecimal values instead of Double.
-| `false`
-
-| `grails.mongodb.default.mapping`
-| A closure applied as the default GORM mapping block for all MongoDB domain classes.
-| `{}`
-
-| `grails.mongodb.host`
-| The MongoDB server hostname. Ignored when `url` or `connectionString` is set.
-| `localhost`
-
-| `grails.mongodb.password`
-| The password for MongoDB authentication.
-|
-
-| `grails.mongodb.port`
-| The MongoDB server port. Ignored when `url` or `connectionString` is set.
-| `27017`
-
-| `grails.mongodb.stateless`
-| Whether to use stateless mode with no session-level caching of entities.
-| `false`
-
-| `grails.mongodb.url`
-| The MongoDB connection URL. Supports the full MongoDB connection string format.
-| `mongodb://localhost/test`
-
-| `grails.mongodb.username`
-| The username for MongoDB authentication.
-|
-
-|===
-
-=== JSON Views
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.views.json.allowResourceExpansion`
-| Whether to allow HAL resource expansion in JSON views.
-| `true`
-
-| `grails.views.json.compileStatic`
-| Whether JSON views are statically compiled.
-| `true`
-
-| `grails.views.json.encoding`
-| The character encoding for JSON views.
-| `UTF-8`
-
-| `grails.views.json.generator.dateFormat`
-| The date format pattern for JSON serialization.
-| `yyyy-MM-dd'T'HH:mm:ss.SSSX`
-
-| `grails.views.json.generator.escapeUnicode`
-| Whether to escape Unicode characters in JSON output.
-| `false`
-
-| `grails.views.json.generator.locale`
-| The locale for JSON output formatting.
-| `en/US`
-
-| `grails.views.json.generator.timeZone`
-| The time zone for JSON date serialization.
-| `GMT`
-
-| `grails.views.json.mimeTypes`
-| MIME types handled by JSON views.
-| `["application/json", "application/hal+json"]`
-
-| `grails.views.json.prettyPrint`
-| Whether to pretty-print JSON output with indentation.
-| `false`
-
-|===
-
-=== MongoDB GORM Plugin - Client Options
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.mongodb.options.applicationName`
-| Application name sent to MongoDB for server logs and profiling.
-|
-
-| `grails.mongodb.options.readConcern`
-| The MongoDB read concern level (e.g., local, majority, linearizable).
-|
-
-| `grails.mongodb.options.readPreference`
-| The MongoDB read preference (e.g., primary, secondary, nearest).
-|
-
-| `grails.mongodb.options.retryReads`
-| Whether to retry read operations on transient network errors.
-|
-
-| `grails.mongodb.options.retryWrites`
-| Whether to retry write operations on transient network errors.
-|
-
-| `grails.mongodb.options.writeConcern`
-| The MongoDB write concern (e.g., majority, w1, journaled).
-|
-
-|===
-
-=== MongoDB GORM Plugin - Connection Pool
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.mongodb.options.connectionPoolSettings.maxConnectionIdleTime`
-| Maximum idle time in milliseconds before a pooled connection is closed (0 for unlimited).
-| `0`
-
-| `grails.mongodb.options.connectionPoolSettings.maxConnectionLifeTime`
-| Maximum lifetime in milliseconds of a pooled connection (0 for unlimited).
-| `0`
-
-| `grails.mongodb.options.connectionPoolSettings.maxSize`
-| Maximum number of connections in the connection pool.
-| `100`
-
-| `grails.mongodb.options.connectionPoolSettings.maxWaitTime`
-| Maximum time in milliseconds to wait for a connection from the pool.
-| `120000`
-
-| `grails.mongodb.options.connectionPoolSettings.minSize`
-| Minimum number of connections in the connection pool.
-| `0`
-
-|===
-
-=== MongoDB GORM Plugin - SSL
-
-[cols="3,5,2", options="header"]
-|===
-| Property | Description | Default
-
-| `grails.mongodb.options.sslSettings.enabled`
-| Whether to enable TLS/SSL for connections to MongoDB.
-| `false`
-
-| `grails.mongodb.options.sslSettings.invalidHostNameAllowed`
-| Whether to allow connections to MongoDB servers with invalid hostnames in TLS certificates.
-| `false`
-
-|===
-
-== Plugin References
-
-The following plugin documentation covers configuration properties that are not listed above:
-
-- https://apache.github.io/grails-spring-security/snapshot/core-plugin/guide/index.html#_configuration_properties[Spring Security Core Configuration Properties]
-- https://wondrify.github.io/asset-pipeline/[Asset Pipeline Configuration Properties]
-
diff --git a/grails-forge/gradle.properties b/grails-forge/gradle.properties
index efd425e886..1ec25ed1a7 100644
--- a/grails-forge/gradle.properties
+++ b/grails-forge/gradle.properties
@@ -24,7 +24,7 @@ title=Grails Application Forge
projectDesc=Generates Grails applications
# for forge build process which is a micronaut 4.x.x app with picocli
-grailsPublishGradleVersion=0.0.2
+grailsPublishGradleVersion=1.0.0-SNAPSHOT
antVersion=1.10.15
antlr4Version=4.8-1!!
asciidoctorGradleJvmVersion=4.0.5
@@ -32,7 +32,7 @@ cglibVersion=3.3.0
byteBuddyVersion=1.15.11
commonsCompressVersion=1.27.1
gradleSdkvendorPluginVersion=3.0.0
-groovyVersion=4.0.30
+groovyVersion=4.0.31
jacksonDatabindVersion=2.18.3
jakartaInjectVersion=2.0.1
# match the jansi version in grails-bom
diff --git a/grails-forge/grails-forge-analytics-postgres/build.gradle b/grails-forge/grails-forge-analytics-postgres/build.gradle
index 14864feb0b..93b0d4b692 100644
--- a/grails-forge/grails-forge-analytics-postgres/build.gradle
+++ b/grails-forge/grails-forge-analytics-postgres/build.gradle
@@ -40,7 +40,7 @@ dependencies {
runtimeOnly "ch.qos.logback:logback-classic:$logbackClassicVersion"
runtimeOnly 'io.micronaut:micronaut-jackson-databind'
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
+ testCompileOnly 'io.micronaut:micronaut-inject-groovy'
testImplementation "ch.qos.logback:logback-classic:$logbackClassicVersion"
testImplementation 'io.micronaut:micronaut-http-client'
diff --git a/grails-forge/grails-forge-api/build.gradle b/grails-forge/grails-forge-api/build.gradle
index 3af4420ef5..3a1e1ff2c4 100644
--- a/grails-forge/grails-forge-api/build.gradle
+++ b/grails-forge/grails-forge-api/build.gradle
@@ -60,11 +60,7 @@ dependencies {
testImplementation 'io.micronaut.test:micronaut-test-spock'
testRuntimeOnly 'io.micronaut:micronaut-jackson-databind'
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
-
- if (project.hasProperty('micronautVersion')) {
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
- }
+ testCompileOnly 'io.micronaut:micronaut-inject-groovy'
testImplementation "org.apache.groovy:groovy:$groovyVersion"
testImplementation "org.spockframework:spock-core:$spockVersion", {
diff --git a/grails-forge/grails-forge-cli/build.gradle b/grails-forge/grails-forge-cli/build.gradle
index 48d11c0cf3..59317c0a80 100644
--- a/grails-forge/grails-forge-cli/build.gradle
+++ b/grails-forge/grails-forge-cli/build.gradle
@@ -98,9 +98,7 @@ dependencies {
testImplementation 'io.micronaut.picocli:micronaut-picocli'
testImplementation "org.reflections:reflections:$reflectionsVersion"
testImplementation 'org.testcontainers:spock'
- if (project.hasProperty('micronautVersion')) {
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
- }
+ testCompileOnly 'io.micronaut:micronaut-inject-groovy'
testImplementation "org.apache.groovy:groovy:$groovyVersion"
testImplementation "org.spockframework:spock-core:$spockVersion", {
diff --git a/grails-forge/grails-forge-core/build.gradle b/grails-forge/grails-forge-core/build.gradle
index dcd03b7893..5e8a83be15 100644
--- a/grails-forge/grails-forge-core/build.gradle
+++ b/grails-forge/grails-forge-core/build.gradle
@@ -65,9 +65,7 @@ dependencies {
testImplementation 'org.apache.groovy:groovy-yaml'
- if (project.hasProperty('micronautVersion')) {
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
- }
+ testCompileOnly 'io.micronaut:micronaut-inject-groovy'
testImplementation "org.apache.groovy:groovy:$groovyVersion"
testImplementation "org.spockframework:spock-core:$spockVersion", {
diff --git a/grails-forge/grails-forge-web-netty/build.gradle b/grails-forge/grails-forge-web-netty/build.gradle
index 067765a4b9..c6f139ba0d 100644
--- a/grails-forge/grails-forge-web-netty/build.gradle
+++ b/grails-forge/grails-forge-web-netty/build.gradle
@@ -31,12 +31,12 @@ dependencies {
implementation 'io.micronaut.gcp:micronaut-gcp-http-client'
runtimeOnly 'ch.qos.logback:logback-classic'
- runtimeOnly 'io.micronaut:micronaut-jackson-databind'
+ runtimeOnly 'io.micronaut.serde:micronaut-serde-jackson'
testImplementation 'io.micronaut:micronaut-http-client'
testImplementation 'io.micronaut.test:micronaut-test-spock'
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
+ testCompileOnly 'io.micronaut:micronaut-inject-groovy'
}
tasks.named('test', Test) {
useJUnitPlatform()
diff --git a/grails-forge/test-core/build.gradle b/grails-forge/test-core/build.gradle
index 701646929f..6503a7d7cb 100644
--- a/grails-forge/test-core/build.gradle
+++ b/grails-forge/test-core/build.gradle
@@ -46,18 +46,18 @@ configurations.configureEach {
dependencies {
implementation gradleTestKit()
+ implementation platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
+ testImplementation platform("io.micronaut.platform:micronaut-platform:$micronautVersion")
generateConfig "info.picocli:picocli-codegen:$picocliVersion"
- implementation "io.micronaut:micronaut-inject-groovy:$micronautVersion"
+ implementation 'io.micronaut:micronaut-inject-groovy'
testImplementation project(':grails-forge-cli')
testImplementation project(':grails-forge-core')
testImplementation "ch.qos.logback:logback-classic:$logbackClassicVersion"
testImplementation 'io.micronaut.picocli:micronaut-picocli'
- if (project.hasProperty('micronautVersion')) {
- testCompileOnly "io.micronaut:micronaut-inject-groovy:$micronautVersion"
- }
+ testCompileOnly 'io.micronaut:micronaut-inject-groovy'
testImplementation "org.apache.groovy:groovy:$groovyVersion"
testImplementation "org.spockframework:spock-core:$spockVersion", {
diff --git a/grails-gradle/buildSrc/settings.gradle b/grails-gradle/buildSrc/settings.gradle
index 4ee22b5bcf..acb56f7bcb 100644
--- a/grails-gradle/buildSrc/settings.gradle
+++ b/grails-gradle/buildSrc/settings.gradle
@@ -17,6 +17,23 @@
* under the License.
*/
pluginManagement {
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ // Needed to resolve grails-publish snapshots that the build-logic composite
+ // build depends on while pluginManagement itself is being initialised - the
+ // org.apache.grails.buildsrc.repo plugin below cannot add this repo soon
+ // enough because Gradle must first build its classpath.
+ maven {
+ url = 'https://repository.apache.org/content/groups/snapshots'
+ content {
+ includeVersionByRegex('org[.]apache[.]grails[.]gradle.*', '.*', '.*-SNAPSHOT')
+ }
+ mavenContent {
+ snapshotsOnly()
+ }
+ }
+ }
includeBuild('../../build-logic') {
name = 'build-logic-root'
}
diff --git a/grails-gradle/settings.gradle b/grails-gradle/settings.gradle
index 6cc11fe99a..77b18e620e 100644
--- a/grails-gradle/settings.gradle
+++ b/grails-gradle/settings.gradle
@@ -19,6 +19,23 @@
import org.gradle.api.initialization.resolve.RepositoriesMode
pluginManagement {
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ // Needed to resolve grails-publish snapshots that the build-logic composite
+ // build depends on while pluginManagement itself is being initialised - the
+ // org.apache.grails.buildsrc.repo plugin below cannot add this repo soon
+ // enough because Gradle must first build its classpath.
+ maven {
+ url = 'https://repository.apache.org/content/groups/snapshots'
+ content {
+ includeVersionByRegex('org[.]apache[.]grails[.]gradle.*', '.*', '.*-SNAPSHOT')
+ }
+ mavenContent {
+ snapshotsOnly()
+ }
+ }
+ }
includeBuild('../build-logic') {
name = 'build-logic-root'
}
diff --git a/grails-test-examples/micronaut/build.gradle b/grails-test-examples/micronaut/build.gradle
index e8fb8045ff..005adc197a 100644
--- a/grails-test-examples/micronaut/build.gradle
+++ b/grails-test-examples/micronaut/build.gradle
@@ -38,10 +38,11 @@ apply plugin: 'org.apache.grails.gradle.grails-gsp'
dependencies {
implementation enforcedPlatform(project(':grails-bom'))
+ implementation platform("io.micronaut.platform:micronaut-platform:$micronautPlatformVersion")
- implementation "io.micronaut:micronaut-http-client:$micronautHttpClientVersion"
- implementation "io.micronaut:micronaut-retry:$micronautHttpClientVersion"
- implementation "io.micronaut.serde:micronaut-serde-jackson:$micronautSerdeJacksonVersion"
+ implementation 'io.micronaut:micronaut-http-client'
+ implementation 'io.micronaut:micronaut-retry'
+ implementation 'io.micronaut.serde:micronaut-serde-jackson'
implementation 'org.apache.grails:grails-dependencies-starter-web'
implementation 'org.apache.grails:grails-micronaut'
implementation 'org.apache.grails:grails-scaffolding'
diff --git a/settings.gradle b/settings.gradle
index 1207db101a..f11ede1e51 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -20,6 +20,23 @@ import org.apache.tools.ant.DirectoryScanner
import org.gradle.api.initialization.resolve.RepositoriesMode
pluginManagement {
+ repositories {
+ mavenCentral()
+ gradlePluginPortal()
+ // Needed to resolve grails-publish snapshots that the build-logic composite
+ // build depends on while pluginManagement itself is being initialised - the
+ // org.apache.grails.buildsrc.repo plugin below cannot add this repo soon
+ // enough because Gradle must first build its classpath.
+ maven {
+ url = 'https://repository.apache.org/content/groups/snapshots'
+ content {
+ includeVersionByRegex('org[.]apache[.]grails[.]gradle.*', '.*', '.*-SNAPSHOT')
+ }
+ mavenContent {
+ snapshotsOnly()
+ }
+ }
+ }
includeBuild('./grails-gradle') {
name = 'grails-gradle'
}