Your SlideShare is downloading. ×
0
Introduction to GradleAndrey AdamovichAestas/IT
What is Gradle?   Gradle is a general purpose build system   It comes with a rich build description    language (DSL) ba...
What’s in this presentation? Overview Basic features & principles Files and file collections Dependencies Multiple pr...
OVERVIEW
Gradle features I Declarative builds and build-by-  convention Language for dependency based  programming and many ways ...
Gradle features II Deep and rich API for managing  projects, tasks, dependency  artefacts and much more. State of the ar...
Advanced features Parallel unit test execution Dependency build Incremental build support Dynamic tasks and task rules...
Who uses Gradle?   Hibernate               Canoo   Grails                  Carrier   Groovy                  FCC   ...
BASIC FEATURES &PRINCIPLES
Hello, Gradle!build.gradle:task hello << {  println ’Hello, World}            >gradle hello                :hello         ...
Task configuration & executiontask hellomessage = "Whats up?"hello {  println "Configuring hello task."  message = Hello, ...
Gradle is Groovy, Groovy is JavaJava:import java.io.File;…String parentDir = new File(”test.txt”)                     .get...
Building Java projectapply plugin: java                       >gradle clean build                       :clean            ...
Java plug-in tasks compileJava         processResources                    clean                            classes       ...
Extending taskstest {  systemProperties ("net.sourceforge.cobertura.datafile": cobSerFile)  cobSerFile = "${project.buildD...
Ant is a first-class citizen   All Ant tasks and types can be used    inside Gradle script using Groovy    syntax   Whol...
Ant usage examples Itask hello << {  String greeting = "hello from Ant"  ant.echo(message: greeting)}task list << {  def p...
Ant usage examples IIant.taskdef(resource: checkstyletask.properties) {  classpath {    fileset(dir: libs/checkstyle, incl...
Overriding conventionsversion = 1.0group = ’org.gradletutorials’version = "1.0-${new Date().format(yyyyMMdd)}"task release...
More examples Many source directory sets per  project without a need of a plug-in Different dependencies per source  dir...
FILES AND FILECOLLECTIONS
Referencing files & file collectionsGroovy-like syntax:// Using a relative pathFile configFile = file(src/config.xml)Creat...
Using file collections as inputMany objects in Gradle have properties, which accept a set ofinput files. For example, the ...
Copying filesUsing Ant integration:ant.copy(todir: javadoc) {  fileset(dir: build/docs)}Using Gradle task type:task copyTa...
DEPENDENCYMANAGEMENT
Repository configurationrepositories {  mavenCentral()}repositories {  mavenCentral name: single-jar-repo, urls: "http://r...
Referencing dependenciesdependencies {  runtime files(libs/a.jar, libs/b.jar)  runtime fileTree(dir: libs, includes: [*.ja...
Transitive dependenciesconfigurations.compile.transitive = truedependencies {  compile org.springframework:spring-webmvc:3...
MULTI-PROJECT BUILDS
Directories & settings.gradlesettings.gradle:include shared, api, :service:service1, :service:service2                    ...
All or somethingallprojects {  task build << {    println "Building project: " + project.name  }}                         ...
Inter-project dependenciessubprojects {  apply plugin: java  if (project.name.matches(^.*serviced+$)) {    dependencies { ...
PLUGINS
Extending your buildAny Gradle script can be a plug-in:apply from: otherScript.gradleapply from: http://mycomp.com/otherSc...
Standard plug-insPlug-in ID                   Plug-in IDbase                         application (java, groovy)java-base  ...
READING MATERIAL
Resources   http://www.gradle.org    ◦ /tutorials    ◦ /current/docs/userguide/userguide.html    ◦ /current/docs/dsl/inde...
Literature                         “Build and test software written in Java and                         many other languag...
QUESTIONS?
Upcoming SlideShare
Loading in...5
×

Introduction to Gradle

7,854

Published on

Presentation of Gradle features on a local JUG meeting in Riga

Published in: Technology

Transcript of "Introduction to Gradle "

  1. 1. Introduction to GradleAndrey AdamovichAestas/IT
  2. 2. What is Gradle? Gradle is a general purpose build system It comes with a rich build description language (DSL) based on Groovy It supports ”build-by-convention” principle But it is very flexible and extensible It has built-in plug-ins for Java, Groovy, Scala, Web, OSGi It derives all the best and integrates well with Ivy, Ant and Maven
  3. 3. What’s in this presentation? Overview Basic features & principles Files and file collections Dependencies Multiple projects Plug-ins Reading material Questions
  4. 4. OVERVIEW
  5. 5. Gradle features I Declarative builds and build-by- convention Language for dependency based programming and many ways to manage dependencies Groovy as a base language allows imperative programming
  6. 6. Gradle features II Deep and rich API for managing projects, tasks, dependency artefacts and much more. State of the art support for multi- project builds Ease of integration and migration. Ant, Maven, Ivy are supported out- of-the-box Free and open source
  7. 7. Advanced features Parallel unit test execution Dependency build Incremental build support Dynamic tasks and task rules Gradle daemon
  8. 8. Who uses Gradle? Hibernate  Canoo Grails  Carrier Groovy  FCC Spring Integration  Zeppelin Spring Security  GPars Griffon  Spock Gaelyk  Aluminum Qi4j  Gant
  9. 9. BASIC FEATURES &PRINCIPLES
  10. 10. Hello, Gradle!build.gradle:task hello << { println ’Hello, World} >gradle hello :hello Hello, World! BUILD SUCCESSFUL Total time: 2.401 secsbuild.gradle:task hello << { print ’Hello, }task world(dependsOn: hello) << { println ’World!} >gradle -q hello world Hello, World! >gradle -q world Hello, World!
  11. 11. Task configuration & executiontask hellomessage = "Whats up?"hello { println "Configuring hello task." message = Hello, World!}hello << { println message >gradle hello} Configuring hello task. :hello Hello, World!hello << { Whats up? println project.message BUILD SUCCESSFUL} Total time: 1.958 secs
  12. 12. Gradle is Groovy, Groovy is JavaJava:import java.io.File;…String parentDir = new File(”test.txt”) .getAbsoluteFile() .getParentPath();Groovy:def parentDir = new File(”test.txt”).absoluteFile.parentPathGradle:parentDir = file(”test.txt”).absoluteFile.parentPath
  13. 13. Building Java projectapply plugin: java >gradle clean build :clean :compileJava :processResources UP-TO-DATE :classes :jar :assemble :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test :check :build BUILD SUCCESSFUL Total time: 7.6 secs
  14. 14. Java plug-in tasks compileJava processResources clean classes javadoccompileTestJava processTestResources jar testClasses test uploadArchives check assemble build
  15. 15. Extending taskstest { systemProperties ("net.sourceforge.cobertura.datafile": cobSerFile) cobSerFile = "${project.buildDir}/cobertura.ser"}test.doFirst { ant { delete(file: cobSerFile, failonerror: false) cobertura-instrument(datafile: cobSerFile) { fileset(dir: "${sourceSets.main.classesDir}", includes: "**/*.class") } } }}test.doLast { ant.cobertura-report( destdir: "${project.buildDirName}/test-results", format: xml, srcdir: "src/main/java", datafile: cobSerFile)}
  16. 16. Ant is a first-class citizen All Ant tasks and types can be used inside Gradle script using Groovy syntax Whole Ant build script can be imported into Gradle and its targets can be called
  17. 17. Ant usage examples Itask hello << { String greeting = "hello from Ant" ant.echo(message: greeting)}task list << { def path = ant.path { fileset(dir: libs, includes: *.jar) } path.list().each { println it }}task zip << { ant.zip(destfile: archive.zip) { fileset(dir: src) { include(name: **.xml) exclude(name: **.java) } }}
  18. 18. Ant usage examples IIant.taskdef(resource: checkstyletask.properties) { classpath { fileset(dir: libs/checkstyle, includes: *.jar) }}ant.checkstyle(config: src/tools/sun_checks.xml) { fileset(dir: src)}<project> <target name="hello"> <echo>Hello, from Ant</echo> </target></project> >gradle hello :hello [ant:echo] Hello, from Antant.importBuild build.xml BUILD SUCCESSFUL Total time: 7.898 secs
  19. 19. Overriding conventionsversion = 1.0group = ’org.gradletutorials’version = "1.0-${new Date().format(yyyyMMdd)}"task release(dependsOn: assemble) << { println We release now}build.taskGraph.whenReady { taskGraph -> if (taskGraph.hasTask(:release)) { version = 1.0’ } else { version = 1.0-SNAPSHOT’ }}sourceSets.main.java.srcDirs += ["src/generated/java"]sourceSets.main.resources.srcDirs += ["src/generated/resources"]
  20. 20. More examples Many source directory sets per project without a need of a plug-in Different dependencies per source directory Even different JDK per source directory Many artifacts per project
  21. 21. FILES AND FILECOLLECTIONS
  22. 22. Referencing files & file collectionsGroovy-like syntax:// Using a relative pathFile configFile = file(src/config.xml)Create a file collection from a bunch of files:FileCollection collection = files( src/file1.txt, new File(src/file2.txt), [src/file3.txt, src/file4.txt])Create a files collection by referencing project properties:collection = files { srcDir.listFiles() }Operations on collections:def union = collection + files(src/file4.txt)def different = collection - files(src/file3.txt)}
  23. 23. Using file collections as inputMany objects in Gradle have properties, which accept a set ofinput files. For example, the compile task has a source property,which defines the source files to compile. You can set the valueof this property using any of the types supported by the files()method:// Use a File object to specify the source directory.compile { source = file(src/main/java)}// Using a closure to specify the source files.compile { source = { // Use the contents of each zip file in the src dir. file(src) .listFiles() .findAll { it.name.endsWith(.zip) } .collect { zipTree(it) } } }}1
  24. 24. Copying filesUsing Ant integration:ant.copy(todir: javadoc) { fileset(dir: build/docs)}Using Gradle task type:task copyTask(type: Copy) { from src/main/webapp‘ into build/explodedWar‘ include **/*.jsp‘ exclude { details -> details.file.name.endsWith(.html) && details.file.text.contains(staging) }}
  25. 25. DEPENDENCYMANAGEMENT
  26. 26. Repository configurationrepositories { mavenCentral()}repositories { mavenCentral name: single-jar-repo, urls: "http://repo.mycompany.com/jars" mavenCentral name: multi-jar-repos, urls: ["http://repo.mycompany.com/jars1", "http://repo.mycompany.com/jars1"]}repositories { flatDir name: localRepository, dirs: lib flatDir dirs: [lib1, lib2]}repositories { add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) { name = localRepository latestStrategy = new org.apache.ivy.plugins.latest.LatestTimeStrategy() addArtifactPattern(libDir + /[organization]/[artifact]/[ext]s/[artifact]-[revision].[ext]) }}
  27. 27. Referencing dependenciesdependencies { runtime files(libs/a.jar, libs/b.jar) runtime fileTree(dir: libs, includes: [*.jar])}dependencies { compile org.springframework:spring-webmvc:3.0.0.RELEASE testCompile org.springframework:spring-test:3.0.0.RELEASE testCompile junit:junit:4.7}dependencies { runtime group: org.springframework, name: spring-core, version: 2.5 runtime org.springframework:spring-core:2.5, org.springframework:spring-aop:2.5}List groovy = ["org.codehaus.groovy:groovy-all:1.5.4@jar", "commons-cli:commons-cli:1.0@jar", "org.apache.ant:ant:1.7.0@jar"]List hibernate = [org.hibernate:hibernate:3.0.5@jar, somegroup:someorg:1.0@jar]dependencies { runtime groovy, hibernate}
  28. 28. Transitive dependenciesconfigurations.compile.transitive = truedependencies { compile org.springframework:spring-webmvc:3.0.0.RC2 runtime org.hibernate:hibernate:3.0.5}dependencies { compile org.springframework:spring-webmvc:3.0.0.RC2 runtime(org.hibernate:hibernate:3.0.5) { transitive = true }}
  29. 29. MULTI-PROJECT BUILDS
  30. 30. Directories & settings.gradlesettings.gradle:include shared, api, :service:service1, :service:service2  You can have only one build file for the whole multi-project build  All properties, settings, plug-ins, dependencies are derived without a need to duplicate information  You can override almost all behaviour in child builds
  31. 31. All or somethingallprojects { task build << { println "Building project: " + project.name }} >gradle build :buildsubprojects { Building project: 90-multi-project task prebuild << { :api:prebuild println "It is subproject!" It is subproject! :api:build } Building project: api build.dependsOn prebuild :service:prebuild} It is subproject! :service:build Building project: service :shared:prebuild It is subproject! :shared:build Building project: shared :service:service1:prebuild It is subproject! :service:service1:build Building project: service1 :service:service2:prebuild It is subproject! :service:service2:build Building project: service2 BUILD SUCCESSFUL Total time: 9.684 secs
  32. 32. Inter-project dependenciessubprojects { apply plugin: java if (project.name.matches(^.*serviced+$)) { dependencies { >gradle clean build compile project(:api) :api:clean compile project(:shared) :service:clean } :shared:clean } :service:service1:clean :service:service2:clean} :service:service1:compileJava :shared:compileJava UP-TO-DATE :service:service1:processResources UP-TO-DATE :shared:processResources UP-TO-DATE :service:service1:classesproject(:api) { :shared:classes UP-TO-DATE :service:service1:jar dependencies { :shared:jar :service:service1:assemble :api:compileJava compile project(:shared) :service:service1:compileTestJava :api:processResources UP-TO-DATE :service:service1:processTestResources UP-TO- } :api:classes DATE} :api:jar :service:service1:testClasses :api:assemble :service:service1:test :api:compileTestJavadependsOnChildren() :service:service1:check :api:processTestResources UP-TO-DATE:service:service1:build :api:testClasses :service:service2:compileJava :api:test :service:service2:processResources UP-TO-DATE :api:check :service:service2:classes :api:build :service:service2:jar :service:compileJava UP-TO-DATE :service:service2:assemble :service:processResources UP-TO-DATE:service:service2:compileTestJava :service:classes UP-TO-DATE :service:service2:processTestResources UP-TO- :service:jar DATE :service:assemble :service:service2:testClasses :service:compileTestJava UP-TO-DATE :service:service2:test :service:processTestResources UP-TO-DATE :service:service2:check :service:testClasses UP-TO-DATE :service:service2:build :service:test UP-TO-DATE :service:check UP-TO-DATE BUILD SUCCESSFUL :service:build :shared:assemble Total time: 3.75 secs :shared:compileTestJava UP-TO-DATE :shared:processTestResources UP-TO-DATE :shared:testClasses UP-TO-DATE :shared:test UP-TO-DATE :shared:check UP-TO-DATE :shared:build
  33. 33. PLUGINS
  34. 34. Extending your buildAny Gradle script can be a plug-in:apply from: otherScript.gradleapply from: http://mycomp.com/otherScript.gradleUse many of the standard or 3rd-party plug-ins:apply plugin: javaapply plugin: groovyapply plugin: scalaapply plugin: warConfiguration objects can be externalized:task configure << { pos = new java.text.FieldPosition(10) // Apply the script. apply from: position.gradle, to: pos println pos.beginIndex println pos.endIndex position.gradle:} beginIndex = 1; endIndex = 5;
  35. 35. Standard plug-insPlug-in ID Plug-in IDbase application (java, groovy)java-base jetty (war)groovy-base maven (java, war)scala-base osgi (java-base, java)reporting-base war (java)java (java-base) code-quality (reporting-base, java, groovy)groovy (java, groovy-base) eclipse (java, groovy, scala, war)scala (java, scala-base) idea (java)antlr (java) project-report (reporting-base)announce sonar
  36. 36. READING MATERIAL
  37. 37. Resources http://www.gradle.org ◦ /tutorials ◦ /current/docs/userguide/userguide.html ◦ /current/docs/dsl/index.html http://groovy.codehaus.org ◦ /gapi/ ◦ /groovy-jdk/ ◦ /User+Guide http://ant.apache.org/manual
  38. 38. Literature “Build and test software written in Java and many other languages with Gradle, the open source project automation tool that’s getting a lot of attention. This concise introduction provides numerous code examples to help you explore Gradle, both as a build tool and as a complete solution for automating the compilation, test, and release process of simple and enterprise-level applications .” http://shop.oreilly.com/product/0636920019909.do
  39. 39. QUESTIONS?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×