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)
> > > > 
> > > 
> > 
> 

Reply via email to