I have had very little time to work on this, but clearly think it is important.
Circling back to flags, since I was very confused. cliAutoProvision came from https://github.com/apache/grails-core/pull/15948 and defaults to true which means auto-adding grails-core-cli, grails-console, and discovered *-cli companions legacyCommandSupport was also requested at some point and gpt-5.6 didn't like it. But it will be added nested under cliAutoProvision so, cliAutoProvision wins and legacyCommandSupport is only checked if cliAutoProvision=true. I think legacyCommandSupport should default to true. I am sure there will be disagreement, but if we always agreed, we would be redundant. The flag for cliAutoProvision was already there, I was not aware of it, but my PR had no intention of touching the split CLI side of this. My initial intention was they would both work by default, no flags, since I did not know about the flag, but having flags is fine. The Legacy PR, until early AM today, ended up tied to cliAutoProvision, but now will be based on cliAutoProvision and legacyCommandSupport. The Split CLI Plugin commands will work exactly as they did in https://github.com/apache/grails-core/pull/15948. legacyCommandSupport is just a new flag for Grails 7 Plugin Commands working in Grails 8. https://github.com/apache/grails-core/issues/16035 - there appears to be some additional work, if we want plugin CLI-only script-commands excluded from plugin's normal runtime JARs, like was done for Grails commands (ApplicationCommand implementations). James On 2026/07/21 22:33:36 James Fredley wrote: > I don't think we are that far apart and I am willing to remove my -1 vote on > M4. > > Once https://github.com/apache/grails-core/pull/16011 is refreshed in a few > hours, we will likely be down to opt-in vs opt-out. > > https://github.com/apache/grails-core/pull/16011 feels closest to > https://github.com/apache/grails-core/pull/15409#issuecomment-4051635625, > although it appears we did remove those for 8.0.x > > GRAILS 8 - BREAKING CHANGES THAT HAVE A FLAG > ============================================ > > Two kinds: > > OPT-OUT OF THE BREAK > Grails 8 does the NEW thing by default. > You set a flag if you still want the OLD (Grails 7) behavior. > > OPT-IN TO THE BREAK / NEW THING > Grails 8 keeps the conservative or off path by default. > You set a flag if you want the NEW thing (or a temporary old stack). > > 1) OPT-OUT OF THE BREAK > (new default ON - set flag to restore Grails 7) > -------------------------------------------------- > > GORM unconstrained domain properties are nullable > Flag: grails.gorm.default.nullable > 8.0: true (nullable - NEW) > Old: grails.gorm.default.nullable = false > Also: grails.gorm.default.constraints = { '*'(nullable: false) } > > Accept header honored for all clients (including browsers) > Flag: grails.mime.disable.accept.header.userAgents > 8.0: unset (honor Accept - NEW) > Old: set back to Gecko, WebKit, Presto, Trident > > MIME types supplied by the framework > Flag: grails.mime.types (full block still REPLACES defaults) > Flag: grails.mime.mergeDefaults > 8.0: framework defaults when you declare nothing > Note: mergeDefaults=true is optional if you want to ADD types > without re-listing everything > > Jackson 3 is the default mapper stack > Flag: spring.jackson.use-jackson2-defaults > 8.0: Jackson 3 / JsonMapper (NEW) > Old: spring.jackson.use-jackson2-defaults = true > (temporary migration aid for Jackson 2-style defaults) > > Hibernate native query date/time types (java.time) > Flag: hibernate.query.native.prefer_jdbc_datetime_types > 8.0: java.time types (NEW) > Old: prefer_jdbc_datetime_types = true > > Hibernate 7 Oracle float mapping > Flag: hibernate.dialect.oracle.use_binary_floats > Old: use_binary_floats = false > > Hibernate 7 array JDBC type > Flag: hibernate.type.preferred_array_jdbc_type > Old: preferred_array_jdbc_type = VARBINARY > > DevTools live reload off by default (Boot 4) > Flag: spring.devtools.livereload.enabled > 8.0: false (NEW Boot default) > Old: true under development if you still want it > > Groovy/Java parameter names preserved for compilation > Flag: grails { preserveParameterNames = ... } > 8.0: true (NEW) > Old: preserveParameterNames = false > > Boot defaultViewResolver removed for Grails web apps > Flag: grails.web.removeDefaultViewResolverBean > 8.0: removed (effective true) > Old: removeDefaultViewResolverBean = false > Note: spring.gsp.removeDefaultViewResolverBean still honored, > deprecated > > Boot welcome-page mapping removed > Flag: grails.web.removeWelcomePageMapping > 8.0: removed > Old: removeWelcomePageMapping = false > > Boot catch-all static resource mappings off > Flag: spring.web.resources.add-mappings > 8.0: false (NEW for Grails) > Old: add-mappings = true > > Form content filter on PUT/PATCH/DELETE > Flag: spring.mvc.formcontent.filter.enabled > 8.0: true (NEW; DELETE included) > Old: enabled = false > > Auto-applied Grails BOM (replaces Spring DM plugin) > Flag: grails.bom / deprecated grails.springDependencyManagement > 8.0: grails-bom applied automatically > Old: bom = null > or springDependencyManagement = false > > TagLib closure deprecation warning > Flag: grails.taglib.warnDeprecatedClosures > 8.0: warn (default) > Old: warnDeprecatedClosures = false > > Undertow max HTTP post size hardened > Flag: server.undertow.max-http-post-size > 8.0: 2MB > Old: -1 for unlimited > > > 2) OPT-IN TO THE NEW THING > (default OFF or conservative - set flag to get new behavior) > -------------------------------------------------------------- > > Groovy invokedynamic > Flag: grails { indy = true } > Default: false > > Compile controllers/services/taglibs with @GrailsCompileStatic > Flag: grails { compileStatic { controllers/services/tagLibs = true } } > or compileStatic { all = true } > Default: all false > Note: per-class @CompileDynamic still wins > > Hibernate 7 (instead of default Hibernate 5) > Flag: dependency / BOM choice (grails-hibernate7, hibernate7 BOMs) > Default: Hibernate 5 > > Micronaut integration > Flag: add grails-micronaut + Micronaut-compatible BOM as > enforcedPlatform; JDK 25 required if used > Default: off > > MIME merge onto framework defaults (instead of replace) > Flag: grails.mime.mergeDefaults = true > Default: false > > James > > On 2026/07/21 20:19:39 James Daugherty wrote: > > I've made my case in the discussion thread I opened, and the shift being > > asked here is the opposite of every other major change we've done. Its > > also arbitrary compared to past breaking changes. The inconsistency is > > frustrating & tantamount to: we effectively can't ever deprecate an API in > > the future because it breaks plugins. This needs resolved before we proceed > > as it goes against our major release policy on breaking changes. > > > > There's not sufficient communication happening to resolve this so I think > > we should cancel the vote until there's time to discuss or these issues can > > be worked through. > > > > On 2026/07/21 19:58:23 James Fredley wrote: > > > M4 target was 7/22, it being early without > > > https://lists.apache.org/thread/nq8f7yqtfp13wjbckkjxt1y82lrwkjq2 address, > > > really caught me off guard. > > > > > > 2. Release 8.0.0-M4 by Wednesday (July 22) next week > > > - would include the undertow support + reproducible fixes + cli split > > > - last release of new features or breaking changes > > > > > > If we are committed to getting some form of Grails 7 plugin in Grails 8 > > > backwards compatibility in RC1 or M5, I will be willing to change my vote > > > to 0. > > > > > > https://github.com/apache/grails-core/pull/16011 - is being updated right > > > now to hopefully somewhere closer to a comprise. > > > > > > I think the number of hours and days of week we have worked on this as > > > volunteers was historically unsustainable and is not something I have > > > been able to maintain this year and will not be doing going forward. 72 > > > hour turn around is the ASF expectation and that's what I will try to do. > > > Many time sooner, but I can't look at Apache Grails every day of the > > > month. > > > > > > James > > > > > > On 2026/07/21 13:29:06 James Fredley wrote: > > > > I am a -1 until we figure out a path for end users that does not > > > > require them waiting on plugins to be re-released to use plugin > > > > commands in Grails 8. Grails 7 is EOL and users have to move to Grails > > > > 8 basically upon release, let's not break their ability to use Plugin > > > > Commands from the existing already published Grails 7 plugins, if we do > > > > not have to. > > > > > > > > https://github.com/apache/grails-core/pull/15948 was merged before a > > > > path was identified and we only addressed 1 of 4 paths that provide > > > > commands. > > > > > > > > https://github.com/apache/grails-core/pull/16011 - provides a path, we > > > > can debate that path, but I am firm that it should be the default for > > > > the reason in the first paragraph. Let's not hurt the framework. > > > > > > > > James > > > > > > > > On 2026/07/21 09:35:43 Mattias Reichel wrote: > > > > > Hi Everyone, > > > > > I am happy to start the VOTE thread to release Apache Grails 8.0.0-M4! > > > > > > > > > > Release notes for the release are here: > > > > > https://github.com/apache/grails-core/releases/tag/v8.0.0-M4 > > > > > > > > > > The tag for this release is: > > > > > https://github.com/apache/grails-core/releases/tag/v8.0.0-M4 > > > > > > > > > > Tag commit id: cb35496301c5423a557034394ce814dc1e1a36fa > > > > > > > > > > The artifacts to be voted on are located as follows (r86111): > > > > > Source release: > > > > > https://dist.apache.org/repos/dist/dev/grails/core/8.0.0-M4/sources > > > > > Binary distributions: > > > > > https://dist.apache.org/repos/dist/dev/grails/core/8.0.0-M4/distribution > > > > > > > > > > Release artifacts are signed with a key from the following file: > > > > > https://dist.apache.org/repos/dist/release/grails/KEYS > > > > > > > > > > Please vote on releasing this package as: Apache Grails 8.0.0-M4. > > > > > > > > > > Reminder on ASF release approval requirements for PMC members: > > > > > https://www.apache.org/legal/release-policy.html#release-approval > > > > > > > > > > Hints on validating checksums/signatures (but replace md5sum with > > > > > sha512sum): > > > > > https://www.apache.org/info/verification.html > > > > > > > > > > Details of our release process are documented at: > > > > > https://github.com/apache/grails-core/blob/HEAD/RELEASE.md > > > > > > > > > > As a reminder, most of our tools support an env `GRAILS_REPO_URL` so > > > > > that the tools can work with staged artefacts. Set it to the staging > > > > > repo like this: `export > > > > > GRAILS_REPO_URL=https://repository.apache.org/content/groups/staging` > > > > > > > > > > The vote is open for a minimum of 72 hours and passes if a majority > > > > > of at least > > > > > three +1 PMC votes are cast. > > > > > > > > > > [ ] +1 Release Apache Grails 8.0.0-M4 > > > > > [ ] 0 I don't have a strong opinion about this, but I assume it's ok > > > > > [ ] -1 Do not release Apache Grails 8.0.0-M4 because... > > > > > > > > > > Here is my vote: > > > > > +1 (binding) > > > > > > > > > > > > > > >
