Post on 17-Jul-2015
Gradle 2.Write once, build everywhere.
Sergey Morenes, morenets@mail.ru
March, 26 2015
About author
• Works in IT since 2000
• 11 year of Java SE/EE experience
• Migrated to Gradle after 7 years of Ant/Maven
usage
• Regular speaker at Java conferences
Apache Ivy• Cross-platform dependency management
• Transitive dependencies
• Enhanced support of repositories
Apache Maven
• Offers rigid standards and support for dependency
management
• More difficult and inflexible standards/procedures
• Declarative approach
Issue #1. XML
• Large and complex files are hard to understand
• Hierarchical structure limits the expressiveness
of the format
• Good format for the data and complex for the flow
Solution #1. Groovy
• An agile and dynamic language for the Java
Virtual Machine
• Makes modern programming features available to
Java developers with almost-zero learning curve
• Provides the ability to statically type
check and statically compile your code for
robustness and performance
• Share base syntax, type system, packages
hierarchy with Java
• Every Gradle build file is Groovy script
Gradle• Flexible yet model-driven JVM-based build tool
• Acknowledges and improves on the very best ideas
from Make, Ant, Ivy, Maven, Rake, Gant, Scons, SBT,
Leinengen, and Buildr
Gradle
• First release in Apr 2008
• Current version 2.3 released in February 2015
• Used in Carrier, EADS, Hibernate, Grails, Groovy,
Spring-Security and Spring-Integration, Netflix,
• Default build tool for Android OS
Hans Dockter
• Founder of Gradle and Gradleware
• 13 years of experience as a software developer,
team leader, architect, trainer, and mentor
• Previously worked at Jboss and founded Jboss-IDE
• Holds a Diploma in Physics with a minor in Computer
Science
• Admirer of domain-driven-design
Gradle overview
• A flexible general purpose build tool
• Declarative builds and build-by-convention plugins
on top
• Multi-project support
• Powerful dependency management based on Ivy
• Gradle is written in Java with a Groovy DSL layer on
top
• Programming tool
• Based on Groovy
Development
Version Release date
Maven 1.0 2004
Maven 2.0 2005
Maven 3.0 2010
Maven 3.1 2013
Maven 3.3 2015
Development
Version Release date
Gradle 0.7 2009
Gradle 1.0 2012
Gradle 1.5 2013
Gradle 2.0 2014
Gradle 2.3 2015
Build structure
• Gradle build consists of one or more projects
• Project contains one or more tasks
• Task is fundamental unit of build activity
• Tasks are named collections of build instructions
• Tasks are the equivalent to Ant targets
• Task is made up of actions
Initialization
• Gradle defines which projects are involved in build
• Project instance is defined for each involved
project
Configuration
• Task objects are assembled into an internal object
model, usually called the DAG
• The build scripts of all projects which are part of the
build are executed
• If “configuration on demand” feature is enabled
then only relevant projects are configured
Execution
• Gradle determines the subset of the tasks, created
and configured during the configuration phase
• Subset of tasks depends on the gradle command
argument and the contents of the current directory.
• Selected tasks are executed in the order required
by their dependency relationships
Custom task
• Writes audit information at the end of the build
• Audit information includes project name and build
timestamp
• Audit files are located in the separate folder
Multi-project builds
• Build where you build more than one project during
a single execution of Gradle
• Sub-projects should be defined in settings.gradle
• Settings file is analyzed in the initialization phase
when sub-projects are revealed and included into
DAG
• Sub-projects are sub-directories in the simplest case
gradle.properties
• org.gradle.daemon=true
• org.gradle.java.home=C:\\Program
Files\\Java\\jdk1.8.0_40\\
• org.gradle.jvmargs=-Xmx100m
Optimization
• Daemon mode
• Parallel test execution
• Parallel project assembly
• Configuration on-demand
Daemon
• Improves startup and execution time of Gradle
• Initial Gradle command forks daemon process
• Subsequent Gradle commands reuse the build
daemon
• If daemon is currently busy then new daemon
process is started on-demand
• Useful for small tasks execution
• Expires after 3 hours of idle time
Plugin
• Reusable pieces of build logic
• Can be used in different projects/builds
• Can be written in Groovy, Java or Scala
Plugin
• Add tasks to the project
• Pre-configure added tasks with useful defaults
• Add dependency configurations to the project
• Add new properties and methods to existing type
via extensions
Plugins
• Android
• AspectJ
• Flex
• Grails
• GWT
• JavaScript
• JAXB
• Jenkins
• SvnKit
• Tomcat
• Xslt
Packaging
• Build script
• buildSrc project
• rootProjectDir/buildSrc/src/main/groovy
• Standalone project
Gradle and Ant
• Gradle is often described as Groovy-based Ant.
• Competitor of Gant(Groovy Ant scripting)
• Share DAG concept
• Gradle tasks are similar to Ant targrets
• Gradle variables(typeless) are close to Ant
properties
Gradle and Maven
Maven Coordinate Gradle Property Gradle Default
groupId group blank
artifactId name Project directory name
version version unspecified
name N/A N/A
description description null
Comparison
Operation Gradle(optimized)
Gradle(daemon)
Gradle(no daemon)
Maven
Build(sec) 8,03 10,73 13,68 12,40
Inc build(sec) 1,92 2,16 4,74 4,62
Clean(sec) 1,03 1,20 2,77 1,71
Size(Mb) 46 46 46 9
Maven converter
• Create build.gradle file in the root folder
• Specify apply plugin: 'maven2Gradle' in the
build.gradle file.
• Run gradle maven2Gradle
Caching
• Gradle caches all compiles scripts by default
• Compiled scripts are put into .gradle folder
• Gradle uses compiled version if the script hasn’t
changed
• --recompile-scripts option discards cache
Liquibase
• Plugins for 2 and 3 versions
• Lightweight front-end for Liquibase command-line
• Gradle task for each Liquibase command
Pros
• Native Java support
• Ant/Maven integration
• Full IDE support
• Transitive dependency management(based on
Maven/Ivy)
• Multiple third-party plugins(70+)
• Incremental builds
• Rapid development
Cons
• Less efficient and possible compilation issues due to
script nature
• Large learning curve
• Less community & industry support
Future• Testing toolkit for integration into business logic
• Improved plugin portal and plugin development
• Execution of Maven builds/plugins at runtime
• Distributed testing
• Parallel and distributed execution
… to be continued
Practice
• https://github.com/hibernate/hibernate-orm
• https://github.com/SpringSource/spring-framework
• https://github.com/gradle/gradle