SlideShare a Scribd company logo
Beginning Groovy 3.0
Adam L. Davis
The Solution Design Group, Inc.
Author of “Learning Groovy”
(& Reactive Streams in Java & others)
16 years Java Dev.
github.com/adamldavis
/2019-gr8conf
thesdg.com
Java ~ Brian Goetz (Java Language Architect)
Groovy
<Insert your
hated language
here>
PHP
groovy-lang.org
sdkman.io
Flat learning curve
Smooth Java integration
Vibrant and rich ecosystem
Powerful features
Domain-Specific Languages (DSLs)
Scripting and testing glue
Inspired by Python, Ruby,
Smalltalk, ...
●
Dynamic or Static
●
(@CompileStatic @TypeChecked)
●
As fast as Java (with static & indy)
●
Meta-programming
●
Optional semi-colons
●
Optional parentheses (command chains)
●
Short-hand for Lists and Maps
●
Automatic getters and setters
●
A better switch
●
Groovy GDK…
Groovy pre-2.5 Features
●
Closures
●
Currying
●
Method references
●
Map/Filter/Reduce as collect, findAll, inject
●
Internal iterating using each
●
Operator Overloading (+ - * % / …)
●
methodMissing and propertyMissing
●
AST Transformations
●
Traits
…
Groovy pre-2.5 Features (cont.)
Groovy 2.5
●
Groovy 2.5 added support for JDK9+
●
11 new AST transformations
– @AutoFinal, @AutoImplement, @ImmutableBase,
@ImmutableOptions, @MapConstructor,
@NamedDelegate, @NamedParam,
@NamedParams, @NamedVariant,
@PropertyOptions, and @VisibilityOptions
●
Macro feature - makes writing AST
transformations much easier!
Starting Out
Option 1: Using sdkman.io
– sdk install groovy
Option 2: Download from groovy-lang.org
– Alter your PATH
●
Export PATH=$PATH:/usr/lib/groovy/bin
●
Option 3: Mac – see http://groovy-lang.org/install.html
●
Option π: Windows – see https://github.com/groovy/groovy-windows-installer
Then: $ groovyConsole
IntelliJ IDEA or NetBeans
Dynamic typing
●
def keyword
●
Parameters’ typing optional
●
Possible to mock using a map
– def dog = [bark: { println ‘woof’ }]
●
Using @TypeChecked or @CompileStatic you
can make Groovy statically typed in some
classes or methodsz
Groovy Strings
●
‘normal string’
●
“groovy string can contain $variables”
●
“can also do expressions ${x + 1}”
●
Use triple quote to start/end multi-line strings
‘’’
This is a
Multi-line
String
‘’’
Math, Groovy Truth, and Equals
●
Numbers are BigDecimal by default not Double
– 3.14 is a BigDecimal
– 3.14d is a Double
●
Groovy truth: null, “”, [], 0 are false
– if (!thing) println “thing was null”
– if (!str) println “str was empty”
●
Groovy == means .equals
– For identity use a.is(b)
– Groovy 3: a === b
Property Access
●
Everything is public
by default
●
Every field has a
getter and setter by
default
●
Gotcha’s
– Map access
– String.class->String
●
Property access
automatically uses getters
and setters
●
foo.bar == foo.getBar()
●
foo.bar = 2 == foo.setBar(2)
Lists and Maps
●
def emptyList = [ ]
●
def emptyMap = [:]
●
def numList = [1,2,3]
●
def strMap = [cars: 1, boats: 2, planes: 3]
●
def varMap = [(var1): 1, (var2): 2, (var3): 3]
Maps Continued...
def map = [cars: 1, boats: 2, planes: 3]
●
String key access: map.cars
●
OR map[‘cars’]
●
Also works for modifying:
– map.cars = 42
– map[‘cars’] = 42
Groovy 3
●
Groovy 3 sports a completely rewritten parser
(Parrot) that brings Groovy up to parity with the
latest Java 11 syntax along with new Groovy-only
features. It runs on JDK 8 minimum and has better
support for JDK 9/10/11.
●
Java-style: lambda expressions and method
references, array initialization, and do/while loops
●
Support for try-with-resources and “var”
●
New operators: !in !instanceof
Code Demo 1
A better switch
●
Switch can use types, lists, ranges, patterns…
Switch (x) {
case Map: println “was a map”; break
case [4,5,6]: println “was 4, 5 or 6”; break
case 0..20: println “was 0 to 20”; break
case ~/w+/: println “ was a word”; break
case “hello”: println x; break
case BigDecimal: println “was a BigDecimal”
Groovy GDK
●
Adds methods to everything! Adds its own classes...
●
Collections: sort, findAll, collect, inject, each,…
●
IO: toFile(), text, bytes, withReader, URL.content
●
Ranges: x..y, x..<y
– GetAt syntax for Strings and Lists:
●
text[0..4] == text.substring(0,5)
●
Utilities: ConfigSlurper, Expando,
ObservableList/Map/Set, JsonSlurper, JsonBuilder, ...
in keyword
●
Use the “in” keyword to test inclusion or loops:
– assert 'Groovy' in ['Java', 'Groovy']
– assert 7 in 0..10
– for (i in 0..10) {}
– for (str in strArray) {}
Safe dereference & Elvis operator
●
Safe dereference ?.
– String name = person?.name
– Java: person == null ? null : person.getName()
●
Elvis operator ?:
– String name = person?.name ?: “Bob”
– Java: if (name == null) name = “Bob”
Closures
●
Closure: “a self-containing method” (like Lambda exp.)
– def say = { x -> println x }
– say(‘hello gr8conf’)
– def say = { println it }
– def adder = { x, y -> x + y }
●
Closures have several implicit variables:
– it - If the closure has one argument
– this - Refers to the enclosing class
– owner - The same as this unless it is enclosed in another closure.
– delegate - Usually the same as owner but you can change it (this
allows the methods of delegate to be in scope).
Closures Continued...
●
When used as last parameter, closure can go
outside parentheses
– methodCalled(param1, param2) { closureHere() }
– methodWithOnlyClosure { closureHere() }
Regex Pattern Matching
●
Regex = regular expressions
●
Within forward slashes / is a regex
– You don’t need to use double 
– Example: /d+/ matches any number
●
=~ for matching anywhere within a string
– if (text =~ /d+/) println “there was a number in it”
●
==~ for matching the whole string
– if (email ==~ /[w.]+@[w.]+/) println “it’s an email”
Meta-programming
●
Every class and instance has a metaClass
●
String.metaClass.upper =
{ delegate.toUpperCase() }
– “foo”.upper() == “FOO”
● ●
Extension Modules!
●
Traits can be used as
mixins
●
Maps can be cast to
actual types using as
[bark: {println “Woof!”}]
as Dog
Code Demo 2
Other Surprises for Java Devs
●
Default values for method parameters
●
Dot notation to call methods… object.”method name”
●
groovy.transform.*
– @EqualsAndHashCode
– @TupleConstructor
– @ToString
– @Canonical
●
Generics not enforced by default
– (use @CompileStatic to do it)
Advanced Groovy
●
Groovy Design Patterns
– Strategy pattern
– Categories
– Method caching
●
DSLs – Domain Specific Languages
– Operator Overloading
– Meta-programming, Extension Modules,
Closures, ...
●
Traits: multi-inheritance
More Groovy
●
Groovy Grapes
– @Grab(group=’’, module=’’, version=’’)
●
Functional Programming
– curry
– Closures, etc.
Code Demo 3
Spock
Grails
Gradle grooscript
The Groovy Ecosystem
and many others….
Griffon
Gradle
Imperative, not declarative
Relies on plugins
Tasks
Vanilla groovy
Easy to build plugins
Easy to do sub-projects
Spock
Built on JUnit
Somewhat enhanced groovy
“test names can be any string”
given: when: then: expect:
Built-in mocking
Table-syntax for provided test data
Pretty assert output
Thanks!
Adam L. Davis
“Learning Groovy”
github.com/adamldavis
/2019-gr8conf
adamldavis.com
@adamldavis
http://bit.ly/Gr8-2019BG
How? Gedit + https://github.com/aeischeid/gedit-grails-bundle

More Related Content

What's hot (20)

PPTX
Typescript - A developer friendly javascript
pradiphudekar
 
PDF
Fantom - Programming Language for JVM, CLR, and Javascript
Kamil Toman
 
PDF
Golang and Eco-System Introduction / Overview
Markus Schneider
 
PDF
Crystal presentation in NY
Crystal Language
 
ODP
Python internals and how they affect your code - kasra ahmadvand
irpycon
 
PPTX
Mono + .NET Core = ❤️
Egor Bogatov
 
PDF
Stripe CTF3 wrap-up
Stripe
 
PPTX
Iron Languages - NYC CodeCamp 2/19/2011
Jimmy Schementi
 
PPTX
DConf 2016: Bitpacking Like a Madman by Amaury Sechet
Andrei Alexandrescu
 
PDF
Asynchronous single page applications without a line of HTML or Javascript, o...
Robert Schadek
 
PPTX
Introduction to Web Development - JavaScript
SadhanaParameswaran
 
PDF
Why my Go program is slow?
Inada Naoki
 
PDF
Clojure Small Intro
John Vlachoyiannis
 
PDF
Rust All Hands Winter 2011
Patrick Walton
 
PDF
From 0 to mine sweeper in pyside
Dinesh Manajipet
 
PPTX
Briefly Rust
Daniele Esposti
 
PPTX
C++ via C#
Egor Bogatov
 
PPTX
What the C?
baccigalupi
 
PDF
Unmanaged Parallelization via P/Invoke
Dmitri Nesteruk
 
PDF
Android 101 - Building a simple app with Kotlin in 90 minutes
Kai Koenig
 
Typescript - A developer friendly javascript
pradiphudekar
 
Fantom - Programming Language for JVM, CLR, and Javascript
Kamil Toman
 
Golang and Eco-System Introduction / Overview
Markus Schneider
 
Crystal presentation in NY
Crystal Language
 
Python internals and how they affect your code - kasra ahmadvand
irpycon
 
Mono + .NET Core = ❤️
Egor Bogatov
 
Stripe CTF3 wrap-up
Stripe
 
Iron Languages - NYC CodeCamp 2/19/2011
Jimmy Schementi
 
DConf 2016: Bitpacking Like a Madman by Amaury Sechet
Andrei Alexandrescu
 
Asynchronous single page applications without a line of HTML or Javascript, o...
Robert Schadek
 
Introduction to Web Development - JavaScript
SadhanaParameswaran
 
Why my Go program is slow?
Inada Naoki
 
Clojure Small Intro
John Vlachoyiannis
 
Rust All Hands Winter 2011
Patrick Walton
 
From 0 to mine sweeper in pyside
Dinesh Manajipet
 
Briefly Rust
Daniele Esposti
 
C++ via C#
Egor Bogatov
 
What the C?
baccigalupi
 
Unmanaged Parallelization via P/Invoke
Dmitri Nesteruk
 
Android 101 - Building a simple app with Kotlin in 90 minutes
Kai Koenig
 

Similar to Learning groovy -EU workshop (20)

PDF
Groovy.pptx
Giancarlo Frison
 
PDF
An Introduction to Groovy for Java Developers
Kostas Saidis
 
PPT
Groovy presentation
Manav Prasad
 
PDF
Introduction to Groovy (Serbian Developer Conference 2013)
Joachim Baumann
 
PDF
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf
 
PDF
Apache Groovy: the language and the ecosystem
Kostas Saidis
 
ODP
Groovy intro
NexThoughts Technologies
 
PPTX
Groovy And Grails Introduction
Eric Weimer
 
PPTX
Groovy Programming Language
Aniruddha Chakrabarti
 
PDF
Oscon Java Testing on the Fast Lane
Andres Almiray
 
PPT
Groovy unleashed
Isuru Samaraweera
 
PPTX
Introduction to Grails
Avi Perez
 
PDF
Introductionto fp with groovy
Isuru Samaraweera
 
PPT
Groovy Update - JavaPolis 2007
Guillaume Laforge
 
PDF
Introduction to Groovy
Kevin H.A. Tan
 
PDF
Groovy a Scripting Language for Java
Charles Anderson
 
PPT
Groovy Basics
Wes Williams
 
PDF
Groovy and noteworthy
Izzet Mustafaiev
 
PDF
Infinum android talks_10_getting groovy on android
Infinum
 
PDF
Introduction to Oracle Groovy
Deepak Bhagat
 
Groovy.pptx
Giancarlo Frison
 
An Introduction to Groovy for Java Developers
Kostas Saidis
 
Groovy presentation
Manav Prasad
 
Introduction to Groovy (Serbian Developer Conference 2013)
Joachim Baumann
 
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf
 
Apache Groovy: the language and the ecosystem
Kostas Saidis
 
Groovy And Grails Introduction
Eric Weimer
 
Groovy Programming Language
Aniruddha Chakrabarti
 
Oscon Java Testing on the Fast Lane
Andres Almiray
 
Groovy unleashed
Isuru Samaraweera
 
Introduction to Grails
Avi Perez
 
Introductionto fp with groovy
Isuru Samaraweera
 
Groovy Update - JavaPolis 2007
Guillaume Laforge
 
Introduction to Groovy
Kevin H.A. Tan
 
Groovy a Scripting Language for Java
Charles Anderson
 
Groovy Basics
Wes Williams
 
Groovy and noteworthy
Izzet Mustafaiev
 
Infinum android talks_10_getting groovy on android
Infinum
 
Introduction to Oracle Groovy
Deepak Bhagat
 
Ad

Recently uploaded (20)

PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Advancing WebDriver BiDi support in WebKit
Igalia
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
July Patch Tuesday
Ivanti
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Advancing WebDriver BiDi support in WebKit
Igalia
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
July Patch Tuesday
Ivanti
 
Ad

Learning groovy -EU workshop

  • 1. Beginning Groovy 3.0 Adam L. Davis The Solution Design Group, Inc. Author of “Learning Groovy” (& Reactive Streams in Java & others) 16 years Java Dev. github.com/adamldavis /2019-gr8conf thesdg.com
  • 2. Java ~ Brian Goetz (Java Language Architect)
  • 5. groovy-lang.org sdkman.io Flat learning curve Smooth Java integration Vibrant and rich ecosystem Powerful features Domain-Specific Languages (DSLs) Scripting and testing glue Inspired by Python, Ruby, Smalltalk, ...
  • 6. ● Dynamic or Static ● (@CompileStatic @TypeChecked) ● As fast as Java (with static & indy) ● Meta-programming ● Optional semi-colons ● Optional parentheses (command chains) ● Short-hand for Lists and Maps ● Automatic getters and setters ● A better switch ● Groovy GDK… Groovy pre-2.5 Features
  • 7. ● Closures ● Currying ● Method references ● Map/Filter/Reduce as collect, findAll, inject ● Internal iterating using each ● Operator Overloading (+ - * % / …) ● methodMissing and propertyMissing ● AST Transformations ● Traits … Groovy pre-2.5 Features (cont.)
  • 8. Groovy 2.5 ● Groovy 2.5 added support for JDK9+ ● 11 new AST transformations – @AutoFinal, @AutoImplement, @ImmutableBase, @ImmutableOptions, @MapConstructor, @NamedDelegate, @NamedParam, @NamedParams, @NamedVariant, @PropertyOptions, and @VisibilityOptions ● Macro feature - makes writing AST transformations much easier!
  • 9. Starting Out Option 1: Using sdkman.io – sdk install groovy Option 2: Download from groovy-lang.org – Alter your PATH ● Export PATH=$PATH:/usr/lib/groovy/bin ● Option 3: Mac – see http://groovy-lang.org/install.html ● Option π: Windows – see https://github.com/groovy/groovy-windows-installer Then: $ groovyConsole IntelliJ IDEA or NetBeans
  • 10. Dynamic typing ● def keyword ● Parameters’ typing optional ● Possible to mock using a map – def dog = [bark: { println ‘woof’ }] ● Using @TypeChecked or @CompileStatic you can make Groovy statically typed in some classes or methodsz
  • 11. Groovy Strings ● ‘normal string’ ● “groovy string can contain $variables” ● “can also do expressions ${x + 1}” ● Use triple quote to start/end multi-line strings ‘’’ This is a Multi-line String ‘’’
  • 12. Math, Groovy Truth, and Equals ● Numbers are BigDecimal by default not Double – 3.14 is a BigDecimal – 3.14d is a Double ● Groovy truth: null, “”, [], 0 are false – if (!thing) println “thing was null” – if (!str) println “str was empty” ● Groovy == means .equals – For identity use a.is(b) – Groovy 3: a === b
  • 13. Property Access ● Everything is public by default ● Every field has a getter and setter by default ● Gotcha’s – Map access – String.class->String ● Property access automatically uses getters and setters ● foo.bar == foo.getBar() ● foo.bar = 2 == foo.setBar(2)
  • 14. Lists and Maps ● def emptyList = [ ] ● def emptyMap = [:] ● def numList = [1,2,3] ● def strMap = [cars: 1, boats: 2, planes: 3] ● def varMap = [(var1): 1, (var2): 2, (var3): 3]
  • 15. Maps Continued... def map = [cars: 1, boats: 2, planes: 3] ● String key access: map.cars ● OR map[‘cars’] ● Also works for modifying: – map.cars = 42 – map[‘cars’] = 42
  • 16. Groovy 3 ● Groovy 3 sports a completely rewritten parser (Parrot) that brings Groovy up to parity with the latest Java 11 syntax along with new Groovy-only features. It runs on JDK 8 minimum and has better support for JDK 9/10/11. ● Java-style: lambda expressions and method references, array initialization, and do/while loops ● Support for try-with-resources and “var” ● New operators: !in !instanceof
  • 18. A better switch ● Switch can use types, lists, ranges, patterns… Switch (x) { case Map: println “was a map”; break case [4,5,6]: println “was 4, 5 or 6”; break case 0..20: println “was 0 to 20”; break case ~/w+/: println “ was a word”; break case “hello”: println x; break case BigDecimal: println “was a BigDecimal”
  • 19. Groovy GDK ● Adds methods to everything! Adds its own classes... ● Collections: sort, findAll, collect, inject, each,… ● IO: toFile(), text, bytes, withReader, URL.content ● Ranges: x..y, x..<y – GetAt syntax for Strings and Lists: ● text[0..4] == text.substring(0,5) ● Utilities: ConfigSlurper, Expando, ObservableList/Map/Set, JsonSlurper, JsonBuilder, ...
  • 20. in keyword ● Use the “in” keyword to test inclusion or loops: – assert 'Groovy' in ['Java', 'Groovy'] – assert 7 in 0..10 – for (i in 0..10) {} – for (str in strArray) {}
  • 21. Safe dereference & Elvis operator ● Safe dereference ?. – String name = person?.name – Java: person == null ? null : person.getName() ● Elvis operator ?: – String name = person?.name ?: “Bob” – Java: if (name == null) name = “Bob”
  • 22. Closures ● Closure: “a self-containing method” (like Lambda exp.) – def say = { x -> println x } – say(‘hello gr8conf’) – def say = { println it } – def adder = { x, y -> x + y } ● Closures have several implicit variables: – it - If the closure has one argument – this - Refers to the enclosing class – owner - The same as this unless it is enclosed in another closure. – delegate - Usually the same as owner but you can change it (this allows the methods of delegate to be in scope).
  • 23. Closures Continued... ● When used as last parameter, closure can go outside parentheses – methodCalled(param1, param2) { closureHere() } – methodWithOnlyClosure { closureHere() }
  • 24. Regex Pattern Matching ● Regex = regular expressions ● Within forward slashes / is a regex – You don’t need to use double – Example: /d+/ matches any number ● =~ for matching anywhere within a string – if (text =~ /d+/) println “there was a number in it” ● ==~ for matching the whole string – if (email ==~ /[w.]+@[w.]+/) println “it’s an email”
  • 25. Meta-programming ● Every class and instance has a metaClass ● String.metaClass.upper = { delegate.toUpperCase() } – “foo”.upper() == “FOO” ● ● Extension Modules! ● Traits can be used as mixins ● Maps can be cast to actual types using as [bark: {println “Woof!”}] as Dog
  • 27. Other Surprises for Java Devs ● Default values for method parameters ● Dot notation to call methods… object.”method name” ● groovy.transform.* – @EqualsAndHashCode – @TupleConstructor – @ToString – @Canonical ● Generics not enforced by default – (use @CompileStatic to do it)
  • 28. Advanced Groovy ● Groovy Design Patterns – Strategy pattern – Categories – Method caching ● DSLs – Domain Specific Languages – Operator Overloading – Meta-programming, Extension Modules, Closures, ... ● Traits: multi-inheritance
  • 29. More Groovy ● Groovy Grapes – @Grab(group=’’, module=’’, version=’’) ● Functional Programming – curry – Closures, etc.
  • 31. Spock Grails Gradle grooscript The Groovy Ecosystem and many others…. Griffon
  • 32. Gradle Imperative, not declarative Relies on plugins Tasks Vanilla groovy Easy to build plugins Easy to do sub-projects
  • 33. Spock Built on JUnit Somewhat enhanced groovy “test names can be any string” given: when: then: expect: Built-in mocking Table-syntax for provided test data Pretty assert output
  • 34. Thanks! Adam L. Davis “Learning Groovy” github.com/adamldavis /2019-gr8conf adamldavis.com @adamldavis http://bit.ly/Gr8-2019BG How? Gedit + https://github.com/aeischeid/gedit-grails-bundle