faster java ee builds with gradle

71
Faster Java EE Builds with Gradle RYAN CUPRAK

Upload: ryan-cuprak

Post on 19-Mar-2017

145 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Faster Java EE Builds with Gradle

Faster Java EE Builds with GradleRYAN CUPRAK

Page 2: Faster Java EE Builds with Gradle

About Ryan Cuprak

@ctjava [email protected] http://www.cuprak.info https://www.linkedin.com/in/rcuprak

Page 3: Faster Java EE Builds with Gradle

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

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

Build System Evolution

AntMaven

Gradle2004

2009

2000

Page 6: Faster Java EE Builds with Gradle

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

Why Gradle?

Page 8: Faster Java EE Builds with Gradle

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

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

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

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

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

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

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

Project Creation… gradle init --type java-library

Default Project Layout

Page 16: Faster Java EE Builds with Gradle

Initial Gradle File

Page 17: Faster Java EE Builds with Gradle

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

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

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

Sample Outputgradle build

Output

Page 21: Faster Java EE Builds with Gradle

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

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

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

Defining Tasks

Page 25: Faster Java EE Builds with Gradle

Task Dependencies

Page 26: Faster Java EE Builds with Gradle

Grouping Tasks

Page 27: Faster Java EE Builds with Gradle

Grouping Tasks

Custom Group

Page 28: Faster Java EE Builds with Gradle

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

Multi-Module Projects

Page 30: Faster Java EE Builds with Gradle

Multi-Module ProjectsHierarchical Layout Flat Layout

Page 31: Faster Java EE Builds with Gradle

Hierarchical Layout: Example Project

ctjavabuild.gradlesettings.gradle

ctcorebuild.gradlesettings.gradle

ctwebbuild.gradlesettings.gradle

migratebuild.gradlesettings.gradle

Page 32: Faster Java EE Builds with Gradle

Hierarchical Layout: Top Level

build.gradle gradle.settings

ctjava

Page 33: Faster Java EE Builds with Gradle

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

IDE Support

Page 35: Faster Java EE Builds with Gradle

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

Eclipse Gradle Support http://download.eclipse.org/buildship/

updates/e46/releases/1.0

Page 37: Faster Java EE Builds with Gradle

NetBeans Gradle Support

Multi-project Java EE projects not recognized.

Page 38: Faster Java EE Builds with Gradle

IntelliJ Support

Page 39: Faster Java EE Builds with Gradle

Legacy Project

Page 40: Faster Java EE Builds with Gradle

NetBeans EE Project to GradleFile System Project Representation

Page 41: Faster Java EE Builds with Gradle

NetBeans EE Project to Gradle

Java Source directories

WAR Plugin

Local JARs

Page 42: Faster Java EE Builds with Gradle

NetBeans EE Project to Gradle

Web resource directory

Java EE Dependencies

Local JAR

Continued…

Page 43: Faster Java EE Builds with Gradle

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

Recipes

Page 45: Faster Java EE Builds with Gradle

JavaScript Minification

Minification Output

Google Minifier

Page 46: Faster Java EE Builds with Gradle

JavaScript Minification… Extend JavaExec Task to invoke Minifier

Page 47: Faster Java EE Builds with Gradle

JavaScript Minification…

gradle -PjsOptimize=true build

Page 48: Faster Java EE Builds with Gradle

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

Generating JPA Meta-ModelCreate custom plugin to run Java Annotation Processor:

implementation-class=JavaAptPlugin

Page 50: Faster Java EE Builds with Gradle

Custom Annotation ProcessorCustom annotation processor

Page 51: Faster Java EE Builds with Gradle

Custom Annotation ProcessorCustom annotation processor

Page 52: Faster Java EE Builds with Gradle

Custom Annotation Processor:

Build Plugin

Exclude everything but JPA entities

Custom annotation processor

Page 53: Faster Java EE Builds with Gradle

EAR ProjectsProject Output

Contents of EAR

Page 54: Faster Java EE Builds with Gradle

EAR Project

EAR plugin

Page 55: Faster Java EE Builds with Gradle

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

jaxb Code Generation

POJOxsd

Page 57: Faster Java EE Builds with Gradle

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

Generating JAX-WS Client

https://plugins.gradle.org/plugin/me.seeber.wsimport

Page 59: Faster Java EE Builds with Gradle

Generating JAX-WS Client Generated Source Code

Page 60: Faster Java EE Builds with Gradle

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

Building Docker Images

Page 62: Faster Java EE Builds with Gradle

Simple Docker Example – Run Container

Available Tasks:• dockerRun• dockerStop• dockerRunStatus• dockerRemoveContainer

Page 63: Faster Java EE Builds with Gradle

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

Docker & Testing

Page 65: Faster Java EE Builds with Gradle

Docker Database Testing

Page 66: Faster Java EE Builds with Gradle

Parameter Substitution: persistence.xml

Page 67: Faster Java EE Builds with Gradle

Parameter Substitution: build.gradle

Page 68: Faster Java EE Builds with Gradle

Testing with Arquillian/Selenium

Page 69: Faster Java EE Builds with Gradle

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

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

Q&A