Share
Embed
Grails 3 Preview
Talk by Graeme Rocher on the future of the Grails framework and upcoming 3.0 version
graemerocher
September 09, 2014
Transcript
49 slides
-
© 2014 SpringOne 2GX. All rights reserved. Do not distribute
without permission. Grails 3.0 Preview By Graeme Rocher -
Agenda § State of Nation § What’s planned for Grails
2.4? § What’s planned for Grails 3.0? § Summary / Q & A -
State of Nation § Grails 2.4.3 most recent version §
Grails 2.3.x line at 2.3.9 § Hundreds of bugs fixed in the last 3 months § More than 1,100 plugins now for Grails -
Grails 2.4 • Spring 4.0 Upgrade • Java 8 Support
• Groovy 2.3 Upgrade • Improved @CompileStatic Support • Asset Pipeline Plugin • Moduralization of Codebase • Hibernate Goodies • GORM & GSP Standalone 5 3.0 2.4 -
Spring 4.0 / 4.1 • Native GroovyBeanDefinitionReader (ported from BeanBuilder)
– https://spring.io/blog/2014/03/03/groovy- bean-configuration-in-spring-framework-4 • Spring Web Socket – http://grails.org/plugin/spring-websocket 6 -
Groovy 2.3 • Traits • Java 8 • Implicit closure
coercion • Lots more! • http://docs.codehaus.org/ display/GROOVY/Groovy +2.3+release+notes 7 -
Other Notable Updates • Java 8 Support • Hibernate 4.3.5
now default • AspectJ 1.8 with Java 8 support • Eclipse Aether 1.0.0 • Fewer Overall Dependencies 8 -
Modularization 9 grails-web grails-web-mvc grails-web-sitemesh grails-web-gsp grails-web-jsp grails-web-servlet grails-web-common grails-core
grails-encoder grails-project-api grails-validation -
Asset Pipeline Plugin • Resources replaced with Asset Pipeline –
https://github.com/bertramdev/asset- pipeline/wiki/Why-asset-pipeline-over- grails-resources-plugin • Full documentation – http://bertramdev.github.io/asset- pipeline/ • Many thanks to David Estes! 10 -
Standalone • GORM for Hibernate 4 in Spring Boot –
https://spring.io/guides/gs/accessing-data-gorm/ • GORM for MongoDB in Spring Boot – https://spring.io/guides/gs/accessing-data-gorm-mongodb/ • GSP standalone – https://github.com/grails/grails-boot/tree/master/sample-apps/ gsp 11 -
@GrailsCompileStatic • Grails-aware version of Groovy’s @CompileStatic 12 import grails.compiler.*
! @GrailsCompileStatic class BookController { … } -
Maven-style Dependency Management • Use management block to declare managed
dependencies 13 ! management { dependency "commons-‐logging:commons-‐ logging:1.1.3" } -
Hibernate Subqueries • Perform nested “in” or “notIn” sub queries
that span domain classes using where queries: 14 def employees = Employee.where { region.continent in ['APAC', "EMEA"] }.id() ! def results = Sale.where { employee in employees && total > 50000 }.employee.list() -
Hibernate Correlated Subqueries • Declare aliases using “def” for cross
query references: 15 def query = Employee.where { def em1 = Employee exists Sale.where { def s1 = Sale def em2 = employee return em2.id == em1.id }.id() } def results = query.list() -
Hibernate Column Readers/Writers • Implement custom column readers and writers
to transform data when written or read from the database. 16 class Name { String title static mapping = { title write:'UPPER(?)', read:'REPEAT(title, 2)' } } -
Hibernate 4 in Unit Tests (Coming Soon) • Test Hibernate
4 interaction in unit tests 17 import grails.test.mixin.hibernate.* ! @TestMixin(HibernateTestMixin) class PersonSpec extends Specification{ void setupSpec() { hibernateDomain([Person]) } … } -
GORM for MongoDB 3.0 • Support for MongoDB 2.6 •
GeoJSON type support • Maps of entities • Full Text Search • Projections using Aggregations • Size queries (sizeEq, sizeLt etc.) • Spring Boot – https://spring.io/guides/gs/accessing- data-gorm-mongodb/ 18 -
New Maven Plugin 2.4.3 • Upgraded to Maven 3.1+ •
Rewritten to use Aether for dependency resolution as per recommendations • Can now be used with multiple versions of Grails: 19 <configuration> <grailsVersion>2.3.8</grailsVersion> </configuration> -
Grails 2.4.x TODOs • Grails 2.4.4 - Out Soon •
Spring Security Core 2.0 GA • Spring Web Flow Plugin Update • Bug Fixes 20 2.4 -
Grails 3.0: Goals • Embrace Gradle • Abstract Packaging /
Deployment • Reach outside the Servlet Container • App Profiles: Netty, Servlet, Batch, Hadoop • Deployment with run-app / runnable JARs • Extend the reach of Grails 23 3.0 3.0 -
Grails 3.0: Goals • Build on Spring Boot • Plugin
System & Events • Support Multi Project Builds • Support Micro Services • Remove Bloat • Reduce Dependencies 24 3.0 3.0 -
Spring IO Platform Reprise 25 Jobs, Steps, Ingestion, Export, Controllers,
REST, Channels, Adapters, WEB INTEGRATION BATCH BIG DATA SPRING CORE FRAMEWOR SECURIT GROOV REACTO DATA RELATIONA NON- BOOT Bootable, Minimal, Ops-Ready GRAILS XD IO IO -
Spring IO Platform 26 Grails Spring IO Platform Spring XD
Spring Foundation Apps 3rd Party Dependencies Spring Boot -
Spring IO & Grails • What does Spring IO bring
to Grails? – Standardised dependency management – Published BOMs for use with Maven & Gradle – Foundational libraries – See more http://docs.spring.io/platform/docs/current/ reference/htmlsingle/ 27 dependencies { compile 'commons-‐lang:commons-‐lang' } -
Gradle • Deprecate existing build system • Replace with Gradle
build • Easier now everything is forked in 2.3.x • All the flexibility of a powerful build system • Separate build plugins can provide Gradle extensions 28 -
Plugin Delineation 29 Grails.sh Static void main Gradle Build Forked
Grails Runtime test-app shell run-app console Codegen Plugins Build Time Plugins Runtime Plugins -
Gradle • Allow Micro or Monolith Applications • Multi-Project Plugin
Architectures • Run individual sub projects • Or run as a whole 30 -
Spring Boot • Grails 3.0 to be built on Spring
Boot • Boot to handle • Embedded servers • Runnable JARs • WAR packaging • Scripting / Micro Services 32 -
Why Spring Boot? • Handles Fat JAR and embedding •
Already supports different runtimes • Includes monitoring and health checks • Grails can take advantage of Boot auto configuration 33 -
Boot Powered Micro Services 34 @Grab("com.h2database:h2:1.3.173") import grails.persistence.*
! @Entity @Resource(uri='/books') class Book { String title } -
Deprecations / Removals • Servlet 2.5 support (no web.xml) •
Gant & Current Build System • GDoc - Replaced by AsciiDoctor • Integration Tests - Replaced by more Mixins • Converters / Codecs plugins - Replaced by Groovy extensions • Filters - Replaced by new mechanism 36 -
Servlet 3.0 only and no web.xml • Thanks to Spring
Boot, new servlets and filters can just be Spring beans 37 ! def doWithSpring = { characterEncodingFilter( CharacterEncodingFilter) { encoding ='utf-‐8' } } -
Old Grails 2.x Flow 39 UrlMappingsFilter GrailsPageFilter Decorate Request Forward
Request GrailsDispatherServlet Delegate Request GrailsController -
Grails 3.0 Flow • GrailsDispatcherSerlvet 50 lines of code in
3.x, but 545 lines in 2.x 40 DispatcherServlet Delegate Request GrailsController -
Benefits of Simplification • Less code to maintain • Better
performance • Better integration with Spring • Fewer dependencies • commons-fileupload gone • No internal forwarding 41 -
Evolution of Metaprogramming 42 Runtime Metaprogramming (ExpandoMetaClass) Compile time Metaprogramming
(AST Transforms) Traits & Transforms Grails 1.x Grails 2.x Grails 3.x -
Grails 3.0 & Groovy Traits • Most logic previously added
via AST transforms will now be added by Traits – (Cases not possible as Trait done with transforms) 43 trait Controller { … def withFormat(Closure callable) { … } } -
Application Profiles • Each profile will have distinct plugins, runtimes
and packaging (JAR, WAR etc.) 44 ! $ grails create-‐app myapp -‐-‐profile=netty $ cd myapp $ grails package $ java -‐jar target/myapp.jar ! -
Application Profiles • Extensible profiles with an API exposing structure
• Profile specific commands (run, package, test) • Profile specific plugins • Profile specific project templates and file templates (code generators) backed by Git • Community maintained profiles and core profiles 45 -
Profile Repository • All Profiles managed by git • Profiles
checked out locally and periodically updated • Profiles wrap code generation infrastructure 46 $ grails create-‐controller foo ! Profile .getCurrentProfile() .getCommand('create-‐controller') .execute( 'foo' ) -
Grails 3.0: Challenges • Compatibility – Plugins – Build System
• Modularization – Servlet API independence – Refactoring 47 3.0 -
Stay Connected. ! ! ! ! Web: grails.org StackOverflow: http://stackoverflow.com/tags/grails
Twitter: twitter.com/grailsframework LinkedIn: http://linkedin.com/groups/Grails-User-Group-39757 Google+: https://plus.google.com/communities/ 109558563916416343008