SlideShare a Scribd company logo
GRAILS - BEGINNERS WORKSHOP
Jacob Aae Mikkelsen
AGENDA
Installing Grails
Grails Intro
Application Scenario
Creating the application
Exercises
JACOB AAE MIKKELSEN
Senior Engineer at Lego
Microservice based architechture on JVM
Previously 4 years at Gennemtænkt IT
Consultant on Groovy and Grails
External Associate Professor - University of Southern
Denmark
@JacobAae
Blogs The Grails Diary
INSTALLING GRAILS
USB WITH MATERIAL
On the USB Sick passed around, the following materials are
available
These slides
Git repository with Grails application
Grails
IntelliJ editor
Bootstrap files
MAC & LINUX
Use Gvm tool
curl ­s get.gvmtool.net | bash
Restart terminal
gvm install grails 3.0.1
WINDOWS
Option 1: Use GVM Tool in Cygwin
Option 2: Use Posh-GVM in Powershell
( )https://github.com/flofreud/posh-gvm
Option 3 Download Grails, and setup GRAILS_HOME
(
)
http://grails.asia/grails-tutorial-for-beginners-setup-your-
windows-development-environment/
GRAILS INTRO
Grails is a full stack framework
-
Embrace the Don’t Repeat Yourself (DRY) principle
-
Encourages proper testing
-
Use the Groovy language and extensive use of Domain
Specific Languages (DSLs)
INCLUDED WITH GRAILS
Object Relational Mapping (ORM) layer → Hibernate
Expressive view technology → Groovy Server Pages (GSP)
Controller layer → Spring MVC
Interactive command line env and build system → Gradle
Embedded Tomcat container with on the fly reloading
Dependency injection → Spring container
i18n → Spring’s core MessageSource concept
Transactional service layer → Spring’s transaction
abstraction
LATEST VERSION: 3.0.1
Groovy 2.4
Spring 4.1 and Spring Boot 1.2
Gradle Build System
Application Profiles
Redesigned API based on Traits
Filters → Interceptors
Main class → Easy to run from any IDE
APPLICATION SCENARIO
Lets make a small conference application that can
keep track at what talks and workshops you have
attended
let attendees rate and supply feedback
MODEL
We need 3 domain classes in this small application
Attendee
Talk
Rating
ATTENDEE
Name
Email
Which talks attended
TALK
Speaker name
Starting time
List of ratings and comments
RATING
Attendee who supplied the rating
The talk it rates
The rating (1-5)
Comment
FUNCTIONALITY
Attendees must be able to register which talks he
attended
An attendee must be able to rate a talk from 1-5 and
submit a comment too
A list of comments and an average grade must be
available when vieving a talk
STEP 1: CREATING THE APPLICATION
To create a new Grails Application, run the grails
create-appcommand in a terminal
 grails create­app eu­gr8conf­grailsdemo
Lets go through the tree view of whats generated
You don’t have to do the above step, if you clone this
repo - then it is all done :)

git clone https://github.com/JacobAae/eu­gr8conf­grailsdemo.git
WHATS GENERATED (1)
.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle­wrapper.jar
│       └── gradle­wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
WHATS GENERATED (2)
├── grails­app
│   ├── controllers
│   │   └── UrlMappings.groovy
│   ├── domain
│   ├── services
│   ├── taglib
│   ├── utils
│   └── views
│       ├── error.gsp
│       ├── index.gsp
│       ├── layouts
│       │   └── main.gsp
│       └── notFound.gsp
WHATS GENERATED (3)
└── grails­app
    ├── assets
    │   ├── images
    │   ├── javascripts
    │   └── stylesheets
    ├── conf
    │   ├── application.yml
    │   ├── logback.groovy
    │   └── spring
    │       └── resources.groovy
    └── i18n
WHATS GENERATED (4)
└── grails­app
    └── init
        ├── BootStrap.groovy
        └── eu
            └── gr8conf
                └── grailsdemo
                    └── Application.groovy
WHATS GENERATED (5)
└── src
    ├── integration­test
    │   └── groovy
    ├── main
    │   ├── groovy
    │   └── webapp
    └── test
        └── groovy
RUNNING OUR APP
To get to the interactive console:
 grails
In interactive mode
 run­app
RESULT
Go to: http://localhost:8080/
STEP 2: FIRST DOMAIN CLASS
Lets create the first domin class with controller and views:
Attendee
CREATING THE DOMAIN CLASS
In interactive mode
create­domain­class eu.gr8conf.grailsdemo.Attendee
Resulting in
| Created grails-app/domain/eu/gr8conf/grailsdemo/Attendee.groovy
| Created src/test/groovy/eu/gr8conf/grailsdemo/AttendeeSpec.groovy
RUNNING TESTS
In interactive mode
test­app
Which fails since we have not yet implemented any test
PROPERTIES AND CONSTRAINTS
Edit the Attendee class to contain
String name
String email
String nationality
Date dateCreated
Date lastUpdated
static constraints = {
    name blank: false
    email blank: false, unique: true, email: true
    nationality nullable: true
}
GORM
Adds lots of convenience
validate()
save()
get(id)
delete()
list()
Dynamic finders: Attendee.findByName('Jacob')
TESTING
Here is an example of a test for constraints that are violated
@Unroll
void "Test invalid properties for attendee: #comment"() {
    when:
    Attendee attendee = new Attendee(name: name,
            email: email, nationality: nationality)
    then:
    !attendee.validate()
    where:
    name  | email               | nationality | comment
    ''    | 'jacob@gr8conf.org' | 'Danish'    | 'Blank name'
}
INFO: Lets add positive and more negative tests for the
constraints.
CONTROLLER AND VIEWS
In interactive mode
 generate­all eu.gr8conf.grailsdemo.Attendee
And run the app again - and click the controller
EXERCISE
Open AttendeeControllerSpec.groovyand update
it, so the tests passes
STEP 3: MORE DOMAIN CLASSES
Lets make the other two domain classes, and see how they
can interact
HINTS
 create­domain­class eu.gr8conf.grailsdemo.Talk
 create­domain­class eu.gr8conf.grailsdemo.Rating
 generate­all eu.gr8conf.grailsdemo.Talk
 generate­all eu.gr8conf.grailsdemo.Rating
RELATIONS
Attendee.groovy
static hasMany = [talks: Talk]
Talk.groovy
static belongsTo = Attendee // Where the addTo method will work from i.e. c
static hasMany = [attendees: Attendee,ratings: Rating]
Rating.groovy
static belongsTo = [talk:Talk]
CONTROLLERS
A controller handles requests and creates or prepares the
response
Business logic placed elsewhere (services)
Placed in controller folder and ends in Controller
Methods → actions
Databinding
VIEWS AND TEMPLATES
Made with Groovy Server Pages (GSP)
Extensive suite of tags
formatting
looping
input fields
CONTROLLERS AND VIEWS
Problem: Lets make a new Display Attendee page, where we
can see talks attended better.
What to do:
Make a displayaction in the AttendeeController
Add a display.gspview
add link to the new display or replace the show action
We could also rewrite the show action :)
THE ACTION
def display(Long id) {
    Attendee attendee = Attendee.get(id)
    respond attendee
}
THE VIEW
Copy and paste the show.gspview, and replace
<f:display bean="attendee" />
with
THE VIEW (2)
<ol class="property­list attendee">
  <li class="fieldcontain">
    <span id="name­label" class="property­label">Name</span>
    <span class="property­value" aria­labelledby="name­label">
         ${attendee.name}</span></li>
  <!­­ email and nationalityleft out ­­>
  <li class="fieldcontain">
    <span id="talks­label" class="property­label">Talks</span>
    <span class="property­value" aria­labelledby="talks­label">
      <ul>
        <g:each in="${attendee.talks}" var="talk">
          <li>${talk.title}</li>
        </g:each>
      </ul>
    </span>
  </li>
</ol>
EXERCISES
Make a link for each talk to go to an add rating page
Implement the add rating functionality
STEP 4: SERVICES
The default code leaves too much logic in the controller, this
should be in a service, that also should handle transactions
etc.
Lets try to cleanup the attendee controller and place some
of the logic in a service
SERVICES
Are transactional by default
Easy to autoinject
Great place for logic and functionality
HINTS
create­service eu.gr8conf.grailsdemo.AttendeeService
USING SERVICES - AUTOINJECTION
In the AttendeeController, where we will use the service, all
we need to do, is add this line
AttendeeService attendeeService
Then it will be autoinjected because Grails recognices the
name
CLEANING UP CONTROLLERS
The default generated controllers does everything
Lets cleanup the save method.
HELPER CLASSES
In src/main/groovyyou can place helper classes, or
non-Grails-artefacts
class Result {
    def item
    Status status
}
enum Status {
    OK,
    NOT_FOUND,
    HAS_ERRORS
}
SERVICE METHOD
The service method could look like
Result saveAttendee(Attendee attendee) {
    if (attendee == null) {
        transactionStatus.setRollbackOnly()
        return new Result(status: Status.NOT_FOUND)
    }
    if (attendee.hasErrors()) {
        transactionStatus.setRollbackOnly()
        return new Result(status: Status.HAS_ERRORS, item: attendee)
    }
    attendee.save flush:true
    return new Result(status: Status.OK, item: attendee)
}
CONTROLLER
def save(Attendee attendee) {
    Result result = attendeeService.saveAttendee(attendee)
    switch( result.status) {
        case Status.NOT_FOUND:
            notFound()
            break
        case Status.HAS_ERRORS:
            respond result.item.errors, view:'create'
            break
        case Status.OK:
            request.withFormat {
                form multipartForm {
                    flash.message = message(code: 'default.created.message
                    println attendee.dump()
                    redirect attendee
                }
                '*' { respond attendee, [status: CREATED] }
TASK
Clean up the rest of the controller, removig everything that
needs the @Transactional annotation
STEP 5: TAGLIBS
Taglibs can help make the views more clean and DRY
TAGLIB
Placed in grails-app/taglib
must end with TagLib.groovy
Closure taking parameters attrsand body
create­taglib eu.gr8conf.grailsdemo.RatingTagLib
SERVICE TO CALCULATE AVERAGE
RATING
class TalkService {
    BigDecimal calculateAverageRating(Talk talk) {
        if( !talk || !talk.ratings ) {
            return null
        }
        talk.ratings*.value.sum() / talk.ratings.size()
    }
}
THE TAGLIB
TalkService talkService
def showRating = { attrs ­>
    Talk talk = attrs.talk
    BigDecimal avg = talkService.calculateAverageRating(talk)
    if( avg ) {
        out << """<span class='average­rating'>
           ${roundAverage(avg)}</span>"""
    } else {
        out << "N/A"
    }
}
private roundAverage(BigDecimal average) {
    "${Math.round(1.0 * average * 100) / 100 }"
}
TESTING TAGLIBS
void "test output from showRating"() {
    when:
    String output = tagLib.showRating(talk:
        new Talk(ratings: ratings), { a ­> a })
    then:
    output == expected
    where:
    ratings                 | expected
    null                    | 'N/A'
    [new Rating(value: 5)]  | "<span class='average­rating'>5</span>
}
STEP 6: ASSETS, STYLING, PLUGINS
AND LAYOUTS
ASSETS
Javascript, images and css files are handled by asset-
pipeline plugins
build.gradle
runtime "org.grails.plugins:asset­pipeline"
Compiles Less
Minifies JS
Combines files
BOOTSTRAP
Lets include the (Twitter) Bootstrap project in our
application.
BOOTSTRAP
In the grails-app/assetsfolder, place the Bootstrap
files
.
├── fonts
│   ├── glyphicons­halflings­regular.eot
│   ├── ... + rest of fonts files
├── images
│   ├── ...
├── javascripts
│   ├── bootstrap.css.map
│   └── bootstrap.js
└── stylesheets
    ├── bootstrap.css
    ├── bootstrap­theme.css
    ├── combined­bootstrap.css
    ├── ...
ASSET FILE
Lets make a Bootstrap css asset package
combined-bootstrap.css
/*
*= require bootstrap
*= require bootstrap­theme
*= require_self
*/
LAYOUTS
In grails-app/views/layoutsLayonts are placed
that can be reused across pages.
LAYOUTS
views/layouts/bootstrap.gsp
<!doctype html>
<html lang="en" class="no­js">
    <head>
        <meta http­equiv="Content­Type" content="text/html; charset=UTF­8
        <meta http­equiv="X­UA­Compatible" content="IE=edge">
        <title><g:layoutTitle default="Grails"/></title>
        <meta name="viewport" content="width=device­width, initial­scale=1
        <asset:stylesheet src="combined­bootstrap.css"/>
        <asset:javascript src="application.js"/>
        <g:layoutHead/>
    </head>
    <body class="container">
        <g:layoutBody/>
        <div class="footer" role="contentinfo"></div>
        <div id="spinner" class="spinner" style="display:none;"><g:message
    </body>
</html>
USING LAYOUTS
views/attendee/display.gsp
<head>
        <meta name="layout" content="bootstrap">
...
views/attendee/display.gsp
<g:link class="btn btn­primary" action="edit" resource="${attendee}"
  <span class="glyphicon glyphicon­edit" aria­hidden="true"></span>
  <g:message code="default.button.edit.label" default="Edit" />
</g:link>
FIXING ICONS
In bootstrap.css, update the path to Glyphicons font
(line 267++)
views/attendee/display.gsp
@font­face {
    font­family: 'Glyphicons Halflings';
    src: url('../assets/fonts/glyphicons­halflings­regular.eot');
    src: url('../assets/fonts/glyphicons­halflings­regular.eot?#iefix') for
}
TASKS
Include Bootstrap
Restyle a page using a bootstrap layout
EXERCISES
Show the distribution of grades in the talk page (2*3, 2*4,
4*5)
LITERATURE
http://gvmtool.net/
https://github.com/flofreud/posh-gvm
https://grails.org/single-page-documentation.html
http://getbootstrap.com/

More Related Content

What's hot

Groovy in the Cloud
Groovy in the CloudGroovy in the Cloud
Groovy in the Cloud
Daniel Woods
 
Grails plugin development
Grails plugin developmentGrails plugin development
Grails plugin development
Mohd Farid
 
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...Daniel Oh
 
GitHub Integration for Orangescrum Cloud Released!
GitHub Integration for Orangescrum Cloud Released!GitHub Integration for Orangescrum Cloud Released!
GitHub Integration for Orangescrum Cloud Released!
Orangescrum
 
Deploy With Codefresh to Kubernetes in 3 steps
Deploy With Codefresh to Kubernetes in 3 stepsDeploy With Codefresh to Kubernetes in 3 steps
Deploy With Codefresh to Kubernetes in 3 steps
Jenny Passi
 
Develop Android app using Golang
Develop Android app using GolangDevelop Android app using Golang
Develop Android app using Golang
SeongJae Park
 
PWA with Kotlin
PWA with KotlinPWA with Kotlin
PWA with Kotlin
Minseo Chayabanjonglerd
 
Upgrading to Drupal 9
Upgrading to Drupal 9Upgrading to Drupal 9
Upgrading to Drupal 9
DrupalCamp Kyiv
 
Tips & Tricks for Maven Tycho
Tips & Tricks for Maven TychoTips & Tricks for Maven Tycho
Tips & Tricks for Maven Tycho
Gunnar Wagenknecht
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit
MarcinStachniuk
 
Introduction of React.js
Introduction of React.jsIntroduction of React.js
Introduction of React.js
Jyaasa Technologies
 
Gradle
GradleGradle
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.org
MarcinStachniuk
 
Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015
Daniel Woods
 
Gradle 2.0 and beyond (GREACH 2015)
Gradle 2.0 and beyond (GREACH 2015)Gradle 2.0 and beyond (GREACH 2015)
Gradle 2.0 and beyond (GREACH 2015)
René Gröschke
 
Develop Android/iOS app using golang
Develop Android/iOS app using golangDevelop Android/iOS app using golang
Develop Android/iOS app using golang
SeongJae Park
 
Using The EGit Eclipse Plugin With Git Hub
Using The EGit Eclipse Plugin With Git HubUsing The EGit Eclipse Plugin With Git Hub
Using The EGit Eclipse Plugin With Git Hub
guest4bce3214
 
不只自動化而且更敏捷的Android開發工具 gradle
不只自動化而且更敏捷的Android開發工具 gradle不只自動化而且更敏捷的Android開發工具 gradle
不只自動化而且更敏捷的Android開發工具 gradle
sam chiu
 
Dockerized apps on Kubernetes
Dockerized apps on KubernetesDockerized apps on Kubernetes
Dockerized apps on Kubernetes
Łukasz Barulski
 

What's hot (20)

Groovy in the Cloud
Groovy in the CloudGroovy in the Cloud
Groovy in the Cloud
 
Grails plugin development
Grails plugin developmentGrails plugin development
Grails plugin development
 
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
 
GitHub Integration for Orangescrum Cloud Released!
GitHub Integration for Orangescrum Cloud Released!GitHub Integration for Orangescrum Cloud Released!
GitHub Integration for Orangescrum Cloud Released!
 
Deploy With Codefresh to Kubernetes in 3 steps
Deploy With Codefresh to Kubernetes in 3 stepsDeploy With Codefresh to Kubernetes in 3 steps
Deploy With Codefresh to Kubernetes in 3 steps
 
Develop Android app using Golang
Develop Android app using GolangDevelop Android app using Golang
Develop Android app using Golang
 
PWA with Kotlin
PWA with KotlinPWA with Kotlin
PWA with Kotlin
 
Upgrading to Drupal 9
Upgrading to Drupal 9Upgrading to Drupal 9
Upgrading to Drupal 9
 
Tips & Tricks for Maven Tycho
Tips & Tricks for Maven TychoTips & Tricks for Maven Tycho
Tips & Tricks for Maven Tycho
 
jQuery plugin & testing with Jasmine
jQuery plugin & testing with JasminejQuery plugin & testing with Jasmine
jQuery plugin & testing with Jasmine
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit
 
Introduction of React.js
Introduction of React.jsIntroduction of React.js
Introduction of React.js
 
Gradle
GradleGradle
Gradle
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.org
 
Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015
 
Gradle 2.0 and beyond (GREACH 2015)
Gradle 2.0 and beyond (GREACH 2015)Gradle 2.0 and beyond (GREACH 2015)
Gradle 2.0 and beyond (GREACH 2015)
 
Develop Android/iOS app using golang
Develop Android/iOS app using golangDevelop Android/iOS app using golang
Develop Android/iOS app using golang
 
Using The EGit Eclipse Plugin With Git Hub
Using The EGit Eclipse Plugin With Git HubUsing The EGit Eclipse Plugin With Git Hub
Using The EGit Eclipse Plugin With Git Hub
 
不只自動化而且更敏捷的Android開發工具 gradle
不只自動化而且更敏捷的Android開發工具 gradle不只自動化而且更敏捷的Android開發工具 gradle
不只自動化而且更敏捷的Android開發工具 gradle
 
Dockerized apps on Kubernetes
Dockerized apps on KubernetesDockerized apps on Kubernetes
Dockerized apps on Kubernetes
 

Similar to Grails beginners workshop

Griffon: Re-imaging Desktop Java Technology
Griffon: Re-imaging Desktop Java TechnologyGriffon: Re-imaging Desktop Java Technology
Griffon: Re-imaging Desktop Java Technology
James Williams
 
Griffon Presentation
Griffon PresentationGriffon Presentation
Griffon Presentation
Kelly Robinson
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
Bo-Yi Wu
 
Gitops Hands On
Gitops Hands OnGitops Hands On
Gitops Hands On
Brice Fernandes
 
Why Gradle?
Why Gradle?Why Gradle?
Why Gradle?
Peter Ledbrook
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a pro
sparkfabrik
 
Javascript, the GNOME way (JSConf EU 2011)
Javascript, the GNOME way (JSConf EU 2011)Javascript, the GNOME way (JSConf EU 2011)
Javascript, the GNOME way (JSConf EU 2011)
Igalia
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 version
Schalk Cronjé
 
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Aleksey Tkachenko
 
Creating Openbravo Workspace Widgets
Creating Openbravo Workspace WidgetsCreating Openbravo Workspace Widgets
Creating Openbravo Workspace Widgets
Rob Goris
 
Flutter vs Java Graphical User Interface Frameworks - text
Flutter vs Java Graphical User Interface Frameworks - textFlutter vs Java Graphical User Interface Frameworks - text
Flutter vs Java Graphical User Interface Frameworks - text
Toma Velev
 
Gradle how to's
Gradle how to'sGradle how to's
Gradle how to's
Sergiy Beley
 
Building Instruqt, a scalable learning platform
Building Instruqt, a scalable learning platformBuilding Instruqt, a scalable learning platform
Building Instruqt, a scalable learning platform
Instruqt
 
Workflows using Git GitHub | Edureka
Workflows using Git GitHub | EdurekaWorkflows using Git GitHub | Edureka
Workflows using Git GitHub | Edureka
Edureka!
 
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
ShaiAlmog1
 
Gerrit Code Review: how to script a plugin with Scala and Groovy
Gerrit Code Review: how to script a plugin with Scala and GroovyGerrit Code Review: how to script a plugin with Scala and Groovy
Gerrit Code Review: how to script a plugin with Scala and Groovy
Luca Milanesio
 
Why gradle
Why gradle Why gradle
Why gradle
Sercan Karaoglu
 
ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...
ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...
ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...
Gavin Pickin
 
Javaone - Gradle: Harder, Better, Stronger, Faster
Javaone - Gradle: Harder, Better, Stronger, Faster Javaone - Gradle: Harder, Better, Stronger, Faster
Javaone - Gradle: Harder, Better, Stronger, Faster
Andres Almiray
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
Roberto Pérez Alcolea
 

Similar to Grails beginners workshop (20)

Griffon: Re-imaging Desktop Java Technology
Griffon: Re-imaging Desktop Java TechnologyGriffon: Re-imaging Desktop Java Technology
Griffon: Re-imaging Desktop Java Technology
 
Griffon Presentation
Griffon PresentationGriffon Presentation
Griffon Presentation
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Gitops Hands On
Gitops Hands OnGitops Hands On
Gitops Hands On
 
Why Gradle?
Why Gradle?Why Gradle?
Why Gradle?
 
Gitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a proGitlab ci e kubernetes, build test and deploy your projects like a pro
Gitlab ci e kubernetes, build test and deploy your projects like a pro
 
Javascript, the GNOME way (JSConf EU 2011)
Javascript, the GNOME way (JSConf EU 2011)Javascript, the GNOME way (JSConf EU 2011)
Javascript, the GNOME way (JSConf EU 2011)
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 version
 
Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...Docman - The swiss army knife for Drupal multisite docroot management and dep...
Docman - The swiss army knife for Drupal multisite docroot management and dep...
 
Creating Openbravo Workspace Widgets
Creating Openbravo Workspace WidgetsCreating Openbravo Workspace Widgets
Creating Openbravo Workspace Widgets
 
Flutter vs Java Graphical User Interface Frameworks - text
Flutter vs Java Graphical User Interface Frameworks - textFlutter vs Java Graphical User Interface Frameworks - text
Flutter vs Java Graphical User Interface Frameworks - text
 
Gradle how to's
Gradle how to'sGradle how to's
Gradle how to's
 
Building Instruqt, a scalable learning platform
Building Instruqt, a scalable learning platformBuilding Instruqt, a scalable learning platform
Building Instruqt, a scalable learning platform
 
Workflows using Git GitHub | Edureka
Workflows using Git GitHub | EdurekaWorkflows using Git GitHub | Edureka
Workflows using Git GitHub | Edureka
 
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
 
Gerrit Code Review: how to script a plugin with Scala and Groovy
Gerrit Code Review: how to script a plugin with Scala and GroovyGerrit Code Review: how to script a plugin with Scala and Groovy
Gerrit Code Review: how to script a plugin with Scala and Groovy
 
Why gradle
Why gradle Why gradle
Why gradle
 
ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...
ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...
ColdBox APIs + VueJS - powering Mobile, Desktop and Web Apps with 1 VueJS cod...
 
Javaone - Gradle: Harder, Better, Stronger, Faster
Javaone - Gradle: Harder, Better, Stronger, Faster Javaone - Gradle: Harder, Better, Stronger, Faster
Javaone - Gradle: Harder, Better, Stronger, Faster
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 

Recently uploaded

Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Natan Silnitsky
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
abdulrafaychaudhry
 
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi ArabiaTop 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
Yara Milbes
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
Globus
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
e20449
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate
 
Pro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp BookPro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp Book
abdulrafaychaudhry
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Launch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in MinutesLaunch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in Minutes
Roshan Dwivedi
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 

Recently uploaded (20)

Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 
Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)Introduction to Pygame (Lecture 7 Python Game Development)
Introduction to Pygame (Lecture 7 Python Game Development)
 
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi ArabiaTop 7 Unique WhatsApp API Benefits | Saudi Arabia
Top 7 Unique WhatsApp API Benefits | Saudi Arabia
 
Understanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSageUnderstanding Globus Data Transfers with NetSage
Understanding Globus Data Transfers with NetSage
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
Graphic Design Crash Course for beginners
Graphic Design Crash Course for beginnersGraphic Design Crash Course for beginners
Graphic Design Crash Course for beginners
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket ManagementUtilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
Utilocate provides Smarter, Better, Faster, Safer Locate Ticket Management
 
Pro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp BookPro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp Book
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Launch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in MinutesLaunch Your Streaming Platforms in Minutes
Launch Your Streaming Platforms in Minutes
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 

Grails beginners workshop