SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
Gradle for Beginners
Coding Serbia, 18.10.2013
Joachim Baumann
Gradle for Beginners

• 

Build-Management
–  Needs
–  Wishes

• 

Gradle - Basics

• 

Configuration and Execution Phase

• 

Groovy – Short Overview

• 

Plug-ins – Basics

• 

Our
– 
– 
– 
– 
– 
– 

First Project
Directory Structure
Dependencies
Manipulating the Jar
Tests
Quality Assurance
Publishing the Artefacts
What do we need from a Build-Management System?
• 
• 
• 
• 
• 

• 
• 
• 
• 
• 

Translating the Source Code (using a compiler)
Linking the Results
Check out the source code from a repository (optional)
Creating Tags (optional)
Execution of different types of tests: Examples:
–  Unit Tests for single Classes
–  Module or Component Tests
–  Integration Tests
–  Functional and Non-Functional System Tests
–  Automated Acceptance Tests
Detailed Test Reports combining all Test Results (optional)
Packing the Result (e.g., into a Jar, War or Ear)
Transfer the Results to the different Stages / Test Systems and Execution of
the respective Tests (optional)
Support for multi-language Projects
Creation of Documentation and Release Notes
What do we wish for in our Build-Management System?
•  Explicit Support of the Workflow implemented by the BuildManagement-System
•  Simple Modifiability and Extensibility of the Workflow to adapt to
local processes
•  Readability and self-documentation of the notation in the build
script
•  Use of sensible conventions (e.g., where to find the sources)
•  Simple change of the conventions to adap to local environment
•  Incremental Build that can identify artefacts that have already
been built
•  Parallelisation of independent steps in the workflow to minimize
waiting
•  Programmatic access to all artefacts being created by the build
•  Status reports that summarize the current state of the build
Gradle - Basics
• 

Gradle uses build scripts which are named build.gradle

• 

Every build script is a Groovy script

• 

Two very important Principles
–  Convention over Configuration
–  Don’t Repeat Yourself

• 

Gradle creates a dynamic model of the workflow as a Directed Acyclic Graph
(DAG)

• 

(Nearly) Everything is convention and can be changed

tset

tseTelipmoc

dliub

elipmoc
elbmessa
Configuration Phase
• 
• 

• 
• 

Executes the build script
The contained Groovy- and DSL-commands configure the underlying
object tree
The root of the object tree is the Project object
–  Is directly available in the script (methods and properties)
Creation of new Tasks that can be used
Manipulation of the DAG

• 

Our first script build.gradle

• 

println ”Hello from the configuration phase"
Execution Phase
• 

Executes all tasks that have been called (normally on the command line)

• 

For a task that is executed every task it depends on is executed beforehand

• 

Gradle uses the DAG to identify all task relationships

tset

tseTelipmoc

dliub

elipmoc
elbmessa
Task Definition
• 
• 

Takes an (optional) configuration closure
Alternatively: can be configured directly

• 
• 

The operator << (left-shift) appends an action (a closure) to this task’s list of actions
Equivalent to doLast()

• 

Insert at the beginning of the list with doFirst()
task halloTask
halloTask.doLast { print "from the " }
halloTask << { println "execution phase" }
halloTask.doFirst { print "Hello " }
task postHallo (dependsOn: halloTask) << {
println "End"
}
postHallo { // configuration closure
dependsOn halloTask
}
Groovy – Short Overview
• 

Simplified Java Syntax
–  Semicolon optional
–  GString
–  Everything is an Object
–  Simplification e.g., “println”

• 

Scripts

• 

Operator Overloading
–  Predefined
•  Example <<
•  Operator for secure navigation a.?b
–  You can provide your own implementations

• 

Named Parameters

• 

Closures

• 

Collection Iterators
Plug-ins - Basics
• 

Plug-ins encapsulate functionality

• 

Can be written in any VM-language
–  Groovy is a good choice

• 

Possible Plug-in Sources
–  Plug-ins packed with Gradle
–  Plug-ins included using URLs (don’t do it)
–  Plug-ins provided by repositories (use your own repository)
–  Self-written Plug-ins (normally in the directory buildSrc)

• 

Plug-ins
–  Extend objects
–  Provide new objects and / or abstractions
–  Configure existing objects

• 

Plug-ins are load with the command apply plugin
apply plugin: ‘java’
Our first Project

• 

We use the Java Plug-in

• 

Default paths used by the
Java Plug-in
–  Derived from Maven
Conventions
The Class HelloWorld

package de.gradleworkshop;
import java.util.ArrayList;
import java.util.List;
public class HelloWorld {
public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
for(String greeting : hw.generateGreetingsData())
System.out.println(greeting);
}
public List<String> generateGreetingsData() {
List <String> greetings = new ArrayList <String>();
greetings.add("Hallo Welt");
return greetings;
}
}
Manipulation of the Manifest
• 

Every Jar-Archive contains a file MANIFEST.MF

• 

Is generated by Gradle (see directory build/tmp/jar/MANIFEST.MF)

• 

Contains information e.g., about the main class of the jar

• 

Can be changed
jar {

manifest {
attributes 'Main-Class':
'de.gradleworkshop.HelloWorld'
}
}
• 

Alternatively
jar.manifest.attributes 'Main-Class':
'de.gradleworkshop.HelloWorld'
Tests
package de.gradleworkshop;
import java.util.List;
import org.junit.*;
import static org.junit.Assert.*;
public class HelloWorldTest {
HelloWorld oUT;
@Before
public void setUp() {
oUT = new HelloWorld();
}
@Test
public void testGenerateGreetingsData() {
List<String> res = oUT.generateGreetingsData();
assertEquals("wrong number of results", 1, res.size());
}
}
Configurations and Dependencies
• 

Gradle defines Configuration Objects. These encapsulate
–  Dependency Information
–  Paths to Sources and Targets
–  Associated Artefacts
–  Additional Configuration Information

• 

Tasks use these Configurations

• 

For most pre-defined Task a Configuration exists
–  compile, testCompile, runtime, testRuntime

• 
• 

Dependencies are defined using the key word dependencies
Maven-like notation for the dependencies
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.+’
}
Repositories
• 

Repositories provide libraries (normally jar archives)

• 

You can define Ivy or Maven Repositories, both public and private

• 

Predefined Repositories
–  JCenter
–  Maven Central
–  Local Maven Repository (~/.m2/repository)

• 

Repositories are defined using the keyword repositories
repositories {
mavenLocal()
}
repositories {
jcenter()
mavenCentral()
}

• 

Multiple Repositories can be defined
The Application Plug-in
• 

The Application-Plug-in
–  Adds a Task run
–  Creates start scripts, that can be used with the Task run
–  Creates a Task distZip, that packs all necessary files into a ziparchive
–  Definition of the Main Class
mainClassName = "de.gradleworkshop.HelloWorld"
–  Usage with
apply plugin: 'application'
Using TestNG
• 

Very Simple

dependencies {
testCompile group: 'org.testng', name: 'testng',
version: '6.+'
}
test {
useTestNG()
}
Test Class for TestNG
package de.gradleworkshop;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.testng.AssertJUnit.*;
import org.testng.annotations.*;
public class TestHelloWorld {
HelloWorld oUT;
@BeforeTest
public void setUp() {
oUT = new HelloWorld();
}
@Test
public void testGenerateGreetingsData() {
List<String> res = oUT.generateGreetingsData();
assertEquals("Wrong Number of Entries", 1, res.size());
}
}
Quality Assurance
• 

Support for PMD, Checkstyle, Findbugs, Emma, Sonar …

• 

Example PMD
apply plugin: 'pmd'
pmdMain {
ruleSets = [ "basic", "strings" ]
ignoreFailures = true
}

• 

Another Example configuring all Tasks of Type Pmd using withType()
tasks.withType(Pmd) {
ruleSets = [ "basic", "strings" ]
ignoreFailures = true
ruleSetFiles = files('config/pmd/rulesets.xml')
reports {
xml.enabled false
html.enabled true
}
}
Publishing the Artefacts
• 

Gradle defines for every Configuration a Task upload<Configuration>
–  Builds and publishes the Artefact belonging to the Configuration

• 

The Java-Plug-in creates a Configuration archives, which contains all artefacts
created in the Task jar
–  uploadArchives is the natural choice for publishing the artefacts

• 

Use of the Maven-Plug-in with apply plugin: ‘maven’
–  Doesn’t use the normal repository (intentionally)
apply plugin: 'maven'
version = '0.1-SNAPSHOT'
group = 'de.gradleworkshop'
uploadArchives {
repositories {
flatDir { dirs "repo" }
mavenDeployer { repository
(url : "file://$projectDir/mavenRepo/") }
}
}
The whole Script (less than 20 lines)
apply plugin: 'java'
apply plugin: 'pmd'
jar.manifest.attributes 'Main-Class': 'de.gradleworkshop.HelloWorld'
pmdMain {
ruleSets = [ "basic", "strings" ]
ignoreFailures = true
}
repositories { mavenCentral() }
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.+'
}
apply plugin: ‘maven’
version = '0.1-SNAPSHOT’
group = 'de.gradleworkshop’
uploadArchives {
repositories {
flatDir { dirs "repo" }
mavenDeployer { repository (url : "file:///gradleWS/myRepo/")
} } }
Recap
• 

We have, with Gradle
–  Built an Application
–  Created Tests and executed them
–  Used an alternative Test Framework TestNG
–  Used Quality Assurance
–  Uploaded the Artefacts into two Repositories

• 

You now know everything to build normal Projects with Gradle

• 

Gradle
–  Is simple
–  Easily understood
–  Has sensible conventions
–  That can be easily changed

• 

Gradle adapts to your needs
Questions?

Dr. Joachim Baumann
codecentric AG
An der Welle 4
60322 Frankfurt
Joachim.Baumann@codecentric.de
www.codecentric.de
blog.codecentric.de

24	
  

Más contenido relacionado

La actualidad más candente

[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...ZeroTurnaround
 
Basic Gradle Plugin Writing
Basic Gradle Plugin WritingBasic Gradle Plugin Writing
Basic Gradle Plugin WritingSchalk Cronjé
 
Gradle - time for another build
Gradle - time for another buildGradle - time for another build
Gradle - time for another buildIgor Khotin
 
Gradle plugins, take it to the next level
Gradle plugins, take it to the next levelGradle plugins, take it to the next level
Gradle plugins, take it to the next levelEyal Lezmy
 
In the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleIn the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleSkills Matter
 
Scala and Play with Gradle
Scala and Play with GradleScala and Play with Gradle
Scala and Play with GradleWei Chen
 
NetBeans Support for EcmaScript 6
NetBeans Support for EcmaScript 6NetBeans Support for EcmaScript 6
NetBeans Support for EcmaScript 6Kostas Saidis
 
Idiomatic gradle plugin writing
Idiomatic gradle plugin writingIdiomatic gradle plugin writing
Idiomatic gradle plugin writingSchalk Cronjé
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionSchalk Cronjé
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingSchalk Cronjé
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradleLiviu Tudor
 
Using the Groovy Ecosystem for Rapid JVM Development
Using the Groovy Ecosystem for Rapid JVM DevelopmentUsing the Groovy Ecosystem for Rapid JVM Development
Using the Groovy Ecosystem for Rapid JVM DevelopmentSchalk Cronjé
 
Cool JVM Tools to Help You Test
Cool JVM Tools to Help You TestCool JVM Tools to Help You Test
Cool JVM Tools to Help You TestSchalk Cronjé
 
うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-kyon mm
 

La actualidad más candente (20)

Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
 
Basic Gradle Plugin Writing
Basic Gradle Plugin WritingBasic Gradle Plugin Writing
Basic Gradle Plugin Writing
 
Gradle - time for another build
Gradle - time for another buildGradle - time for another build
Gradle - time for another build
 
Gradle plugins, take it to the next level
Gradle plugins, take it to the next levelGradle plugins, take it to the next level
Gradle plugins, take it to the next level
 
In the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: GradleIn the Brain of Hans Dockter: Gradle
In the Brain of Hans Dockter: Gradle
 
SBT Crash Course
SBT Crash CourseSBT Crash Course
SBT Crash Course
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
 
Scala and Play with Gradle
Scala and Play with GradleScala and Play with Gradle
Scala and Play with Gradle
 
NetBeans Support for EcmaScript 6
NetBeans Support for EcmaScript 6NetBeans Support for EcmaScript 6
NetBeans Support for EcmaScript 6
 
Simple Build Tool
Simple Build ToolSimple Build Tool
Simple Build Tool
 
Idiomatic gradle plugin writing
Idiomatic gradle plugin writingIdiomatic gradle plugin writing
Idiomatic gradle plugin writing
 
Gradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 versionGradle in 45min - JBCN2-16 version
Gradle in 45min - JBCN2-16 version
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradle
 
Building with Gradle
Building with GradleBuilding with Gradle
Building with Gradle
 
Using the Groovy Ecosystem for Rapid JVM Development
Using the Groovy Ecosystem for Rapid JVM DevelopmentUsing the Groovy Ecosystem for Rapid JVM Development
Using the Groovy Ecosystem for Rapid JVM Development
 
Cool JVM Tools to Help You Test
Cool JVM Tools to Help You TestCool JVM Tools to Help You Test
Cool JVM Tools to Help You Test
 
Gradle
GradleGradle
Gradle
 
うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-
 

Similar a Gradle for Beginners Guide to Building Java Projects

Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneAndres Almiray
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingAndres Almiray
 
Boosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyBoosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyJames Williams
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFXHendrik Ebbers
 
Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVMSylvain Wallez
 
Java For beginners and CSIT and IT students
Java  For beginners and CSIT and IT studentsJava  For beginners and CSIT and IT students
Java For beginners and CSIT and IT studentsPartnered Health
 
Practical Glusto Example
Practical Glusto ExamplePractical Glusto Example
Practical Glusto ExampleGluster.org
 
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdfITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdfOrtus Solutions, Corp
 
Testing basics for developers
Testing basics for developersTesting basics for developers
Testing basics for developersAnton Udovychenko
 
Improving your Gradle builds
Improving your Gradle buildsImproving your Gradle builds
Improving your Gradle buildsPeter Ledbrook
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartGabriele Lana
 
2014 International Software Testing Conference in Seoul
2014 International Software Testing Conference in Seoul2014 International Software Testing Conference in Seoul
2014 International Software Testing Conference in SeoulJongwook Woo
 
Make Your Build Great Again (DroidConSF 2017)
Make Your Build Great Again (DroidConSF 2017)Make Your Build Great Again (DroidConSF 2017)
Make Your Build Great Again (DroidConSF 2017)Jared Burrows
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestSeb Rose
 
"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James NelsonGWTcon
 

Similar a Gradle for Beginners Guide to Building Java Projects (20)

Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 Groovytesting
 
Boosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyBoosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with Groovy
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
 
Native Java with GraalVM
Native Java with GraalVMNative Java with GraalVM
Native Java with GraalVM
 
Why Gradle?
Why Gradle?Why Gradle?
Why Gradle?
 
Java For beginners and CSIT and IT students
Java  For beginners and CSIT and IT studentsJava  For beginners and CSIT and IT students
Java For beginners and CSIT and IT students
 
Practical Glusto Example
Practical Glusto ExamplePractical Glusto Example
Practical Glusto Example
 
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdfITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
ITB_2023_CommandBox_Task_Runners_Brad_Wood.pdf
 
Testing basics for developers
Testing basics for developersTesting basics for developers
Testing basics for developers
 
Improving your Gradle builds
Improving your Gradle buildsImproving your Gradle builds
Improving your Gradle builds
 
Refactoring In Tdd The Missing Part
Refactoring In Tdd The Missing PartRefactoring In Tdd The Missing Part
Refactoring In Tdd The Missing Part
 
2014 International Software Testing Conference in Seoul
2014 International Software Testing Conference in Seoul2014 International Software Testing Conference in Seoul
2014 International Software Testing Conference in Seoul
 
Make Your Build Great Again (DroidConSF 2017)
Make Your Build Great Again (DroidConSF 2017)Make Your Build Great Again (DroidConSF 2017)
Make Your Build Great Again (DroidConSF 2017)
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under Test
 
Svcc Groovy Testing
Svcc Groovy TestingSvcc Groovy Testing
Svcc Groovy Testing
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
 
Enter the gradle
Enter the gradleEnter the gradle
Enter the gradle
 
"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson
 

Más de Joachim Baumann

Erfahrungen mit agilen Festpreisen
Erfahrungen mit agilen FestpreisenErfahrungen mit agilen Festpreisen
Erfahrungen mit agilen FestpreisenJoachim Baumann
 
"Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ...
"Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ..."Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ...
"Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ...Joachim Baumann
 
Eröffnungs-Keynote der Manage Agile 2014
Eröffnungs-Keynote der Manage Agile 2014Eröffnungs-Keynote der Manage Agile 2014
Eröffnungs-Keynote der Manage Agile 2014Joachim Baumann
 
Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...
Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...
Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...Joachim Baumann
 
Introduction to Groovy (Serbian Developer Conference 2013)
Introduction to Groovy (Serbian Developer Conference 2013)Introduction to Groovy (Serbian Developer Conference 2013)
Introduction to Groovy (Serbian Developer Conference 2013)Joachim Baumann
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 
Warum agile Organisationen?
Warum agile Organisationen?Warum agile Organisationen?
Warum agile Organisationen?Joachim Baumann
 

Más de Joachim Baumann (8)

Multi speed IT
Multi speed ITMulti speed IT
Multi speed IT
 
Erfahrungen mit agilen Festpreisen
Erfahrungen mit agilen FestpreisenErfahrungen mit agilen Festpreisen
Erfahrungen mit agilen Festpreisen
 
"Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ...
"Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ..."Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ...
"Agilität, Unternehmen und Menschen." Eröffnungs-Keynote der "Embedded Meets ...
 
Eröffnungs-Keynote der Manage Agile 2014
Eröffnungs-Keynote der Manage Agile 2014Eröffnungs-Keynote der Manage Agile 2014
Eröffnungs-Keynote der Manage Agile 2014
 
Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...
Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...
Integration agiler und klassischer Vorgehensweisen (Embedded-Meets-Agile 18.2...
 
Introduction to Groovy (Serbian Developer Conference 2013)
Introduction to Groovy (Serbian Developer Conference 2013)Introduction to Groovy (Serbian Developer Conference 2013)
Introduction to Groovy (Serbian Developer Conference 2013)
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
Warum agile Organisationen?
Warum agile Organisationen?Warum agile Organisationen?
Warum agile Organisationen?
 

Último

New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 

Último (20)

New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 

Gradle for Beginners Guide to Building Java Projects

  • 1. Gradle for Beginners Coding Serbia, 18.10.2013 Joachim Baumann
  • 2. Gradle for Beginners •  Build-Management –  Needs –  Wishes •  Gradle - Basics •  Configuration and Execution Phase •  Groovy – Short Overview •  Plug-ins – Basics •  Our –  –  –  –  –  –  First Project Directory Structure Dependencies Manipulating the Jar Tests Quality Assurance Publishing the Artefacts
  • 3. What do we need from a Build-Management System? •  •  •  •  •  •  •  •  •  •  Translating the Source Code (using a compiler) Linking the Results Check out the source code from a repository (optional) Creating Tags (optional) Execution of different types of tests: Examples: –  Unit Tests for single Classes –  Module or Component Tests –  Integration Tests –  Functional and Non-Functional System Tests –  Automated Acceptance Tests Detailed Test Reports combining all Test Results (optional) Packing the Result (e.g., into a Jar, War or Ear) Transfer the Results to the different Stages / Test Systems and Execution of the respective Tests (optional) Support for multi-language Projects Creation of Documentation and Release Notes
  • 4. What do we wish for in our Build-Management System? •  Explicit Support of the Workflow implemented by the BuildManagement-System •  Simple Modifiability and Extensibility of the Workflow to adapt to local processes •  Readability and self-documentation of the notation in the build script •  Use of sensible conventions (e.g., where to find the sources) •  Simple change of the conventions to adap to local environment •  Incremental Build that can identify artefacts that have already been built •  Parallelisation of independent steps in the workflow to minimize waiting •  Programmatic access to all artefacts being created by the build •  Status reports that summarize the current state of the build
  • 5. Gradle - Basics •  Gradle uses build scripts which are named build.gradle •  Every build script is a Groovy script •  Two very important Principles –  Convention over Configuration –  Don’t Repeat Yourself •  Gradle creates a dynamic model of the workflow as a Directed Acyclic Graph (DAG) •  (Nearly) Everything is convention and can be changed tset tseTelipmoc dliub elipmoc elbmessa
  • 6. Configuration Phase •  •  •  •  Executes the build script The contained Groovy- and DSL-commands configure the underlying object tree The root of the object tree is the Project object –  Is directly available in the script (methods and properties) Creation of new Tasks that can be used Manipulation of the DAG •  Our first script build.gradle •  println ”Hello from the configuration phase"
  • 7. Execution Phase •  Executes all tasks that have been called (normally on the command line) •  For a task that is executed every task it depends on is executed beforehand •  Gradle uses the DAG to identify all task relationships tset tseTelipmoc dliub elipmoc elbmessa
  • 8. Task Definition •  •  Takes an (optional) configuration closure Alternatively: can be configured directly •  •  The operator << (left-shift) appends an action (a closure) to this task’s list of actions Equivalent to doLast() •  Insert at the beginning of the list with doFirst() task halloTask halloTask.doLast { print "from the " } halloTask << { println "execution phase" } halloTask.doFirst { print "Hello " } task postHallo (dependsOn: halloTask) << { println "End" } postHallo { // configuration closure dependsOn halloTask }
  • 9. Groovy – Short Overview •  Simplified Java Syntax –  Semicolon optional –  GString –  Everything is an Object –  Simplification e.g., “println” •  Scripts •  Operator Overloading –  Predefined •  Example << •  Operator for secure navigation a.?b –  You can provide your own implementations •  Named Parameters •  Closures •  Collection Iterators
  • 10. Plug-ins - Basics •  Plug-ins encapsulate functionality •  Can be written in any VM-language –  Groovy is a good choice •  Possible Plug-in Sources –  Plug-ins packed with Gradle –  Plug-ins included using URLs (don’t do it) –  Plug-ins provided by repositories (use your own repository) –  Self-written Plug-ins (normally in the directory buildSrc) •  Plug-ins –  Extend objects –  Provide new objects and / or abstractions –  Configure existing objects •  Plug-ins are load with the command apply plugin apply plugin: ‘java’
  • 11. Our first Project •  We use the Java Plug-in •  Default paths used by the Java Plug-in –  Derived from Maven Conventions
  • 12. The Class HelloWorld package de.gradleworkshop; import java.util.ArrayList; import java.util.List; public class HelloWorld { public static void main(String[] args) { HelloWorld hw = new HelloWorld(); for(String greeting : hw.generateGreetingsData()) System.out.println(greeting); } public List<String> generateGreetingsData() { List <String> greetings = new ArrayList <String>(); greetings.add("Hallo Welt"); return greetings; } }
  • 13. Manipulation of the Manifest •  Every Jar-Archive contains a file MANIFEST.MF •  Is generated by Gradle (see directory build/tmp/jar/MANIFEST.MF) •  Contains information e.g., about the main class of the jar •  Can be changed jar { manifest { attributes 'Main-Class': 'de.gradleworkshop.HelloWorld' } } •  Alternatively jar.manifest.attributes 'Main-Class': 'de.gradleworkshop.HelloWorld'
  • 14. Tests package de.gradleworkshop; import java.util.List; import org.junit.*; import static org.junit.Assert.*; public class HelloWorldTest { HelloWorld oUT; @Before public void setUp() { oUT = new HelloWorld(); } @Test public void testGenerateGreetingsData() { List<String> res = oUT.generateGreetingsData(); assertEquals("wrong number of results", 1, res.size()); } }
  • 15. Configurations and Dependencies •  Gradle defines Configuration Objects. These encapsulate –  Dependency Information –  Paths to Sources and Targets –  Associated Artefacts –  Additional Configuration Information •  Tasks use these Configurations •  For most pre-defined Task a Configuration exists –  compile, testCompile, runtime, testRuntime •  •  Dependencies are defined using the key word dependencies Maven-like notation for the dependencies dependencies { testCompile group: 'junit', name: 'junit', version: '4.+’ }
  • 16. Repositories •  Repositories provide libraries (normally jar archives) •  You can define Ivy or Maven Repositories, both public and private •  Predefined Repositories –  JCenter –  Maven Central –  Local Maven Repository (~/.m2/repository) •  Repositories are defined using the keyword repositories repositories { mavenLocal() } repositories { jcenter() mavenCentral() } •  Multiple Repositories can be defined
  • 17. The Application Plug-in •  The Application-Plug-in –  Adds a Task run –  Creates start scripts, that can be used with the Task run –  Creates a Task distZip, that packs all necessary files into a ziparchive –  Definition of the Main Class mainClassName = "de.gradleworkshop.HelloWorld" –  Usage with apply plugin: 'application'
  • 18. Using TestNG •  Very Simple dependencies { testCompile group: 'org.testng', name: 'testng', version: '6.+' } test { useTestNG() }
  • 19. Test Class for TestNG package de.gradleworkshop; import java.util.List; import static org.junit.Assert.assertEquals; import static org.testng.AssertJUnit.*; import org.testng.annotations.*; public class TestHelloWorld { HelloWorld oUT; @BeforeTest public void setUp() { oUT = new HelloWorld(); } @Test public void testGenerateGreetingsData() { List<String> res = oUT.generateGreetingsData(); assertEquals("Wrong Number of Entries", 1, res.size()); } }
  • 20. Quality Assurance •  Support for PMD, Checkstyle, Findbugs, Emma, Sonar … •  Example PMD apply plugin: 'pmd' pmdMain { ruleSets = [ "basic", "strings" ] ignoreFailures = true } •  Another Example configuring all Tasks of Type Pmd using withType() tasks.withType(Pmd) { ruleSets = [ "basic", "strings" ] ignoreFailures = true ruleSetFiles = files('config/pmd/rulesets.xml') reports { xml.enabled false html.enabled true } }
  • 21. Publishing the Artefacts •  Gradle defines for every Configuration a Task upload<Configuration> –  Builds and publishes the Artefact belonging to the Configuration •  The Java-Plug-in creates a Configuration archives, which contains all artefacts created in the Task jar –  uploadArchives is the natural choice for publishing the artefacts •  Use of the Maven-Plug-in with apply plugin: ‘maven’ –  Doesn’t use the normal repository (intentionally) apply plugin: 'maven' version = '0.1-SNAPSHOT' group = 'de.gradleworkshop' uploadArchives { repositories { flatDir { dirs "repo" } mavenDeployer { repository (url : "file://$projectDir/mavenRepo/") } } }
  • 22. The whole Script (less than 20 lines) apply plugin: 'java' apply plugin: 'pmd' jar.manifest.attributes 'Main-Class': 'de.gradleworkshop.HelloWorld' pmdMain { ruleSets = [ "basic", "strings" ] ignoreFailures = true } repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.+' } apply plugin: ‘maven’ version = '0.1-SNAPSHOT’ group = 'de.gradleworkshop’ uploadArchives { repositories { flatDir { dirs "repo" } mavenDeployer { repository (url : "file:///gradleWS/myRepo/") } } }
  • 23. Recap •  We have, with Gradle –  Built an Application –  Created Tests and executed them –  Used an alternative Test Framework TestNG –  Used Quality Assurance –  Uploaded the Artefacts into two Repositories •  You now know everything to build normal Projects with Gradle •  Gradle –  Is simple –  Easily understood –  Has sensible conventions –  That can be easily changed •  Gradle adapts to your needs
  • 24. Questions? Dr. Joachim Baumann codecentric AG An der Welle 4 60322 Frankfurt Joachim.Baumann@codecentric.de www.codecentric.de blog.codecentric.de 24