Gradle on wikipedia
Gradle is a build automation tool that builds upon the concepts of Apache Ant and Apache Maven and introduces a Groovy-based domain-specific language (DSL) instead of the more traditional XML form of declaring the project configuration. Gradle uses a directed acyclic graph ("DAG") to determine the order in which tasks can be run.
Gradle was designed for multi-project builds which can grow to be quite large, and supports incremental builds by intelligently determining which parts of the build tree are up-to-date, so that any task dependent upon those parts will not need to be re-executed.
If you have many projects that depend on a project, gradle will solve your problems. We will look into the basic of gradle build automation tool today. I love to code java and so I will use java as this demo. First, let's install gradle. If you are using deb based distribution like debian or ubuntu, to install gradle, it is as easy as $ sudo apt-get install gradle. Otherwise, you can download gradle from http://gradle.org/ and install in your system. Now let's create a gradle build file. See below.
user@localhost:~/gradle$ cat build.gradle
apply plugin: 'java'
user@localhost:~/gradle$ ls -a
total 36K
-rw-r--r-- 1 user user 21 Aug 6 17:15 build.gradle
drwxr-xr-x 214 user user 28K Aug 6 17:15 ..
drwxr-xr-x 2 user user 4.0K Aug 6 17:15 .
user@localhost:~/gradle$ gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build
BUILD SUCCESSFUL
Total time: 13.304 secs
user@localhost:~/gradle$ ls -a
total 44K
-rw-r--r-- 1 user user 21 Aug 6 17:15 build.gradle
drwxr-xr-x 214 user user 28K Aug 6 17:15 ..
drwxr-xr-x 3 user user 4.0K Aug 6 17:15 .gradle
drwxr-xr-x 4 user user 4.0K Aug 6 17:15 .
drwxr-xr-x 6 user user 4.0K Aug 6 17:15 build
user@localhost:~/gradle$ find .gradle/
.gradle/
.gradle/1.5
.gradle/1.5/taskArtifacts
.gradle/1.5/taskArtifacts/fileHashes.bin
.gradle/1.5/taskArtifacts/taskArtifacts.bin
.gradle/1.5/taskArtifacts/fileSnapshots.bin
.gradle/1.5/taskArtifacts/outputFileStates.bin
.gradle/1.5/taskArtifacts/cache.properties.lock
.gradle/1.5/taskArtifacts/cache.properties
user@localhost:~/gradle$ find build
build
build/libs
build/libs/gradle.jar
build/test-results
build/test-results/binary
build/test-results/binary/test
build/test-results/binary/test/results.bin
build/reports
build/reports/tests
build/reports/tests/report.js
build/reports/tests/index.html
build/reports/tests/base-style.css
build/reports/tests/style.css
build/tmp
build/tmp/jar
build/tmp/jar/MANIFEST.MF
one liner of input produce so many output files. Amazing! Why so many files that were generated, read the output of the command output, it compile, process resource, jar, assemble, test check and build. What are all these means, I will not explain to you one by one, you learn better if you read this definition yourself which is documented very well here. You might say, hey , I have different java source path can gradle handle this? Yes of cause! In the build path you created, you can add another line.
// set the source java folder to another non maven standard path
sourceSets.main.java.srcDirs = ['src/java']
Most of us coming from java has ant build file. If that is the case, gradle integrate nicely with ant too, you just need to import ant build file and then call ant target from gradle. See code snippet below.
user@localhost:~/gradle$ cat build.xml
<project>
<target name="helloAnt">
<echo message="hello this is ant."/>
</target>
</project>
user@localhost:~/gradle$ cat build.gradle
apply plugin: 'java'
// set the source java folder to another non maven standard path
sourceSets.main.java.srcDirs = ['src/java']
// import ant build file.
ant.importBuild 'build.xml'
user@localhost:~/gradle$ gradle helloAnt
:helloAnt
[ant:echo] hello this is ant.
BUILD SUCCESSFUL
Total time: 5.573 secs
That looks pretty good! If you curious about what gradle parameter that you can use during figuring out if the build went wrong, you should really read into this link. Also, if read on the environment variable as you can specify other jdk for gradle or even java parameter during compile big projects.
You might want to ask also, what if I only want to compile, I don't want to go through all the automatic builds above. No problem, since this is a java project, you specify compileJava.
user@localhost:~/gradle$ gradle compileJava
:compileJava UP-TO-DATE
BUILD SUCCESSFUL
Total time: 4.976 secs
As you can see, gradle is very flexible and because of that, you might want to exploit it further. For example, customizing the task in build.gradle, listing projects, listing tasks and others. For that, read here as it explain and give a lot of example how all that can be done. So at this stage, you might want to add more feature into gradle build file. Okay, let's do just that.
user@localhost:~/gradle$ cat build.gradle
apply plugin: 'java'
apply plugin: 'eclipse'
// set the source java folder to another non maven standard path
// default src/main/java
sourceSets.main.java.srcDirs = ['src/java']
// default src test
//src/test/java
// default src resources.
// src/main/resources
// default src test resources.
// src/test/resources
// default build
// build
// default jar built
// build/libs
// dependencies of external jar, we reference the very good from maven.
repositories {
mavenCentral()
}
// actual libs dependencies
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
test {
testLogging {
// Show that tests are run in the command-line output
events 'started', 'passed'
}
}
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart',
'Implementation-Version': version
}
}
// import ant build file.
ant.importBuild 'build.xml'
// common for subprojects
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.12'
}
version = '1.0'
jar {
manifest.attributes provider: 'gradle'
}
}
user@localhost:~/gradle$ cat settings.gradle
include ":nativeapp",":webapp"
Now, if you want to generate eclipse configuration, just run gradle eclipse, all eclipse configuration and setting are created automatically. Of cause, you can customize settings even further.
user@localhost:~/gradle$ gradle eclipse
:eclipseClasspath
Download http://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.pom
Download http://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12-sources.jar
Download http://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar
Download http://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar
:eclipseJdt
:eclipseProject
:eclipse
BUILD SUCCESSFUL
Total time: 19.497 secs
user@localhost:~/gradle$ find .
.
.
./build.xml
./build
./build/classes
./build/classes/test
./build/classes/test/org
./build/classes/test/org/just4fun
./build/classes/test/org/just4fun/voc
./build/classes/test/org/just4fun/voc/file
./build/classes/test/org/just4fun/voc/file/QuickTest.class
./build/libs
./build/libs/gradle.jar
./build/libs/gradle-1.0.jar
./build/test-results
./build/test-results/binary
./build/test-results/binary/test
./build/test-results/binary/test/results.bin
./build/test-results/TEST-org.just4fun.voc.file.QuickTest.xml
./build/reports
./build/reports/tests
./build/reports/tests/report.js
./build/reports/tests/index.html
./build/reports/tests/org.just4fun.voc.file.html
./build/reports/tests/base-style.css
./build/reports/tests/org.just4fun.voc.file.QuickTest.html
./build/reports/tests/style.css
./build/dependency-cache
./build/tmp
./build/tmp/jar
./build/tmp/jar/MANIFEST.MF
./webapp
./webapp/build.gradle
./.gradle
./.gradle/1.5
./.gradle/1.5/taskArtifacts
./.gradle/1.5/taskArtifacts/fileHashes.bin
./.gradle/1.5/taskArtifacts/taskArtifacts.bin
./.gradle/1.5/taskArtifacts/fileSnapshots.bin
./.gradle/1.5/taskArtifacts/outputFileStates.bin
./.gradle/1.5/taskArtifacts/cache.properties.lock
./.gradle/1.5/taskArtifacts/cache.properties
./.classpath
./build.gradle
./.project
./.settings
./.settings/org.eclipse.jdt.core.prefs
./settings.gradle
./nativeapp
./nativeapp/build.gradle
./src
./src/test
./src/test/java
./src/test/java/org
./src/test/java/org/just4fun
./src/test/java/org/just4fun/voc
./src/test/java/org/just4fun/voc/file
./src/test/java/org/just4fun/voc/file/QuickTest.java
Now, I create a simple unit test class file, see below. Then only run a single unit test, that's very cool.
user@localhost:~/gradle$ find src/
src/
src/test
src/test/java
src/test/java/org
src/test/java/org/just4fun
src/test/java/org/just4fun/voc
src/test/java/org/just4fun/voc/file
src/test/java/org/just4fun/voc/file/QuickTest.java
$ gradle -Dtest.single=Quick test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJavawarning: [options] bootstrap class path not set in conjunction with -source 1.5
1 warning
:processTestResources UP-TO-DATE
:testClasses
:test
org.just4fun.voc.file.QuickTest > test STARTED
org.just4fun.voc.file.QuickTest > test PASSED
BUILD SUCCESSFUL
Total time: 55.81 secs
user@localhost:~/gradle $
There are two additional directories created , that is nativeapp and webapp, this is subprojects for this big project and it contain its own gradle build file. At the parent of the gradle build file, we see a subprojects configuration as this will applied to all the subprojects. You can create a settings.gradle to specify the subprojects.
That's all for today, as this is just an introduction to quicklyl dive into some of the cool features of gradle, with this shown, I hope it give you some idea where to head next. Good luck!