Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
Gradle - the Enterprise Automation Tool
Next
Download to read offline and view in fullscreen.

Share

Introduction to Gradle

Download to read offline

Presentation of Gradle features on a local JUG meeting in Riga

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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?
  • teddyzhu

    May. 25, 2016
  • MathiyalaganSubraman

    Oct. 29, 2015
  • HarrisMakatsoris

    Oct. 1, 2015
  • marcosluna79

    Jul. 16, 2015
  • MikeLiu9

    Jun. 17, 2015
  • ChaitanyaKotamReddy

    Jun. 10, 2015
  • PrakashBadhe

    May. 4, 2015
  • debop

    Apr. 27, 2015
  • edivaldman

    Mar. 28, 2015
  • fofo173

    Dec. 16, 2014
  • dingjie1

    Dec. 9, 2014
  • AndreiDan1

    Nov. 22, 2014
  • diegoitaliait

    Oct. 30, 2014
  • buchireddy3

    Sep. 8, 2014
  • NabilNoaman

    Jul. 23, 2014
  • mizankhan

    Jul. 5, 2014
  • makskoutun

    Apr. 16, 2014
  • romskom

    Jan. 24, 2014
  • tantrieuf31

    Nov. 27, 2013
  • ctyeh

    Sep. 3, 2013

Presentation of Gradle features on a local JUG meeting in Riga

Views

Total views

10,609

On Slideshare

0

From embeds

0

Number of embeds

529

Actions

Downloads

483

Shares

0

Comments

0

Likes

23

×