Groovy (programming language)

From Wikipedia, the free encyclopedia
  (Redirected from Groovy language)
Jump to: navigation, search
Paradigm Object-oriented, imperative, scripting
Designed by James Strachan
Developer Guillaume Laforge (PMC Chair)
Jochen Theodorou (Tech Lead)
Paul King
Cedric Champeau
First appeared 2003; 14 years ago (2003)
Stable release
2.4.11 / April 26, 2017; 58 days ago (2017-04-26)
Preview release
2.5.0 Alpha 1 / March 30, 2017; 2 months ago (2017-03-30)
Typing discipline Dynamic, static, strong, duck
Platform Java SE
License Apache 2.0
Filename extensions .groovy
Influenced by
Java, Python, Ruby, Perl, Smalltalk, Objective-C

Apache Groovy is an object-oriented programming language for the Java platform. It is a dynamic language with features similar to those of Python, Ruby, Perl, and Smalltalk. It can be used as a scripting language for the Java Platform, is dynamically compiled to Java virtual machine (JVM) bytecode, and interoperates with other Java code and libraries. Groovy uses a Java-like curly-bracket syntax. Most Java code is also syntactically valid Groovy, although semantics may be different.

Groovy 1.0 was released on January 2, 2007, and Groovy 2.0 in July, 2012. Since version 2, Groovy can also be compiled statically, offering type inference, and performance near that of Java.[1][2] Groovy 2.4 was the last major release under Pivotal Software's sponsorship which ended in March 2015.[3] Groovy has since changed its governance structure to a Project Management Committee (PMC) in the Apache Software Foundation.[4]


James Strachan first talked about the development of Groovy on his blog in August 2003.[5] Several versions were released between 2004 and 2006. After the Java Community Process (JCP) standardization effort began, the version numbering changed and a version called "1.0" was released on January 2, 2007. After various betas and release candidates numbered 1.1, on December 7, 2007, Groovy 1.1 Final was released and immediately renumbered as Groovy 1.5 to reflect the many changes made.

In 2007, Groovy won the first prize at JAX 2007 innovation award.[6] In 2008, Grails, a Groovy web framework, won the second prize at JAX 2008 innovation award.[7]

In November 2008, SpringSource acquired the Groovy and Grails company (G2One).[8] In August 2009 VMWare acquired SpringSource.[9]

Strachan had left the project silently a year before the Groovy 1.0 release in 2007.[citation needed] In Oct 2016, Strachan stated "I still love groovy (jenkins pipelines are so groovy!), java, go, typescript and kotlin".[10]

In March 2004, Groovy had been submitted to the JCP as JSR 241[11] and accepted by ballot. After 8 years of inactivity, the Spec Lead changed its status to dormant in April 2012.

On July 2, 2012, Groovy 2.0 was released, which, among other new features, added static compiling and static type checking.

When the Pivotal Software joint venture was spun-off by EMC Corporation (EMC) and VMware in April 2013, Groovy and Grails formed part of its product portfolio. Pivotal ceased sponsoring Groovy and Grails from April 2015.[3] That same month, Groovy changed its governance structure from a Codehaus repository to a Project Management Committee (PMC) in the Apache Software Foundation via its incubator.[4] Groovy graduated from Apache's incubator and became a top-level project in November 2015.[12]


Most valid Java files are also valid Groovy files. Although the two languages are similar, Groovy code can be more compact, because it does not need all the elements that Java needs.[13] This makes it possible for Java programmers to learn Groovy gradually by starting with familiar Java syntax before acquiring more Groovy programming idioms.[14]

Groovy features not available in Java include both static and dynamic typing (with the keyword def), operator overloading, native syntax for lists and associative arrays (maps), native support for regular expressions, polymorphic iteration, expressions embedded inside strings, added helper methods, and the safe navigation operator ?. to check automatically for null pointers (for example, variable?.method(), or variable?.field).[15]

Since version 2 Groovy also supports modularity (being able to ship only the needed jars according to the project needs, thus reducing the size of groovy's library), type checking, static compiling, Project Coin syntax enhancements, multicatch blocks and ongoing performance enhancements using JDK7's invoke dynamic instruction.[16]

Groovy provides native support for various markup languages such as XML and HTML, accomplished via an inline Document Object Model (DOM) syntax. This feature enables the definition and manipulation of many types of heterogeneous data assets with a uniform and concise syntax and programming methodology.[citation needed]

Unlike Java, a Groovy source code file can be executed as an (uncompiled) script if it contains code outside any class definition, if it is a class with a main method, or if it is a Runnable or GroovyTestCase. A Groovy script is fully parsed, compiled, and generated before executing (similar to Perl and Ruby). This occurs under the hood, and the compiled version is not saved as an artifact of the process.[17]

GroovyBeans, properties[edit]

GroovyBeans are Groovy's version of JavaBeans. Groovy implicitly generates getters and setters. In the following code, setColor(String color) and getColor() are implicitly generated. The last two lines, which appear to access color directly, are actually calling the implicitly generated methods.[18]

class AGroovyBean {
  String color

def myGroovyBean = new AGroovyBean()

myGroovyBean.setColor('baby blue')
assert myGroovyBean.getColor() == 'baby blue'

myGroovyBean.color = 'pewter'
assert myGroovyBean.color == 'pewter'

Groovy offers simple, consistent syntax for handling lists and maps, reminiscent of Java's array syntax.[19]

def movieList = ['Dersu Uzala', 'Ran', 'Seven Samurai']  //looks like an array, but is a list
assert movieList[2] == 'Seven Samurai'
movieList[3] = 'Casablanca'  // adds an element to the list
assert movieList.size() == 4

def monthMap = [ 'January' : 31, 'February' : 28, 'March' : 31 ]  //declares a map
assert monthMap['March'] == 31  // accesses an entry
monthMap['April'] = 30  // adds an entry to the map
assert monthMap.size() == 4

Prototype extension[edit]

Groovy offers support for prototype extension through ExpandoMetaClass, Extension Modules (only in Groovy 2), Objective-C-like Categories and DelegatingMetaClass.[20]

ExpandoMetaClass offers a domain-specific language (DSL) to express the changes in the class easily, similar to Ruby's open class concept:

Number.metaClass {
  sqrt = { Math.sqrt(delegate) }

assert 9.sqrt() == 3
assert 4.sqrt() == 2

Groovy's changes in code through prototyping are not visible in Java, since each attribute/method invocation in Groovy goes through the metaclass registry. The changed code can only be accessed from Java by going to the metaclass registry.

Groovy also allows overriding methods as getProperty(), propertyMissing() among others, enabling the developer to intercept calls to an object and specify an action for them, in a simplified aspect-oriented way. The following code enables the class java.lang.String to respond to the hex property:

enum Color {
  BLACK('#000000'), WHITE('#FFFFFF'), RED('#FF0000'), BLUE('#0000FF')
  String hex
  Color(String hex) { 
    this.hex = hex 

String.metaClass.getProperty = { String property ->
  def stringColor = delegate
  if (property == 'hex') {
    Color.values().find { stringColor }?.hex

assert "WHITE".hex == "#FFFFFF"
assert "BLUE".hex == "#0000FF"
assert "BLACK".hex == "#000000"
assert "GREEN".hex == null

The Grails framework uses metaprogramming extensively to enable GORM dynamic finders, like User.findByName('Josh') and others.[21]

Dot and parentheses[edit]

Groovy's syntax permits omitting parentheses and dots in some situations. The following groovy code

take(coffee).with(sugar, milk).and(liquor)

can be written as

take coffee with sugar, milk and liquor

enabling the development of domain-specific languages (DSLs) which look like plain English.

Functional programming[edit]

Although Groovy is mostly an object-oriented language, it also offers functional programming features.


According to Groovy's documentation: "Closures in Groovy work similar to a 'method pointer', enabling code to be written and run in a later point in time".[22] Groovy's closures support free variables, i.e. variables which have not been explicitly passed as a parameter to it, but exist in its declaration context, partial application (which it terms 'currying'[23]), delegation, implicit, typed and untyped parameters.

When working on Collections of a determined type, the closure passed to an operation on the collection can be inferred:

list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

 * Non-zero numbers are coerced to true, so when it % 2 == 0 (even), it is false.
 * The type of the implicit "it" parameter can be inferred as an Integer by the IDE.
 * It could also be written as:
 * list.findAll { Integer i -> i % 2 }
 * list.findAll { i -> i % 2 }
def odds = list.findAll { it % 2 }

assert odds == [1, 3, 5, 7, 9]

A group of expressions can be written in a closure block without reference to an implementation and the responding object can be assigned at a later point using delegation:

// This block of code contains expressions without reference to an implementation
def operations = {
  declare 5
  sum 4
  divide 3
 * This class will handle the operations that can be used in the closure above. Another class
 * could be declared having the same methods, but using, for example, webservice operations in the
 * calculations.
class Expression {
  BigDecimal value

   * Though an Integer is passed as a parameter, it is coerced into a BigDecimal, as was defined. 
   * If the class had a 'declare(Integer value)' method, it would be used instead.
  def declare(BigDecimal value) {
    this.value = value
  def sum(BigDecimal valueToAdd) {
    this.value += valueToAdd
  def divide(BigDecimal divisor) {
    this.value /= divisor
  def propertyMissing(String property) {
    if (property == "print") println value
// Here is defined who is going to respond the expressions in the block
operations.delegate = new Expression()


Usually called partial application,[23] this Groovy feature allows closures' parameters to be set to a default parameter in any of their arguments, creating a new closure with the bound value. Supplying one argument to the curry() method will fix argument one. Supplying N arguments will fix arguments 1..N.

def joinTwoWordsWithSymbol = { symbol, first, second -> first + symbol + second }
assert joinTwoWordsWithSymbol('#', 'Hello', 'World') == 'Hello#World'

def concatWords = joinTwoWordsWithSymbol.curry(' ')
assert concatWords('Hello', 'World') == 'Hello World'

def prependHello = concatWords.curry('Hello')
// def prependHello = joinTwoWordsWithSymbol.curry(' ', 'Hello')
assert prependHello('World') == 'Hello World'

Curry can also be used in the reverse direction (fixing arguments N to N-1) using rcurry.

def power = { BigDecimal value, BigDecimal power ->
  value ** power

def square = power.rcurry(2)
def cube = power.rcurry(3)

assert power(2, 2) == 4
assert square(4) == 16
assert cube(3) == 27

Groovy also supports lazy evaluation,[24][25] reduce/fold,[26] infinite structures and immutability,[27] among others.[28]

XML and JSON processing[edit]

On XML and JavaScript Object Notation (JSON) processing Groovy employs the Builder pattern, making the production of the data structure less verbose. For example, the following XML:

  <language year="1995">
    <paradigm>Object oriented</paradigm>
  <language year="1995">
    <paradigm>Object oriented, Functional</paradigm>
    <typing>Dynamic, duck typing</typing>
  <language year="2003">
    <paradigm>Object oriented, Functional</paradigm>
    <typing>Dynamic, Static, Duck typing</typing>

Can be generated via the following Groovy code:

def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.languages {
  language(year: 1995) {
    name "java"
    paradigm "Object oriented"
    typing "Static"
  language (year: 1995) {
    name "ruby"
    paradigm "Object oriented, Functional"
    typing "Dynamic, Duck typing"
  language (year: 2003) {
    name "groovy"
    paradigm "Object oriented, Functional"
    typing "Dynamic, Static, Duck typing"

And also can be processed in a streaming way through StreamingMarkupBuilder. To change the implementation to JSON, the MarkupBuilder can be swapped to JsonBuilder.[29]

To parse it and search for a functional language Groovy's findAll method can serve:

def languages = new XmlSlurper().parseText writer.toString()

// Here is employed groovy's regex syntax for a matcher (=~) which will be coerced to a boolean value: 
// either true if the value contains our string, or false otherwise.
def functional = languages.language.findAll { it.paradigm =~ "functional" }
assert functional.collect { } == ["ruby", "groovy"]

String interpolation[edit]

In Groovy, the string can be interpolated with variables and expressions by using GStrings:[30]

BigDecimal account = 10.0
def text = "The account shows currently a balance of $account"
assert text == "The account shows currently a balance of 10.0"

GStrings containing variables and expressions must be declared using double quotes.

A complex expression must be enclosed in curly brackets. This prevents parts of it from being interpreted as belonging to the surrounding string instead of to the expression:

BigDecimal minus = 4.0
text = "The account shows currently a balance of ${account - minus}"
assert text == "The account shows currently a balance of 6.0"

// Without the brackets to isolate the expression, this would result:
text = "The account shows currently a balance of $account - minus"
assert text == "The account shows currently a balance of 10.0 - minus"

Expression evaluation can be deferred by employing arrow syntax:

BigDecimal tax = 0.15
text = "The account shows currently a balance of ${->account - account * tax}"
tax = 0.10

// The tax value was changed AFTER declaration of the GString. The expression 
// variables are bound only when the expression must actually be evaluated:

assert text == "The account shows currently a balance of 9.000"

Abstract syntax tree transformation[edit]

According to Groovy's own documentation, "When the Groovy compiler compiles Groovy scripts and classes, at some point in the process, the source code will end up being represented in memory in the form of a Concrete Syntax Tree, then transformed into an Abstract Syntax Tree. The purpose of AST Transformations is to let developers hook into the compilation process to be able to modify the AST before it is turned into bytecode that will be run by the JVM. AST Transformations provides Groovy with improved compile-time metaprogramming capabilities allowing powerful flexibility at the language level, without a runtime performance penalty."[31]

Examples of ASTs in Groovy are:

  • Singleton transformation
  • Category and Mixin transformation
  • Immutable AST Macro
  • Newify transformation

Among others.


According to Groovy's documentation, "Traits are a structural construct of the language which allow: composition of behaviors, runtime implementation of interfaces, behavior overriding, and compatibility with static type checking/compilation."

Traits can be seen as interfaces carrying both default implementations and state. A trait is defined using the trait keyword:

trait FlyingAbility { /* declaration of a trait */
    String fly() { "I'm flying!" } /* declaration of a method inside a trait */

Then it can be used like a normal interface using the keyword implements:

class Bird implements FlyingAbility {} /* Adds the trait FlyingAbility to the Bird class capabilities */
def b = new Bird() /* instantiate a new Bird */
assert == "I'm flying!" /* the Bird class automatically gets the behavior of the FlyingAbility trait */

Traits allow a wide range of abilities, from simple composition to testing.


  • Oracle Sales Cloud uses Groovy as the main scripting language to enhance the application.[32]
  • eXo Platform, an Open Source Enterprise Social Collaboration Platform uses Groovy.
  • uses Groovy and Grails for the Product Reviews standalone section of the website.[33]
  • Though Groovy can be integrated into any JVM environment, the JBoss Seam framework provides Groovy, besides Java, as a development language, out of the box.[34]
  • The European Patent Office (EPO) developed a dataflow programming language in Groovy "to leverage similarities in the processes for communicating with each individual country’s patent office, and transform them into a single, universal process."[citation needed]
  • Linkedin uses Groovy and Grails for some of their subsystems.[35]
  • XWiki SAS uses Groovy as scripting language in their collaborative open-source product.[36]
  • SoapUI provides Groovy as a language for webservice tests development.[37]
  • uses Groovy and Grails to serve massive online media content.[38]
  • DataMelt integrates Groovy into a numeric and statistic data-analysis framework
  • uses Groovy for all of the user defined mathematics in its math crowd-sourcing engine.[39]
  • Eucalyptus, a cloud management system, uses a significant amount of Groovy.
  • Apache OFBiz, the open source enterprise resource planning (ERP) system, uses Groovy.[40][41]
  • SmartThings, an open platform for smart homes and the consumer Internet of Things, uses a security-oriented subset of Groovy[42]
  • Survata, a market research startup, uses Groovy and Grails.[citation needed]
  • Jenkins, a platform for continuous integration. With version 2, Jenkins includes a Pipeline plugin that allows for build instructions to be written in Groovy.[43]

IDE support[edit]

Many integrated development environments (IDEs) and text editors support Groovy:

See also[edit]



  1. ^ "Groovy 2.0 Performance compared to Java". 25 Aug 2012. 
  2. ^ "Java vs Groovy2.0 vs Scala Simple Performance Test". 10 Jul 2012. 
  3. ^ a b "Groovy 2.4 And Grails 3.0 To Be Last Major Releases Under Pivotal Sponsorship". 19 Jan 2015. 
  4. ^ a b "Groovy joins Apache Incubator". 11 Mar 2015. 
  5. ^ James Strachan (29 Aug 2003). "Groovy - the birth of a new dynamic language for the Java platform". 
  6. ^ "Groovy wins first prize at JAX 2007 innovation award". 2007-04-26. 
  7. ^ "They say a lot can happen over a cup of coffee". 
  8. ^ "SpringSource Acquires Groovy and Grails company (G2One)". 11 Nov 2008. 
  9. ^ "VMWare Acquires SpringSource". 10 Aug 2009. 
  10. ^ "Tweet from James Strachan". November 24, 2016. Retrieved 2016-11-24. 
  11. ^ "Java Community Process JSR 241". 
  12. ^ "Announcement on dev mailing list". 
  13. ^ König 2007, pg. 32
  14. ^ "Groovy style and language feature guidelines for Java developers". Retrieved 2015-01-22. 
  15. ^ "Groovy – Differences from Java". Retrieved 2013-08-12. 
  16. ^ "What's new in Groovy 2.0?". 28 Jun 2012. 
  17. ^ König 2007, pp. 37-8
  18. ^ König 2007, pp. 38-9
  19. ^ König 2007, pp. 41-3
  20. ^ "JN3525-MetaClasses". 
  21. ^ "Metaprogramming Techniques in Groovy and Grails". 11 Jun 2009. 
  22. ^ "Groovy - Closures". 
  23. ^ a b "Does groovy call partial application 'currying'". 10 Aug 2013
  24. ^ "Groovy - Lazy Transformation". 
  25. ^ "Side Notes: Lazy lists in Groovy". 3 Feb 2011. 
  26. ^ "Groovy's Fold". 20 Jun 2011. 
  27. ^ "Functional Programming with Groovy". 5 Nov 2011. 
  28. ^ "Function programming in Groovy". 
  29. ^ "JsonBuilder". 
  30. ^ "Groovy Strings - Different ways of creating them". 26 Dec 2009. 
  31. ^ "Compile-time Metaprogramming - AST Transformations". 
  32. ^ "Oracle Sales Cloud Groovy Scripting Reference" (PDF). Retrieved 2017-04-26. 
  33. ^ "Wired.Com" (PDF). Retrieved 2015-06-02. 
  34. ^ "Chapter 11. Groovy integration". Retrieved 2015-06-02. 
  35. ^ "Grails at LinkedIn". Retrieved 2015-06-02. 
  36. ^ "XWiki SAS" (PDF). Retrieved 2015-06-02. 
  37. ^ "Scripting and the Script Library | Scripting & Properties". Retrieved 2015-06-02. 
  38. ^ Rocher, Graeme (October 2, 2008). "Graeme Rocher's Blog: relaunches written in Grails". Graeme Rocher's Blog. Retrieved 2015-06-02. 
  39. ^ "vCalc, the First ever Social Platform for the world of Math". Retrieved 2016-05-05. 
  40. ^ "Groovy DSL for OFBiz business logic". Apache OFBiz Project Open Wiki. 
  41. ^ "Simple-methods examples using Groovy". Apache OFBiz Project Open Wiki. 
  42. ^ Security Analysis of Emerging Smart Home Applications
  43. ^ "Jenkins Pipeline". 


External links[edit]