Gradle Goodness: Running Groovy Scripts as Application
In a previous post we learned how to run a Java application in a Gradle project. The Java source file with a main
method is part of the project and we use the JavaExec
task to run the Java code. We can use the same JavaExec
task to run a Groovy script file.
A Groovy script file doesn't have an explicit main
method, but it is added when we compile the script file. The name of the script file is also the name of the generated class, so we use that name for the main
property of the JavaExec
task. Let's first create simple Groovy script file to display the current date. We can pass an extra argument with the date format we wan't to use.
// File: src/main/groovy/com/mrhaki/CurrentDate.groovy
package com.mrhaki
// If an argument is passed we assume it is the
// date format we want to use.
// Default format is dd-MM-yyyy.
final String dateFormat = args ? args[0] : 'dd-MM-yyyy'
// Output formatted current date and time.
println "Current date and time: ${new Date().format(dateFormat)}"
Our Gradle build file contains the task runScript
of type JavaExec
. We rely on the Groovy libraries included with Gradle, because we use localGroovy()
as a compile dependency. Of course we can change this to refer to another Groovy version if we want to using the group, name and version notation together with a valid repository.
// File: build.gradle
apply plugin: 'groovy'
dependencies {
compile localGroovy()
}
task runScript(type: JavaExec) {
description 'Run Groovy script'
// Set main property to name of Groovy script class.
main = 'com.mrhaki.CurrentDate'
// Set classpath for running the Groovy script.
classpath = sourceSets.main.runtimeClasspath
if (project.hasProperty('custom')) {
// Pass command-line argument to script.
args project.getProperty('custom')
}
}
defaultTasks 'runScript'
We can run the script with or without the project property custom
and we see the changes in the output:
$ gradle -q
Current date and time: 29-09-2014
$ gradle -q -Pcustom=yyyyMMdd
Current date and time: 20140929
$ gradle -q -Pcustom=yyyy
Current date and time: 2014
Code written with Gradle 2.1.