Gradle is a popular and flexible build system for JVM-based languages. We use Gradle as the build system for Mesos Elasticsearch. In this blog I discuss two Gradle concepts: the Gradle wrapper and Gdub, a tool that allows you to run the Gradle wrapper from any subdirectory.
The Gradle wrapper, gradlew, is a shell script that downloads a specific Gradle distribution. This way a software project can configure a version of Gradle and everyone who runs gradlew will use the version specified in the project. This makes for a portable build. To try it out clone Mesos Elasticsearch and run
frank@franktop:~/src/mesos-elasticsearch$ ./gradlew clean build
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
Downloading https://services.gradle.org/distributions/gradle-2.3-all.zip
...
Now gradlew will fetch gradle version 2.3 and install it under ~/.gradle/wrapper/dists and use that version from then on. Neat! The Gradle wrapper scripts and config can be generated by adding a wrapper task in your build.gradle file. For more information on how to do this see the Official Gradle wrapper documentation.
If you have used gradlew for a while you probably recognize the following scenario. You want to run gradlew from a subdirectory. This subdirectory could be several levels deep so you have to invoke gradlew like this: ../../../gradlew. It may not sound like a problem but when you use your build system intensively it can become quite annoying. Luckily there is a simple solution...gdub! Gdub locates the gradle wrapper in an ancestor directory. Exactly what we want! Install gdub like this:
git clone https://github.com/dougborg/gdub.git
cd gdub
./install
and run gw plus any gradle tasks and off you go!
frank@franktop:~/src/mesos-elasticsearch/scheduler$ gw clean build
Using gradle at '/home/frank/src/mesos-elasticsearch/gradlew' to run buildfile '/home/frank/src/mesos-elasticsearch/scheduler/build.gradle':
...
For more information on Gdub checkout the Gdub Github page