java tech & tools | grails in the java enterprise | peter ledbrook
DESCRIPTION
2011-11-01 | 03:00 PM - 03:50 PMWith all the buzz around rapid web application development frameworks, are enterprise developers left looking on enviously? Not at all. Grails brings the same benefits to Java developers while providing many options for enterprise integration. This talk shows you how to build Grails projects with Ant and Maven; what's involved in talking to legacy databases; and how to talk to Java components.TRANSCRIPT
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