faster java ee builds with gradle
TRANSCRIPT
![Page 1: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/1.jpg)
Faster Java EE Builds with GradleRYAN CUPRAK
![Page 2: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/2.jpg)
About Ryan Cuprak
@ctjava [email protected] http://www.cuprak.info https://www.linkedin.com/in/rcuprak
![Page 3: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/3.jpg)
Introducing Gradle• Open source build automation system
• Apache 2.0 License• Builds upon Apache Ant and Maven• First released in 2007• Uses a Groovy-based DSL (not XML)• Uses directed acyclic graph to determine build
order• Supports multiple languages: Java, C++, C, etc.• Rich plug-in architecture• Convention over configuration but easily
customized/adapted
![Page 4: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/4.jpg)
Introducing Gradle• Build file can be versioned like dependencies.
Ever run Ant 1.9 file with Ant 1.6?• Background daemon reduces build-time• Supports incremental builds• Built-in profiling support• Build projects in parallel and some tasks*• Built-in Ant/Maven integration• Supported central repositories:
• Maven Central • Jcenter• Ivy
![Page 5: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/5.jpg)
Build System Evolution
AntMaven
Gradle2004
2009
2000
![Page 6: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/6.jpg)
Gradle versus MavenFeature Gradle Maven
Fully configurable DAG ✅ ❌
Task Exclusion ✅ ❌
Dry Run ✅ ❌
Advanced Task Ordering ✅ ❌
Custom Distributions ✅ ❌
Repository Aware Cache ✅ ❌
Version Conflict Resolution ✅ ❌
File Based Dependencies ✅ ❌
Finalizers ✅ ❌
Custom Dependency Scopes ✅ ❌
ReplaceByRules ✅ ❌
https://gradle.org/maven-vs-gradle
![Page 7: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/7.jpg)
Why Gradle?
![Page 8: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/8.jpg)
Questions1. Do you need to learn Groovy?
No (Good idea)2. Do you need to completely refactor your code base?
No3. Do you need additional IDE plugins?
Maybe4. Do you need to change your build process?
Depends5. Do you need to port your entire build system over?
No – can port over individual modules6. Can you embed custom Ant logic?
Yes
![Page 9: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/9.jpg)
Questions…7. Must all dependencies originate from a
repository?No
8. Can artifacts be pushed to a repository? Yes9. Can Jenkins initiate Gradle builds? Yes
![Page 10: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/10.jpg)
Why Gradle for Java EE?Java EE projects are: Large Complex Contain many dependencies Ant lacks dependency managementLarge Ant files are a nightmare to debugMaven isn’t flexible Custom plugins aren’t the solution Evolving slowly
![Page 11: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/11.jpg)
Installation Installation similar to Ant/Maven Download and install from gradle.org Set environment variables:
GRADLE_HOME PATH (to GRADLE_HOME/bin)
gradle = ant = mvn
![Page 12: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/12.jpg)
Key Gradle FilesBuild file build.gradleConfiguration settings settings.gradleLocal settings ~/.gradle/gradle.propertiesLocal repository (project)/.gradle
build.gradle = pom.xml = build.xml
![Page 13: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/13.jpg)
Gradle DaemonGradle daemon is enabled by default
(Disable for continuous build environments!)Displaying status
gradle –statusStopping daemon:
gradle –stopDisabling daemon:
Add org.gradle.daemon=false to ~/.gradle
![Page 14: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/14.jpg)
Project CreationTo start a new project: gradle init – creates a new project
Uses pom.xml if present. Imports multi-model projects
Optionally specify –type <type> java-library scala-library groovy-library basic (default) – no src directories created.
Central repository defaults to jcenter()https://bintray.com/bintray/jcenter
![Page 15: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/15.jpg)
Project Creation… gradle init --type java-library
Default Project Layout
![Page 16: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/16.jpg)
Initial Gradle File
![Page 17: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/17.jpg)
Command line – listing tasksgradle –q tasks------------------------------------------------------------All tasks runnable from root project------------------------------------------------------------
Build tasks-----------assemble - Assembles the outputs of this project.build - Assembles and tests this project.buildDependents - Assembles and tests this project and all projects that depend on it.buildNeeded - Assembles and tests this project and all projects it depends on.classes - Assembles classes 'main'.clean - Deletes the build directory.jar - Assembles a jar archive containing the main classes.testClasses - Assembles classes 'test'.
![Page 18: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/18.jpg)
Tasks Continued… Build Setup tasks-----------------init - Initializes a new Gradle build. [incubating]wrapper - Generates Gradle wrapper files. [incubating]
Documentation tasks-------------------javadoc - Generates Javadoc API documentation for the main source code.
![Page 19: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/19.jpg)
Tasks Continue…Help tasks----------components - Displays the components produced by root project 'scratch'. [incubating]dependencies - Displays all dependencies declared in root project 'scratch'.dependencyInsight - Displays the insight into a specific dependency in root project 'scratch'.help - Displays a help message.model - Displays the configuration model of root project 'scratch'. [incubating]projects - Displays the sub-projects of root project 'scratch'.properties - Displays the properties of root project 'scratch'.tasks - Displays the tasks runnable from root project 'scratch'.
Verification tasks------------------check - Runs all checks.test - Runs the unit tests.
![Page 20: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/20.jpg)
Sample Outputgradle build
Output
![Page 21: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/21.jpg)
Projects versus TasksProject 1 Project 2
Project 3
Task 1
Task 3
Task 2Depends
on
Task 1
Task 2
Depends on
Task 1
Task 3
Task 2Depends
onTask 3
Depends on
![Page 22: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/22.jpg)
Understanding build.gradleorg.gradle.api.Project
apply(options: Map<String,?>)buildscript(config: Closure)dependencies(config: Closure)configurations(config: Closure)getDependencies()getConfigurations()getAnt()getName()getDescription()getGroup()getPath()getVersion()getLogger()setDescription(description: String)setVersion(version: Object)file(path: Object)task(args: Map<String,?>,name: String)
Project is an implicit object.
Project.apply plugin: ‘java
![Page 23: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/23.jpg)
Understanding Gradle Tasksorg.gradle.api.Task
dependsOn(tasks: Object…)doFirst(action: Closure)doLast(action: Closure)getActions()getInputs()getOutputs()getAnt()getDescription()getEnabled()getGroup()setDescription(description: String)setEnabled(enabled: boolean)setGroup(group: String)
Tasks are built on the Task object.
![Page 24: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/24.jpg)
Defining Tasks
![Page 25: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/25.jpg)
Task Dependencies
![Page 26: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/26.jpg)
Grouping Tasks
![Page 27: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/27.jpg)
Grouping Tasks
Custom Group
![Page 28: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/28.jpg)
PluginsPlugin ID Automatically
AppliesWorks With
Description
java java-base Java compilation/testing
application java,distribution
ear java Java EE Supportmaven java,war Maven publishingwar java Assembles WAR filesjava-library-distribution
java, distribution
Support for tar/zip distributions for Java library.
idea java Generates IDEA fileseclipse java,groovy,
scalaGenerates Eclipse files
Standard: https://docs.gradle.org/current/userguide/standard_plugins.htmlThird party: https://plugins.gradle.org
![Page 29: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/29.jpg)
Multi-Module Projects
![Page 30: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/30.jpg)
Multi-Module ProjectsHierarchical Layout Flat Layout
![Page 31: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/31.jpg)
Hierarchical Layout: Example Project
ctjavabuild.gradlesettings.gradle
ctcorebuild.gradlesettings.gradle
ctwebbuild.gradlesettings.gradle
migratebuild.gradlesettings.gradle
![Page 32: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/32.jpg)
Hierarchical Layout: Top Level
build.gradle gradle.settings
ctjava
![Page 33: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/33.jpg)
Hierarchical Layout: Second Level
gradle.settings for ctcore/migrate/ctweb: rootProject.name = 'ctjava’ migrate/ctweb dependencies on ctcore compile project (':ctcore’)
![Page 34: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/34.jpg)
IDE Support
![Page 35: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/35.jpg)
IDE SupportIDE Separate Plugin Java EE SupportIDEA (free) No YesIDEA (paid) No YesNetBeans Yes DependsEclipse Yes Yes
![Page 36: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/36.jpg)
Eclipse Gradle Support http://download.eclipse.org/buildship/
updates/e46/releases/1.0
![Page 37: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/37.jpg)
NetBeans Gradle Support
Multi-project Java EE projects not recognized.
![Page 38: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/38.jpg)
IntelliJ Support
![Page 39: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/39.jpg)
Legacy Project
![Page 40: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/40.jpg)
NetBeans EE Project to GradleFile System Project Representation
![Page 41: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/41.jpg)
NetBeans EE Project to Gradle
Java Source directories
WAR Plugin
Local JARs
![Page 42: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/42.jpg)
NetBeans EE Project to Gradle
Web resource directory
Java EE Dependencies
Local JAR
Continued…
![Page 43: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/43.jpg)
WAR Plugin ConfigurationConfiguration Descriptionfrom Adds a file-set to the root of the archivewebInf Adds a file-set to the WEB-INF dir.classpath Adds a file-set to the WEB-INF/lib dirwebAppDirName The name of the web application source directory,
relative to the project directory.webXml Copies a file to WEB-INF/web.xml
![Page 44: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/44.jpg)
Recipes
![Page 45: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/45.jpg)
JavaScript Minification
Minification Output
Google Minifier
![Page 46: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/46.jpg)
JavaScript Minification… Extend JavaExec Task to invoke Minifier
![Page 47: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/47.jpg)
JavaScript Minification…
gradle -PjsOptimize=true build
![Page 48: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/48.jpg)
Node/Webpack Integration
Node Gradle Plugin
https://github.com/srs/gradle-node-plugin
Supports: NodeJS, Yarn, Grunt, Gulp
![Page 49: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/49.jpg)
Generating JPA Meta-ModelCreate custom plugin to run Java Annotation Processor:
implementation-class=JavaAptPlugin
![Page 50: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/50.jpg)
Custom Annotation ProcessorCustom annotation processor
![Page 51: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/51.jpg)
Custom Annotation ProcessorCustom annotation processor
![Page 52: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/52.jpg)
Custom Annotation Processor:
Build Plugin
Exclude everything but JPA entities
Custom annotation processor
![Page 53: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/53.jpg)
EAR ProjectsProject Output
Contents of EAR
![Page 54: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/54.jpg)
EAR Project
EAR plugin
![Page 55: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/55.jpg)
Provided Scope – Non-WAR Projects
• providedCompile is a configuration on WAR plugin.• Non-WAR projects must add a custom scope.
![Page 56: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/56.jpg)
jaxb Code Generation
POJOxsd
![Page 57: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/57.jpg)
Generating JAX-WS Client Generate JAX-WS client for WSDL using wsimport Plugin:
https://plugins.gradle.org/plugin/me.seeber.wsimport Generated source code:
build/generated-src/wsimport
![Page 58: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/58.jpg)
Generating JAX-WS Client
https://plugins.gradle.org/plugin/me.seeber.wsimport
![Page 59: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/59.jpg)
Generating JAX-WS Client Generated Source Code
![Page 60: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/60.jpg)
Docker Build Docker images from project output:
Transmode/gradle-docker - http://tinyurl.com/k7o7nab Build/publish docker files from build script – not Dockerfile
bmuschko/gradle-docker-plugin - http://tinyurl.com/hg4q6jr docker-remote-api – interacts with Docker via remote API docker-java-application – creates/pushes docker images for
java applications Run Docker containers during build
palantir/gradle-docker - http://tinyurl.com/hpw853h docker – building and pushing docker images docker-compose - populating placeholders in a docker-
compose template docker-run – starting/stopping/status on named images
![Page 61: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/61.jpg)
Building Docker Images
![Page 62: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/62.jpg)
Simple Docker Example – Run Container
Available Tasks:• dockerRun• dockerStop• dockerRunStatus• dockerRemoveContainer
![Page 63: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/63.jpg)
Docker & Testing Launch PostgreSQL Docker container before unit
tests execute Test cleanup:
Leave container running if any tests fail Destroy container if tests succeed
![Page 64: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/64.jpg)
Docker & Testing
![Page 65: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/65.jpg)
Docker Database Testing
![Page 66: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/66.jpg)
Parameter Substitution: persistence.xml
![Page 67: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/67.jpg)
Parameter Substitution: build.gradle
![Page 68: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/68.jpg)
Testing with Arquillian/Selenium
![Page 69: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/69.jpg)
Misc View Dependencies:
gradle -q ctweb:dependencies
Build GUI:gradle –gui
Profiling:gradle –profile
Dryrungradle –m build
![Page 70: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/70.jpg)
Reasons to Convert Incremental compilation Better dependency management/control Customizable without needing plugins Supports multiple languages/platforms Build system can be versioned
![Page 71: Faster Java EE Builds with Gradle](https://reader036.vdocuments.net/reader036/viewer/2022062400/58ce73101a28abdc578b5e13/html5/thumbnails/71.jpg)
Q&A