Сергей Моренец: "gradle. write once, build everywhere"
TRANSCRIPT
![Page 2: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/2.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/3.jpg)
Agenda
![Page 4: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/4.jpg)
Agenda
![Page 5: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/5.jpg)
Agenda
![Page 6: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/6.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/7.jpg)
Apache Ivy• Agile dependency manager• Transitive dependencies• Ant & Maven integration• Enhanced support of repositories
![Page 8: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/8.jpg)
Apache Maven
• Support for dependency management• Standard project layout• Archetypes• Hard customization• Declarative approach• Plugin execution framework
![Page 9: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/9.jpg)
Build systems
![Page 10: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/10.jpg)
Apache Maven
![Page 11: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/11.jpg)
Ant plugin
![Page 12: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/12.jpg)
![Page 13: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/13.jpg)
Groovy plugin
![Page 14: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/14.jpg)
![Page 15: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/15.jpg)
Echo plugin
![Page 16: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/16.jpg)
![Page 17: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/17.jpg)
Gradle
![Page 18: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/18.jpg)
![Page 19: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/19.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/20.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/21.jpg)
Slogan• Make the impossible possible• Make the possible easy• Make the easy elegant
![Page 22: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/22.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/23.jpg)
Gradle
![Page 24: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/24.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/25.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/26.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/27.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/28.jpg)
Build structure
![Page 29: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/29.jpg)
Hello world
$ gradle helloWorld
![Page 30: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/30.jpg)
build.gradle
![Page 31: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/31.jpg)
Maven pom
![Page 32: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/32.jpg)
![Page 33: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/33.jpg)
Sample project
![Page 34: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/34.jpg)
Sample project
![Page 35: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/35.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/36.jpg)
Custom task
![Page 37: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/37.jpg)
Custom task
![Page 38: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/38.jpg)
![Page 39: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/39.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/40.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/41.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/42.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/43.jpg)
Plugin• Reusable pieces of build logic• Can be used in different projects/builds
![Page 44: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/44.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/45.jpg)
Plugin import
![Page 46: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/46.jpg)
Plugin portal
![Page 47: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/47.jpg)
Custom plugin
gradle helloWorld
![Page 48: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/48.jpg)
Maven
![Page 49: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/49.jpg)
Gradle
![Page 50: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/50.jpg)
Integrates with everything
![Page 51: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/51.jpg)
Gradle and Maven
![Page 52: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/52.jpg)
Properties
![Page 53: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/53.jpg)
Properties
![Page 54: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/54.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/55.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/56.jpg)
Gradle
Optimized Not optimized
![Page 57: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/57.jpg)
Maven
Optimized Not optimized
![Page 58: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/58.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/59.jpg)
Repositories
![Page 60: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/60.jpg)
Maven Scope
![Page 61: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/61.jpg)
Maven Scope
Scopes:• compile• provided• runtime• test• system• import
![Page 62: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/62.jpg)
Dependencies
![Page 63: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/63.jpg)
Scope flexibility
![Page 64: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/64.jpg)
Version management
![Page 65: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/65.jpg)
Profiles
• build.gradle• dev-profile.gradle• test-profile.gradle
• $ gradle –Pprofile=dev build
![Page 66: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/66.jpg)
Skip tasks
• $ gradle -PskipTests
![Page 67: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/67.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/68.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/69.jpg)
Practical tasks
• Multiple projects• Liquibase• Deployment
![Page 70: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/70.jpg)
Multiple projects• Huge project• Multiple sub-projects/pom.xml files• Complicated maintenance
![Page 71: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/71.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/72.jpg)
Deployment
• Separate plugins for Jetty/Tomcat• General plugin for multiple containers
![Page 73: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/73.jpg)
Cargo plugin
![Page 74: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/74.jpg)
Cargo plugin
![Page 75: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/75.jpg)
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"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/76.jpg)
Cons• Compilation & run-time issues• Larger learning curve• Less community & industry support
![Page 77: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/77.jpg)
Future
![Page 78: Сергей Моренец: "Gradle. Write once, build everywhere"](https://reader031.vdocuments.site/reader031/viewer/2022032220/55b6390cbb61ebd70f8b465a/html5/thumbnails/78.jpg)
Practice
• https://github.com/hibernate/hibernate-orm• https://github.com/SpringSource/spring-
framework• https://github.com/gradle/gradle