89
Gradle 2. Breaking stereotypes . Sergey Morenes, [email protected] March, 26 2015

Gradle 2.breaking stereotypes

Embed Size (px)

Citation preview

Gradle 2.Breaking stereotypes.

Sergey Morenes, [email protected]

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

Agenda

• Builds tools overview

• Gradle under the microscope

• Examples

• Q & A

Lost in selection

Magic pill

Apache Ant• Offers extreme flexibility

• Imposes no convention

• Lightweight dependency management

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,

LinkedIn

• 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

Slogan

• Make the impossible possible

• Make the possible easy

• Make the easy elegant

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

Hello world

$ gradle helloWorld

build.gradle

Maven pom

Dependencies

Dependencies

Properties

Properties

Build phases

Execution

Configuration

Initialization

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

DefaultTask

• dependsOn(task)

• doFirst(closure)

• doLast(closure)

• onlyIf(closure)

Sample project

Sample project

Dependent tasks

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

Custom task

Custom task

Custom task

Custom task

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

settings.gradle

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

Plugin import

Plugin portal

Plugin import

C++ support

Packaging

• Build script

• buildSrc project

• rootProjectDir/buildSrc/src/main/groovy

• Standalone project

Custom plugin

Custom plugin

Custom plugin

Custom plugin

• $ gradle writeBuild

Custom plugin

Integration• Ant

• Maven

• Ivy

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

Hello Ant

Ant import

Gradle and Maven

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 Maven

Build(sec) 21,2 24,2

Inc build(sec) 8,7 11

Build with tests(sec)

29 28

Clean(sec) 3,9 3,1

Distributive(Mb) 44 3

Maven converter

• Create build.gradle file in the root folder

• Specify apply plugin: 'maven2Gradle' in the

build.gradle file.

• Run gradle maven2Gradle

Repositories

• Maven and Ivy support

Maven Scope

Maven Scope

Scopes:

• compile

• provided

• runtime

• test

• system

• import

Dependencies

Configurations

• compile

• default

• testCompile

• testRuntime

• archives

• runtime

Scope flexibility

Profiles

• build.gradle

• dev-profile.gradle

• test-profile.gradle

• $ gradle –Pprofile=dev build

Resource handling

Resource handling

Unit testing

• Junit

• TestNG

• Spock

• Geb

• EasyB

Skip tasks

• $ gradle -PskipTests

Skip tasks

Skip tasks

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

GUI

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

Practical tasks

• Multiple projects

• Liquibase

• Deployment

Multiple projects

• Huge project

• Multiple sub-projects/pom.xml files

• Complicated maintenance

Liquibase

• Plugins for 2 and 3 versions

• Lightweight front-end for Liquibase command-line

• Gradle task for each Liquibase command

Deployment

• Separate plugins for Jetty/Tomcat

• General plugin for multiple containers

Cargo plugin

Cargo plugin

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

Resources

Practice

• https://github.com/hibernate/hibernate-orm

• https://github.com/SpringSource/spring-framework

• https://github.com/gradle/gradle

Q&A

• Сергей Моренец, [email protected]