Grails in the Java Enterprise
Peter Ledbrook / VMware
Tuesday, 1 November 11
What is Grails?
Rapid Web Application Development Framework• for the JVM• with first-class Java integration
Inspired by Ruby on Rails, Django and others• Convention over Configuration• Don’t Repeat Yourself (DRY)
2
Tuesday, 1 November 11
Grails
What is Grails?
3
Build
Web MVC GSP (Views)
GORM(Data Access)
Doc Engine
Servlet Container
Test Support
Database I18n
Tuesday, 1 November 11
Grails
What is Grails?
4
Tuesday, 1 November 11
What is Grails?
5
Web ControllersThe Domain Model
Business Logic Custom View Tags
Views & LayoutsLibraries (JARs)
Additional Sources
Web Resources
i18n bundles
Build Commands
Tests
Tuesday, 1 November 11
Say bye-bye to the plumbing!
6
Tuesday, 1 November 11
Demo
Demo
7
Tuesday, 1 November 11
Enterprise requirements
8
Web App
Messaging
Legacy Databases Services
JEE
Is this a problem for Grails apps?
Tuesday, 1 November 11
Integration Points
BuildDependenciesDatabaseDeploymentSpring
9
Tuesday, 1 November 11
Integration Points
BuildDependenciesDatabaseDeploymentSpring
10
Tuesday, 1 November 11
Build
11
Tuesday, 1 November 11
Build
12
Remember the Grails project structure?• add in build events and...
Can’t build natively with other build tools!
Grails Build System
Ant GradleMaven
Tuesday, 1 November 11
Ant Integration
An Ant task built in (grails.ant.GrailsTask)Template Ant build: grails integrate-with --ant
• Uses Ivy for dependency management• Not compatible with Ant 1.8
...or use ‘java’ task to call Grails command• Grails manages dependencies• Use ‘grails’ for build
13
Tuesday, 1 November 11
Maven
Maven Grails Plugin: https://github.com/grails/grails-mavenUse Maven 2 or 3 to build Grails projectsDeclare dependencies in POMWorks for both applications and plugins!Integration test framework:
https://github.com/grails/grails_maven_plugin_testing_tests
14
Tuesday, 1 November 11
Getting Started
mvn archetype-generate ...
mvn initialize
Set MAVEN_OPTS
Optional: add ‘pom true’ to dependency DSL
e.g. -Xmx256m -XX:MaxPermSize=256m
15
Tuesday, 1 November 11
Packaging Types
‘war’• Must configure execution section• Works with plugins that depend on ‘war’
‘grails-app’• Less configuration
‘grails-plugin’• For plugins!
16
Tuesday, 1 November 11
Maven & Grails Plugins
> grails release-plugin
==
> mvn deploy
17
Tuesday, 1 November 11
Maven & Grails Plugins
<dependency> <groupId>org.grails.plugins<groupId> <artifactId>hibernate</artifactId> <type>grails-plugin</type></dependency>
Either:
Use ‘mvn deploy’ or Release plugin!
18
And ‘pom: false’
Tuesday, 1 November 11
Maven & Grails Plugins
grails.project.dependency.resolution = { ... plugins { compile ":hibernate:1.3.6" } ...}
Or:
19
Tuesday, 1 November 11
Customise the Build
Create new commands in <proj>/scriptsPackage the commands in a plugin!Create <proj>/scripts/_Events.groovy
• Interact with standard build steps• Add test types• Configure embedded Tomcat
20
Tuesday, 1 November 11
What the future holds...
Grails 3.0 will probably move to Gradle• More powerful and more flexible• Standard, well documented API• Ant & Maven support
21
Tuesday, 1 November 11
Integration Points
BuildDependenciesDatabaseDeploymentSpring
22
Tuesday, 1 November 11
Dependencies are JARs
Use any Java library you like!Full support for Maven-compatible repositoriesDeclarative dependenciesPlugins can be declared the same way
23
Tuesday, 1 November 11
Dependency DSL
grails.project.dependency.resolution = { inherits "global" log "warn" repositories { grailsHome() mavenCentral() mavenRepo "http://localhost:8081/..." } ...}
24
Tuesday, 1 November 11
Dependency DSL
grails.project.dependency.resolution = { inherits "global" log "warn" ... dependencies { compile "org.tmatesoft.svnkit:svnkit:1.3.3" test "org.gmock:gmock:0.8.1" } ...}
25
Tuesday, 1 November 11
Integration Points
BuildDependenciesDatabaseDeploymentSpring
26
Tuesday, 1 November 11
‘Legacy’ Databases
Grails can create a database from your domain model......but what if you don’t own the database?
• DBA determines structure• Company conventions• Existing ‘legacy’ database
27
Tuesday, 1 November 11
class Book { ... static mapping = { table "books" title type: "books" author column: "author_ref" }}
28
No existing domain modelSchema not too far off the beaten track
Option 1: Custom ORM mapping
Tuesday, 1 November 11
Option 2: JPA annotations
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE ...><hibernate-configuration> <session-factory> <mapping class="org.ex.Book"/> <mapping class="org.ex.Author"/> ... </session-factory></hibernate-configuration>
29
Existing Java/JPA domain model
grails-app/conf/hibernate/hibernate.cfg.xml
Tuesday, 1 November 11
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE ...><hibernate-configuration> <session-factory> <mapping resource="org.ex.Book.hbm.xml"/> <mapping resource="org.ex.Author.hbm.xml"/> ... </session-factory></hibernate-configuration>
30
You have Java model + Hibernate mapping filesSchema is way off the beaten track
Option 3: Hibernate XML Mappings
grails-app/conf/hibernate/hibernate.cfg.xml
Tuesday, 1 November 11
constraints = { title blank: false, unique: true ...}
ConstraintsGiven domain class:
Then:
org.example.myapp.domain.Book
src/java/org/example/myapp/domain/BookConstraints.groovy
31
Tuesday, 1 November 11
GORM layer over JPAUse your own JPA providerUseful for cloud services that only work with JPA, not
Hibernate
32
Option 4: GORM JPA Plugin
Tuesday, 1 November 11
Option 5: Remote service back-endDon’t have to use GORMUse only controllers and services
• Grails services back onto remote services
33
Web App
Invoice Log Service ...
SOAP, RMI, HTTP Invoker, etc.
Tuesday, 1 November 11
Share your model!
34
Tuesday, 1 November 11
Database Management
35
?
Hibernate ‘update’+
Production data=
Tuesday, 1 November 11
Database Migration Plugin
36
Pre-production, Hibernate ‘update’ or ‘create-drop’
dbm-generate-changelogdbm-changelog-sync
Change domain model
dbm-gorm-diffdbm-update
Tuesday, 1 November 11
Reverse Engineering Plugin
37
class Person { String name Integer age ...}
Tuesday, 1 November 11
Database Management
38
Database Migration
http://grails.org/plugin/database-migration
Reverse Engineering
http://grails.org/plugin/database-migration
Tuesday, 1 November 11
Integration Points
BuildDependenciesDatabaseDeploymentSpring
39
Tuesday, 1 November 11
grails war
Build properties:• grails.war.copyToWebApp• grails.war.dependencies• grails.war.resources• grails.project.war.file
40
Tuesday, 1 November 11
Control of JARsgrails.project.dependency.resolution = { defaultDependenciesProvided true inherits "global" log "warn" ...}
grails war --nojars => WEB-INF/lib/<empty>
=> No Grails JARs in WEB-INF/lib
41
Tuesday, 1 November 11
Data Source
dataSource { jndiName = "java:comp/env/myDataSource"}
JNDI:
dataSource { url = System.getProperty("JDBC_STRING")}
System property:
42
Tuesday, 1 November 11
Data Source
grails.config.locations = [ "file:./${appName}-config.groovy", "classpath:${appName}-config.groovy" ]
Config.groovy:
For run-app: ./<app>-config.groovy
For Tomcat: tomcat/lib/<app>-config.groovy
43
Tuesday, 1 November 11
Integration Points
BuildDependenciesDatabaseDeploymentSpring
44
Tuesday, 1 November 11
Grails is Spring
Spring MVC under the hoodGrails provides many useful beans
• e.g. grailsApplicationDefine your own beans!
• resources.xml/groovy• In a plugin
45
Tuesday, 1 November 11
Exampleimport ...beans = { credentialMatcher(Sha1CredentialsMatcher) { storedCredentialsHexEncoded = true }
sessionFactory(ConfigurableLocalSessionFactoryBean) { dataSource = ref("dataSource") hibernateProperties = [ "hibernate.hbm2ddl.auto": "create-drop", "hibernate.show_sql": true ] }}
46
Tuesday, 1 November 11
Enterprise Integration
Spring opens up a world of possibilities• Spring Integration/Camel• Messaging (JMS/AMQP)• ESB• RMI, HttpInvoker, etc.
Web services & REST
47
Tuesday, 1 November 11
Grails Plugins
RoutingJMS, RabbitMQCXF, Spring-WS, WS-ClientREST
48
Tuesday, 1 November 11
JMS Plugin Example
49
dependencies { compile 'org.apache.activemq:activemq-core:5.3.0'}
Add any required dependencies (BuildConfig.groovy)
jmsConnectionFactory(org.apache.activemq.ActiveMQConnectionFactory) { brokerURL = 'vm://localhost'}
Configure JMS factory (resources.groovy)
Tuesday, 1 November 11
JMS Plugin Example
50
import javax.jms.Message
class SomeController { def jmsService
def someAction = { jmsService.send(service: 'initial', 1) { Message msg -> msg.JMSReplyTo = createDestination(service: 'reply') msg } }}
Send messages
Tuesday, 1 November 11
JMS Plugin Example
51
class ListeningService { static expose = ['jms']
def onMessage(message) { assert message == 1 }}
Listen for messages
Tuesday, 1 November 11
Demo
Demo
52
Tuesday, 1 November 11
SummaryVarious options for integrating Grails with:
• Development/build• Deployment processes
Works with many external systems• Solid support for non-Grailsy DB schemas• Flexible messaging & web service support
53
Tuesday, 1 November 11
More info
w: http://grails.org/f: http://grails.org/Mailing+Lists
e: [email protected]: pledbrookb: http://blog.springsource.com/author/peter-ledbrook/
54
Tuesday, 1 November 11
Q&A
55
Q & A
Tuesday, 1 November 11
Top Related