Gradle Goodness: Alter Start Scripts from Application Plugin
For Java or Groovy projects we can use the application plugin in Gradle to run and package our application. The plugin adds for example the startScripts
task which creates OS specific scripts to run the project as a JVM application. This task is then used again by the installDist
that installs the application, and distZip
and distTar
tasks that create a distributable archive of the application. The startScripts
tasks has the properties unixScript
and windowsScript
that are the actual OS specific script files to run the application. We can use these properties to change the contents of the files.
In the following sample we add the directory configuration
to the CLASSPATH
definition:
...
startScripts {
// Support closures to add an additional element to
// CLASSPATH definition in the start script files.
def configureClasspathVar = { findClasspath, pathSeparator, line ->
// Looking for the line that starts with either CLASSPATH=
// or set CLASSPATH=, defined by the findClasspath closure argument.
line = line.replaceAll(~/^${findClasspath}=.*$/) { original ->
// Get original line and append it
// with the configuration directory.
// Use specified path separator, which is different
// for Windows or Unix systems.
original += "${pathSeparator}configuration"
}
}
def configureUnixClasspath = configureClasspathVar.curry('CLASSPATH', ':')
def configureWindowsClasspath = configureClasspathVar.curry('set CLASSPATH', ';')
// The default script content is generated and
// with the doLast method we can still alter
// the contents before the complete task ends.
doLast {
// Alter the start script for Unix systems.
unixScript.text =
unixScript
.readLines()
.collect(configureUnixClasspath)
.join('\n')
// Alter the start script for Windows systems.
windowsScript.text =
windowsScript
.readLines()
.collect(configureWindowsClasspath)
.join('\r\n')
}
}
...
This post was inspired by the Gradle build file I saw at the Gaiden project.
Written with Gradle 2.3.