Grails 4 is the next iteration of the Grails web framework. Grails is a developer friendly framework built on top of Spring-boot, Groovy, and now Micronaut.
Status
Grails 4 is released!
I've ported a non-trivial app from Grails 3.3.9 to 4.0.0 as well as updated to JDK11. The total effort was only a few hours - welcome news to many who are upgrading.
Initial app startup time is about 15 seconds - 2x faster than the same app in Grails 3.3.9.
Reloading has changed and there are a few options. The default option is from spring-dev-tools
- fast restart. This restarts your app faster then a normal restart, but still can be extremely slow for large projects.
Hot reloading options are JRebel - a paid option that works for JDK8/11 - or spring-loaded
though it only supports JDK8 and is no longer maintained. Instructions for spring-loaded
IDE Support all works in Grails 4 (same as 3.3.9) - IntelliJ is still my recommended IDE for any Grails, Groovy, or Java developer.
Updates
There are tons of updates to Grails 4 and the frameworks it builds upon. Here's a list of updates and release notes you should review if you're updating your apps.
Install
SDKMan makes installing and managing a JVM and many frameworks a snap:
sdk install java 11.0.2-open
sdk install grails 4.0.3
Plugins
Plugins are an essential part of the Grails developer experience. Luckily many plugins that worked in Grails 3 work out of the box in Grails 4 - or with only slight modifications due.
Working Plugins
-
Spring-Security-Core
4.0.0
- New delegation password strategy:
- https://www.baeldung.com/spring-security-5-password-storage
- If you already used bcrypt can do it all at once too:
UPDATE my_users SET password = CONCAT('{bcrypt}', password);
-
Spring-session-redis (boot starter)
- Updated dependencies
compile "org.springframework.boot:spring-boot-starter-data-redis"
compile "org.springframework.session:spring-session-data-redis"
- Spring-Websocket
compile "org.grails.plugins:grails-spring-websocket:2.5.0.RC1"
- Grails-Quartz
buildscript {
dependencies {
classpath 'org.grails.plugins:quartz:2.0.13' // Needed to compile *Job classes
}
}
dependencies {
compile 'org.grails.plugins:quartz:2.0.13'
compile 'org.quartz-scheduler:quartz:2.2.1' // Is not pulled in by default
}
Database Migration Plugin
3.1.0.RC1
Asset-Pipeline
3.1.0
-
External Config
- Works - use RC1+
compile 'org.grails.plugins:external-config:2.0.0'
-
Spring Security UI
-
Schwartz Plugin
2.0.0.RC1
-
Grails Cache Plugin
5.0.0.RC1
-
Spring Security OAuth2 Provider
4.0.0-RC1
Sentry
-
Grails Mail
3.0.0
Not working
- Audit-Logging Plugin
Resolved
-
Asset Pipeline Handlebars issue:- Needed to update to change
//= require handlebars/handlebars.js
to//= require handlebars-runtime
- Needed to update to change
2019-01-13 16:59:42.280 WARN --- [nio-8080-exec-1] asset.pipeline.DirectiveProcessor : Unable to Locate Asset: /handlebars/handlebars.js
Warning: Nashorn engine is planned to be removed from a future JDK release
-
Gson Views- Resolved.
- Unable to render json with simple objects (just get
null
response) - Domain classes dont render:
Model variable [someDomain] of with value [Description] type [com.x.SomeDomain] is not of the correct type [com.x.SomeDomain]. Stacktrace follows:
- Opened Issue https://github.com/grails/grails-views/issues/202
Other notes Notes
-
Hot reload for JDK8 only
-
spring-loaded
supports only up to JDK8. - Fast reload takes about 5-6 seconds (hopefully can improve)
-
-
org.grails:grails-datastore-rest-client
no longer maintained- Use a different http client such as
-
micronaut-http-client
,http-builder-ng
,feign
,okhttp
, etc
-
- Or use the old unmaintained GORM 6 version:
- Use a different http client such as
compile('org.grails:grails-datastore-rest-client:6.1.9.RELEASE'){
exclude group:'org.grails', module:'grails-plugin-converters'
}
-
Groovy 2.5.x
- Doesn't include the Date Utils helpers by default - need to add them in.
compile 'org.codehaus.groovy:groovy-dateutil'
- (Should just update to
java.time.*
) - JDK 11 Warnings (expected)
- https://dev.to/erichelgeson/removing-illegal-reflective-access-warnings-in-grails-4-393o
-
.pop()
& collections behavior changed to align with Java - https://issues.apache.org/jira/browse/GROOVY-9388
-
Dependencies changes (Gradle 5.1)
- An issue where dependencies like
com.jameskleeh:excel-builder
- don't pull in their dependencies (eg: Apache POI)
- An issue where dependencies like
Hibernate Deprecated warnings (expected)
Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead
// and
HHH020100: The Ehcache second-level cache provider for Hibernate is deprecated. See https://hibernate.atlassian.net/browse/HHH-12441 for details.
- Hide them in
logback.groovy
logger('org.hibernate.orm.deprecation', ERROR, ['STDOUT'], false)
Notes or tips of your own?
Join us over on the grails-community slack channel or comment below!
Latest comments (10)
Best information about upgrade to Grails 4
Great post!
@eric can you please help me to underdstand how to work with the resultTranformer() in UTC , its giving error with respect to criteria.
groovy.lang.MissingMethodException: No signature of method: grails.gorm.CriteriaBuilder.resultTransformer() is applicable for argument types: (org.hibernate.transform.AliasToEntityMapResultTransformer) values: [org.hibernate.transform.AliasToEntityMapResultTransformer@3213c334]
at org.grails.datastore.gorm.query.criteria.AbstractCriteriaBuilder.invokeMethod(AbstractCriteriaBuilder.java:302)
Stackoverflow may be a better place to ask questions - i'm not sure what your question has to do with this post.
Hello. Is there a way to avoid running Bootstrap again after changing a class? my problem is that I have a lot of initialization processes there. thanks
Hi Eric
We need to update grail 2.3.8 to latest 4.
What is the best approach to do that?
is any think you can help me on this ?
Thanks
vijay Kanwar
Hi Vijay - I would start by creating a fresh Grails 4 app and pulling over a few parts of the old app at a time - fixing errors as you go. If you find anything that would be useful here - let me know! Also jump on the Grails Slack channel if you have questions.
Great notes, wanted to add some of mine:
Spring Security CAS will now require this dependency:
compile group: 'org.springframework.security', name: 'spring-security-cas', version: '5.1.5.RELEASE'
An older plugin of mine was using the older hystrix library which isn't supported in spring boot 2 so:
Change:
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-hystrix', version: '*'
to
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-hystrix', version: '2.1.2.RELEASE'
Grails Cache Plugin: Not working, yet. github.com/grails-plugins/grails-c...
Grails Schwartz Plugin: Not working, yet. github.com/agileorbit/grails-schwa...
Audit-Logging Plugin: Not working, yet. WIP. github.com/robertoschwald/grails-a...
Works:
Db-Migration Plugin: 3.1.0.RC1
Asset-Pipeline-Grails: 3.0.10
Updated with this list, thanks!