Gradle Introduction


Published on

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Gradle Introduction

  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
  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;…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 << { { fileset(dir: src) { include(name: **.xml) exclude(name: **.java) } }}
  18. 18. Ant usage examples IIant.taskdef(resource: { 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’ }} += ["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
  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 { } .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.text.contains(staging) }}
  26. 26. Repository configurationrepositories { mavenCentral()}repositories { mavenCentral name: single-jar-repo, urls: "" mavenCentral name: multi-jar-repos, urls: ["", ""]}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 }}
  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: " + }} >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 (^.*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: 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
  37. 37. Resources ◦ /tutorials ◦ /current/docs/userguide/userguide.html ◦ /current/docs/dsl/index.html ◦ /gapi/ ◦ /groovy-jdk/ ◦ /User+Guide
  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 .”
  39. 39. QUESTIONS?