Сергей Моренец: "Gradle. Write once, build everywhere"

79
Gradle 2. Write once, build everywhere. Sergey Morenets, [email protected] June, 6 2015

Transcript of Сергей Моренец: "Gradle. Write once, build everywhere"

Page 1: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle 2.Write once, build everywhere.

Sergey Morenets, [email protected], 6 2015

Page 2: Сергей Моренец: "Gradle. Write once, build everywhere"

About author• Works in IT since 2000• 11 year of Java SE/EE experience• Regular speaker at Java conferences• Author of “Development of Java applications” and

“Main errors in Java programming ”books• Founder of http://it-simulator.com• 3 years of Gradle usage

Page 3: Сергей Моренец: "Gradle. Write once, build everywhere"

Agenda

Page 4: Сергей Моренец: "Gradle. Write once, build everywhere"

Agenda

Page 5: Сергей Моренец: "Gradle. Write once, build everywhere"

Agenda

Page 6: Сергей Моренец: "Gradle. Write once, build everywhere"

Apache Ant• Offers extreme flexibility• Imposes no convention or project standards• Maintenance headache• Support Ruby, Groovy, JavaScript, Judoscript,

Jython scripting

Page 7: Сергей Моренец: "Gradle. Write once, build everywhere"

Apache Ivy• Agile dependency manager• Transitive dependencies• Ant & Maven integration• Enhanced support of repositories

Page 8: Сергей Моренец: "Gradle. Write once, build everywhere"

Apache Maven

• Support for dependency management• Standard project layout• Archetypes• Hard customization• Declarative approach• Plugin execution framework

Page 9: Сергей Моренец: "Gradle. Write once, build everywhere"

Build systems

Page 10: Сергей Моренец: "Gradle. Write once, build everywhere"

Apache Maven

Page 11: Сергей Моренец: "Gradle. Write once, build everywhere"

Ant plugin

Page 12: Сергей Моренец: "Gradle. Write once, build everywhere"
Page 13: Сергей Моренец: "Gradle. Write once, build everywhere"

Groovy plugin

Page 14: Сергей Моренец: "Gradle. Write once, build everywhere"
Page 15: Сергей Моренец: "Gradle. Write once, build everywhere"

Echo plugin

Page 16: Сергей Моренец: "Gradle. Write once, build everywhere"
Page 17: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle

Page 18: Сергей Моренец: "Gradle. Write once, build everywhere"
Page 19: Сергей Моренец: "Gradle. Write once, build everywhere"

Issue #1. XML

• Large and complex files are hard to understand• Hierarchical structure limits the expressivenessof the format• Good format for the data and complex for the

flow

Page 20: Сергей Моренец: "Gradle. Write once, build everywhere"

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

Page 21: Сергей Моренец: "Gradle. Write once, build everywhere"

Slogan• Make the impossible possible• Make the possible easy• Make the easy elegant

Page 22: Сергей Моренец: "Gradle. Write once, build everywhere"

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

Page 23: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle

Page 24: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle• Development started in Apr 2008• Current version 2.4 released in May 2015• Default build tool for Android OS

Page 25: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle overview

• A flexible general purpose build tool• Programming tool• Declarative builds and build-by-convention• Multi-project support• Powerful dependency management

Page 26: Сергей Моренец: "Gradle. Write once, build everywhere"

Development

Version Release dateMaven 1.0 2004

Maven 2.0 2005

Maven 3.0 2010

Maven 3.1 2013

Maven 3.3 2015

Page 27: Сергей Моренец: "Gradle. Write once, build everywhere"

Development

Version Release dateGradle 0.7 2009

Gradle 1.0 2012

Gradle 1.5 2013

Gradle 2.0 2014

Gradle 2.4 2015

Page 28: Сергей Моренец: "Gradle. Write once, build everywhere"

Build structure

Page 29: Сергей Моренец: "Gradle. Write once, build everywhere"

Hello world

$ gradle helloWorld

Page 30: Сергей Моренец: "Gradle. Write once, build everywhere"

build.gradle

Page 31: Сергей Моренец: "Gradle. Write once, build everywhere"

Maven pom

Page 32: Сергей Моренец: "Gradle. Write once, build everywhere"
Page 33: Сергей Моренец: "Gradle. Write once, build everywhere"

Sample project

Page 34: Сергей Моренец: "Gradle. Write once, build everywhere"

Sample project

Page 35: Сергей Моренец: "Gradle. Write once, build everywhere"

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

Page 36: Сергей Моренец: "Gradle. Write once, build everywhere"

Custom task

Page 37: Сергей Моренец: "Gradle. Write once, build everywhere"

Custom task

Page 38: Сергей Моренец: "Gradle. Write once, build everywhere"
Page 39: Сергей Моренец: "Gradle. Write once, build everywhere"

Cache everything

• Remote metadata and artifacts• Transitive dependency resolution• Build execution plan• Plugin inputs and outputs• Test results

Page 40: Сергей Моренец: "Gradle. Write once, build everywhere"

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

Page 41: Сергей Моренец: "Gradle. Write once, build everywhere"

gradle.properties

• org.gradle.daemon=true• org.gradle.configureondemand=true• org.gradle.parallel=true• org.gradle.java.home=C:\\Program Files\\Java\\

jdk1.8.0_45\\• org.gradle.jvmargs=-Xmx100m

Page 42: Сергей Моренец: "Gradle. Write once, build everywhere"

Test execution

# of threads

H2 – time(sec) MySQL – time(sec)

1 24,4 27,5

2 31,1 36,9

4 46,2 51,1

8 71,1 80,5

Page 43: Сергей Моренец: "Gradle. Write once, build everywhere"

Plugin• Reusable pieces of build logic• Can be used in different projects/builds

Page 44: Сергей Моренец: "Gradle. Write once, build everywhere"

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

Page 45: Сергей Моренец: "Gradle. Write once, build everywhere"

Plugin import

Page 46: Сергей Моренец: "Gradle. Write once, build everywhere"

Plugin portal

Page 47: Сергей Моренец: "Gradle. Write once, build everywhere"

Custom plugin

gradle helloWorld

Page 48: Сергей Моренец: "Gradle. Write once, build everywhere"

Maven

Page 49: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle

Page 50: Сергей Моренец: "Gradle. Write once, build everywhere"

Integrates with everything

Page 51: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle and Maven

Page 52: Сергей Моренец: "Gradle. Write once, build everywhere"

Properties

Page 53: Сергей Моренец: "Gradle. Write once, build everywhere"

Properties

Page 54: Сергей Моренец: "Gradle. Write once, build everywhere"

Comparison

• Maven 3.3.3• Gradle 2.4• JDK 1.8.0.45• Intel Core i7, 4 cores, 16 GB• Optimized and default modes

Page 55: Сергей Моренец: "Gradle. Write once, build everywhere"

Comparison

Operation Gradle (opt)

Gradle (daemon)

Gradle(no daemon)

Maven

Maven (parall)

Build(sec) 8,03 10,73 13,68 12,40 13,02

Inc build(sec)

1,92 2,16 4,74 4,62 4,64

Clean(sec) 1,03 1,20 2,77 1,71 1,70

Page 56: Сергей Моренец: "Gradle. Write once, build everywhere"

Gradle

Optimized Not optimized

Page 57: Сергей Моренец: "Gradle. Write once, build everywhere"

Maven

Optimized Not optimized

Page 58: Сергей Моренец: "Gradle. Write once, build everywhere"

Maven converter

• maven2Gradle is obsolete now• Build init plugin converts:

o POM settingso Dependencieso Propertieso Java compiler settingso Single- and multi-project settingso Packaging of sources and tests

Page 59: Сергей Моренец: "Gradle. Write once, build everywhere"

Repositories

Page 60: Сергей Моренец: "Gradle. Write once, build everywhere"

Maven Scope

Page 61: Сергей Моренец: "Gradle. Write once, build everywhere"

Maven Scope

Scopes:• compile• provided• runtime• test• system• import

Page 62: Сергей Моренец: "Gradle. Write once, build everywhere"

Dependencies

Page 63: Сергей Моренец: "Gradle. Write once, build everywhere"

Scope flexibility

Page 64: Сергей Моренец: "Gradle. Write once, build everywhere"

Version management

Page 65: Сергей Моренец: "Gradle. Write once, build everywhere"

Profiles

• build.gradle• dev-profile.gradle• test-profile.gradle

• $ gradle –Pprofile=dev build

Page 66: Сергей Моренец: "Gradle. Write once, build everywhere"

Skip tasks

• $ gradle -PskipTests

Page 67: Сергей Моренец: "Gradle. Write once, build everywhere"

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

Page 68: Сергей Моренец: "Gradle. Write once, build everywhere"

Wrapper

• Preferred way of starting a Gradle build• Gradle will be automatically downloaded via

wrapper• Includes shell script• Useful for CI tasks

Page 69: Сергей Моренец: "Gradle. Write once, build everywhere"

Practical tasks

• Multiple projects• Liquibase• Deployment

Page 70: Сергей Моренец: "Gradle. Write once, build everywhere"

Multiple projects• Huge project• Multiple sub-projects/pom.xml files• Complicated maintenance

Page 71: Сергей Моренец: "Gradle. Write once, build everywhere"

Liquibase• Plugins for 2 and 3 versions• Lightweight front-end for Liquibase command-line• Gradle task for each Liquibase command

Page 72: Сергей Моренец: "Gradle. Write once, build everywhere"

Deployment

• Separate plugins for Jetty/Tomcat• General plugin for multiple containers

Page 73: Сергей Моренец: "Gradle. Write once, build everywhere"

Cargo plugin

Page 74: Сергей Моренец: "Gradle. Write once, build everywhere"

Cargo plugin

Page 75: Сергей Моренец: "Gradle. Write once, build everywhere"

Pros• Native Java/Scala/Groovy support• Ant/Maven/Ivy integration• Full IDE support• Flexible DSL• Multiple third-party plugins(70+)• Declarative & imperative approaches• Rapid development• Performance

Page 76: Сергей Моренец: "Gradle. Write once, build everywhere"

Cons• Compilation & run-time issues• Larger learning curve• Less community & industry support

Page 77: Сергей Моренец: "Gradle. Write once, build everywhere"

Future

Page 78: Сергей Моренец: "Gradle. Write once, build everywhere"

Practice

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

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

Page 79: Сергей Моренец: "Gradle. Write once, build everywhere"

Q&A

• Sergey Morenets, [email protected]