Download - Grails 3.0 Preview
© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Grails 3.0 PreviewBy 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.4What’s new?
2.4
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.02.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
Q & AGrails 2.4
2.4
The FutureGrails 3.0
3.0
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.03.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.03.0
Spring IO Platform Reprise
25
Jobs, Steps, Ingestion, Export, Controllers, REST, Channels, Adapters,
WEBINTEGRATION 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 m
ain
Gradle B
uild
Forked Grails Runtime
test-app
shellrun-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
Demo Grails 3.0 Gradle
3.0
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 }
Demo Grails 3.0 Micro Services
3.0
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' } }
Simplification• Removed
– UrlMappingsFilter – GrailsDispatcherServlet – SimpleGrailsController – Sitemesh Filter
38
Old Grails 2.x Flow
39
UrlMappingsFilterGrailsPageFilter
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
Q & AGrails 3.0
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