Hi all,

I wanted to give both the Groovy and Grails communities a clear status update and a call to action.

Current status

Grails 9 is now building and publishing snapshots against Groovy 6. The key merge landed here:

https://github.com/apache/grails-core/commit/cd062bf7c6051bff0622118367c8d2ddf23955ec

Snapshots are available (see the recent announcement on the lists). We are intentionally staying close to the Groovy 6 betas so that Grails remains one of the largest real-world test cases for the language.

Groovy 6 is already at beta-2. It may need one more beta or could move to RC1 relatively soon. That means the window for any remaining changes we need, for Grails 9, in Groovy 6 itself is closing.

Timeline goal

The target is to have Apache Groovy 6.0.0 out before Community Over Code in Glasgow (11–14 October). We then want Grails 9.0.0 ready very shortly afterward — ideally in milestone or RC form around the conference, with a full 9.0.0 release based on Groovy 6 within a week or two of the Groovy GA.

Grails and Groovy are sister projects under the ASF. Grails is one of the most widely used applications of the language and a comprehensive integration test suite (the monorepo now contains essentially the full kitchen sink). Historically we have been forced into extreme or breaking workarounds well after Groovy 4 and 5 reached GA. This time we want to surface and resolve anything that actually needs to change in Groovy 6 before 6.0.0 ships.

Workarounds and remaining items

All of the compatibility adjustments we had to make are tracked and documented:

- https://github.com/apache/grails-core/issues/16157 (Groovy 6 compatibility changes required in Grails, and when each can be removed)

- https://github.com/apache/grails-core/issues/16161 (Micronaut island currently excluded)

If anyone cares about a specific item listed in those issues and believes it should be fixed or improved on the Groovy side rather than adjusted to breaking changes in Grails, the path is:

1. Create a ticket in the Groovy JIRA.
2. Open a pull request against a fork of the Apache Groovy repository.

I am personally only going to prioritize work that impacts the end application that users actually run. Framework-internal or optional-integration items that do not affect that surface are lower priority for me personally.

Micronaut integration

The Micronaut island is currently disabled in the Grails build so that we can publish usable Groovy 6 snapshots. The root cause is the usual dense compatibility matrix (Grails + Spring + Spring Framework + Micronaut + Java version + Groovy version). Someone who uses the Micronaut integration and wants it working on Grails 9 will need to invest the time to sort it out.

There is already movement toward extracting that code into its own repository under the Apache organization (grails-micronaut). Once that happens it will no longer be part of the single Grails monorepo build and can choose its own Groovy and Java versions independently. That extraction should make the work easier for whoever picks it up. I do not plan to spend time on it myself.

Invokedynamic / call-site caching

I have opened an initial pull request to enable Indy by default on Grails 9:

https://github.com/apache/grails-core/pull/16165

In Groovy 6 the classic (non-invokedynamic) call-site classes under `org.codehaus.groovy.runtime.callsite` have been moved out of core into the optional `groovy-callsite` module (GROOVY-12185). Core now uses invokedynamic by default (as it has since Groovy 4). The classic types are deliberately not marked `@Deprecated` in the current betas so that downstream projects such as Grails can validate Indy performance without noise. Javadoc already indicates they are planned for deprecation and eventual removal in a future release; formal deprecation may still appear before 6.0.0 GA depending on beta feedback.

Micro-benchmarks look favorable for Indy. Full application HTTP benchmarks on Grails are usually comparable and sometimes slightly slower, which tells us there are still places in the Grails codebase that are not using Groovy in the most performant way under the Indy path. Those are the kinds of adjustments I intend to focus on.

What I am asking for

- If you see something in the Grails workarounds that really belongs as a change (or clarification) in Groovy 6, please raise it in the Groovy JIRA and, if you can, submit a PR while we still have beta runway. - Volunteers who care about the Micronaut integration are welcome to take that on (including moving to its own repository under Apache (grails-micronaut). - Sister projects and downstream consumers should start tracking the Groovy 6 betas in parallel so we are not discovering major issues after GA.

Everything required for the current Grails 9 + Groovy 6 combination is already visible in the grails-core repository. The more we can clear before Groovy 6.0.0, the cleaner the GA experience will be for both communities.

Thanks for the continued collaboration.

James Fredley
Vice President & PMC Chair, Apache Grails

Reply via email to