SlideShare ist ein Scribd-Unternehmen logo
1 von 79
Downloaden Sie, um offline zu lesen
#ACCU2016 ACCU Bristol 2016
USING THE GROOVY
ECOSYSTEM FOR RAPID
JVM DEVELOPMENT
Schalk W. Cronjé
1
ABOUT ME
Email:
Twitter / Ello : @ysb33r
ysb33r@gmail.com
2
 
3 . 1
SDKMAN
Manages parallel version of multiple SDKs
Mostly for (but not limited to) JVM-related systems
Windows users can use Posh-GVM (Powershell)
Windows 10 Bash ??
curl -s http://get.sdkman.io | bash
3 . 2
SDKMAN DEMO
3 . 3
 
SdkMan:
Posh-GVM:
@sdkmanager
http://sdkman.io
https://github.com/ ofreud/posh-gvm
3 . 4
APACHE GROOVY
A dynamic & static typed language for the JVM with REPL
capability.
4 . 1
GROOVY VS JAVA
In Groovy:
All class members are public by default
No need to create getters/setters for public elds
Both static & dynamic typing supported
def means Object
4 . 2
CALLING METHODS
class Foo {
void bar( def a,def b ) {}
}
def foo = new Foo()
foo.bar( '123',456 )
foo.bar '123', 456
foo.with {
bar '123', 456
}
4 . 3
CALLING METHODS WITH CLOSURES
class Foo {
void bar( def a,Closure b ) {}
}
def foo = new Foo()
foo.bar( '123',{ println it } )
foo.bar ('123') {
println it
}
foo.bar '123', {
println it
}
4 . 4
MAPS IN GROOVY
Hashmaps in Groovy are simple to use
def myMap = [ plugin : 'java' ]
Maps are easy to pass inline to functions
project.apply( plugin : 'java' )
Which can also be written as
project.with {
apply plugin : 'java'
}
4 . 5
LISTS IN GROOVY
Lists in Groovy are simple too
def myList = [ 'clone', 'http://github.com/ysb33r/GradleLectures' ]
This makes it possible write a method call as
args 'clone', 'http://github.com/ysb33r/GradleLectures'
4 . 6
CLOSURE DELEGATION IN GROOVY
When a symbol cannot be resolved within a closure,
Groovy will look elsewhere
In Groovy speak this is called a Delegate.
This can be programmatically controlled via the
Closure.delegate property.
4 . 7
CLOSURE DELEGATION IN GROOVY
class Foo {
def target
}
class Bar {
Foo foo = new Foo()
void doSomething( Closure c ) {
c.delegate = foo
c()
}
}
Bar bar = new Bar()
bar.doSomething {
target = 10
}
4 . 8
MORE CLOSURE MAGIC
If a Groovy class has a method call(Closure), the object
can be passed a closure directly.
class Foo {
def call( Closure c) { /* ... */ }
}
Foo foo = new Foo()
foo {
println 'Hello, world'
}
// This avoids ugly syntax
foo.call({ println 'Hello, world' })
4 . 9
SMOOTH OPERATOR: ELVIS
?:
// Selecting a default value if variable is not set
String a
String b = 'def'
// Prints 'foo'
println a ?: 'foo'
// Print 'def'
println b ?: 'foo'
4 . 10
SMOOTH OPERATOR: SAFE NAVIGATION
?.
// Returns a value if not-null, otherwise null
String a
String b = 'def'
assert a?.size() == null
assert b?.size() == 3
println a.size() // Throws NPE
4 . 11
4 . 12
SMOOTH OPERATOR: SPREAD
*.
// Apply operation to each member in collection
def a = [ 'a','bb','c' ]
assert a*.size() == [ 1,2,1 ]
STATIC VS DYNAMIC
By default code in Groovy is compiled with dynamic typing.
Typing can be modifed by selective application of
annotations:
@CompileStatic - compile static typing
@CompileDynamic - compile dynamic typing
@TypeChecked - compile dynamic, but check types
Apply to classes & methods.
4 . 13
IS GROOVY SLOWER THAN JAVA?
Yes and No.
Context is critical
Russell Winder has done number of experiments
JSON parsing in Groovy is faster than Java.
Develop rst, measure, then optimise!
Remember C++ → C → Assembler optimisation?
4 . 14
APACHE GROOVY
Apache Groovy home
Documentation
Twitter
@ApacheGroovy
http://groovy-lang.org/
http://groovy-lang.org/documentation.html
4 . 15
5 . 1
 
5 . 2
GRADLE
Very modern, next-generation build & deployment pipeline
tool
DSL is based on Groovy
Vast collection of plugins
GRADLE
apply plugin : 'groovy'
repositories {
jcenter()
}
dependencies {
testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
testCompile "org.gebish:geb-spock:0.13.0"
testCompile "org.seleniumhq.selenium:selenium-api:2.53.0"
testRuntime "org.seleniumhq.selenium:selenium-support:2.53.0"
testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:2.53.0"
}
5 . 3
GRADLE
Make it easy to integrate development and complex testing
Deploy local & to remote sites via plugins
Use Docker local & remote
"I do not have means to test on my machine" becomes less
of an argument.
5 . 4
GRADLE JVM POLYGOT
Build a distributable application packaged as as ZIP
Runnable via shell script or batch le
Contains classes written Java, Groovy & Kotlin source
Test source code with Spock Framework
5 . 5
GRADLE JVM POLYGOT
apply plugin : 'java'
apply plugin : 'groovy'
apply plugin : 'com.zoltu.kotlin'
apply plugin : 'application'
repositories {
jcenter()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.4.3'
compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1'
testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
}
version = '1.0'
mainClassName = "gradle.workshop.HelloJava"
5 . 6
GRADLE DEPENDENCY MANAGEMENT
Easy to use
Flexible to con gure for exceptions
Uses dependencies closure
First word on line is usually name of a con guration.
Con gurations are usually supplied by plugins.
Dependencies are downloaded from repositories
Maven coordinates are used as format
5 . 7
GRADLE REPOSITORIES
Speci ed within a repositories closure
Processed in listed order to look for dependencies
jcenter() preferred open-source repo.
mavenLocal(), mavenCentral(), maven {}
Ivy repositories via ivy {}
Flat-directory repositories via flatDir
5 . 8
GRADLE REPOSITORIES
repositories {
jcenter()
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
ivy {
url 'file://path/to/repo'
layout 'pattern', {
artifact '[module]/[revision]/[artifact](.[ext])'
ivy '[module]/[revision]/ivy.xml'
}
}
}
5 . 9
BUILDSCRIPT
The buildscript closure is special
It tells Gradle what to load into the classpath before
evaluating the script itself.
It also tells it where to look for those dependencies.
Even though Gradle 2.1 has added a new way of adding
external plugins, buildscript are much more exible.
5 . 10
EXTENSIONS
Extensions are global con guration blocks added by
plugins.
Example: The jruby-gradle-base plugin will add a
jruby block.
apply plugin: 'com.github.jruby-gradle.base'
jruby {
defaultVersion = '1.7.11'
}
5 . 11
GRADLE TASKS
Can be based upon a task type
task runSomething ( type : Exec ) {
command 'git'
args 'clone', 'https://bitbucket.com/ysb33r/GradleWorkshop'
}
Can be free-form
task hellowWorld << {
println 'Hello, world'
}
5 . 12
5 . 13
GRADLE: BUILDING C++
apply plugin : 'cpp'
GRADLE: BUILDING C++
Need to change convention from traditional C++ projects
.cpp les go in src/${name}/cpp
Exported headers les go in src/${name}/headers
Local header les should be in src/${name}/cpp
Object les will end up in ${buildDir}/objs
Binary les will end up in ${buildDir}/binaries
5 . 14
5 . 15
BUILDING C++: PROJECT LAYOUT
├── build.gradle
└── src
└─── hello
   ├── cpp
│ └─── hello.cpp
│
   └── headers
└─── hello.hpp
5 . 16
BUILDING C++: EXISTING PROJECTS
Source directories can be adjusted
Alternative compiler locations
5 . 17
BUILDING C++: ALTERNATIVE SOURCE
sources {
cpp {
source {
srcDir "myDir"
include "**/*.cpp"
}
}
}
BUILDING C++: TOOL SUPPORT
Operating
System
Tool Chain Of cial
Linux gcc, clang Y
MacOS X Xcode Y
gcc-macports, clang-
macports
N
Windows Visual C++, gcc-cygwin32,
gcc-mingw
Y
gcc-cygwin64 N
Unix-like gcc, clang N
5 . 18
5 . 19
BUILDING C++: EXECUTABLE
model {
components {
hello(NativeExecutableSpec)
}
}
BUILDING C++: CUSTOM COMPILER
model {
toolChains {
gcc(Gcc) {
path '/installed/in/foo/dir/gcc'
eachPlatform {
cppCompiler.withArguments { args ->
args << "-DNDEBUG"
}
}
}
}
}
5 . 20
BUILDING C++: OTHER FEATURES
Cross compilation
Multi-architecture targets
Set compiler & linker ags
Multi-variant builds
5 . 21
BUILDING C++: WEAKNESS
Currently only have built-in support for CUnit
Only platform con guration tool support is CMake
No Autotools equivalent
DSL can be slicker
5 . 22
 
Website:
Plugins Portal:
User Forum:
@gradle
@DailyGradle
http://gradle.org
http://plugins.gradle.org
http://discuss.gradle.org
5 . 23
 
http://leanpub.com/idiomaticgradle
6
LET’S REVIEW OUR TESTS
7 . 1
LET’S GET UNIT TESTING
class CalculatorSpec extends Specification {
def "A calculator must be able to add numbers"() {
given: 'That I have a calculator'
def calc = new Calculator()
when: "I add 2, 3 and -20"
def answer = calc.plus 2,3,-20
then: "The answer should be -15"
answer == -15
}
}
7 . 2
WHEN THIS TEST FAILS
7 . 3
WHEN THIS TEST FAILS
7 . 4
SPOCK FRAMEWORK
Built on top of JUnit 4.x.
Use it with all your JUnit tools!
Use for more than just unit tests.
Mocks & stubs included
Easily test Java, Groovy, Kotlin, Scala etc.
7 . 5
DATA-DRIVEN TESTS
@Unroll
def "A calculator must be able to multiply"() {
given: 'That I have a multiplying calculator'
def calc = new Calculator()
expect: "The answer to be #answer"
answer == calc.multiply (a,b,c)
where: "The operation is #a * #b * #c"
a | b | c || answer
3 | 7 | 5 || 105
1 | 3 | 0 || 0
2 | -1| 1 || -2
}
7 . 6
ANOTHER COOL FAILURE REPORT
7 . 7
HANDLING EXCEPTIONS
def "Dividing by zero should throw an exception"() {
given: 'That I have a dividing calculator'
def calc = new Calculator()
when: "I divide by zero"
calc.divide 1,0
then: "I expect an error"
thrown(ArithmeticException)
}
7 . 8
MOCK OUT INTERFACES
public interface RemoteCalculator {
public Number plus(Number... args);
}
def "Remote calculator"() {
given: "A remote calculator is available"
def calc = Mock(RemoteCalculator)
when: "Multiple items are sent for addition"
calc.plus 1,2,3,4,5
then: "The calculator is only called once"
1 * calc.plus(_)
}
7 . 9
SPOCK FRAMEWORK
Spock Framework:
Spock Reports
http://spockframework.github.io/spock/docs/1.0/index.html
https://github.com/renatoathaydes/spock-reports
7 . 10
WEBSITE TESTING
One of the most predominant area of testing of this decade
Test-driven webpage development is less effort in long run
Selenium is the leading tool
Selenium tests can be overly verbose
8 . 1
TRIVIAL TEST EXAMPLE
def "Learn about testing checkboxes"() {
when: "I go to that the-internet site"
go "${webroot}/checkboxes"
then: 'I am expecting Checkbox page'
$('h3').text() == 'Checkboxes'
and: 'The checkbox states are no & yes'
$(By.id('checkboxes')).$('input')*.@checked == ['','true']
}
8 . 2
9 . 1
 
GEB
Integrates with
Spock Framework
JUnit
TestNG
Cucumber-JVM
Makes Selenium readable
Anything you can do in Selenium you can do in Geb
9 . 2
TRIVIAL TEST EXAMPLE COMPLETE
class CheckboxExampleSpec extends GebSpec {
def "Learn about testing checkboxes"() {
when: "I go to that the-internet site"
go "${webroot}/checkboxes"
then: 'I am expecting Checkbox page'
$('h3').text() == 'Checkboxes'
and: 'The checkbox states are no & yes'
$(By.id('checkboxes')).$('input')*.@checked == ['','true']
}
}
9 . 3
GRABBING SCREENSHOTS
class CheckboxReportingSpec extends GebReportingSpec {
def 'Learn about testing checkboxes'() {
when: 'I go to that the-internet site'
go "${webroot}/checkboxes"
report 'checkbox-screen'
then: 'I am expecting Checkbox page'
$('h3').text() == 'Checkboxes'
and: 'The checkbox states are no & yes'
$(By.id('checkboxes')).$('input')*.@checked == ['','true']
}
}
Keep record during test
Stores HTML & PNG.
9 . 4
GRABBING SCREENSHOTS
9 . 5
 
@GemFramework
http://gebish.org
9 . 6
10 . 1
 
10 . 2
RATPACK FRAMEWORK
Set of Java libraries for building modern HTTP applications.
Built on Java 8, Netty and reactive principles.
Groovy syntax for those who prefer it.
RATPACK QUICKSTART SERVER
@Grapes([
@Grab('io.ratpack:ratpack-groovy:1.2.0'),
@Grab('org.slf4j:slf4j-simple:1.7.12')
])
import static ratpack.groovy.Groovy.ratpack
ratpack {
handlers {
get {
render "Hello World!nn"
}
get(":name") {
render "Hello $pathTokens.name!nn"
}
}
}
10 . 3
10 . 4
RATPACK’S TESTHTTPCLIENT
Can be used standalone
Use maven coordinates:
io.ratpack:ratpack-test:1.2.0
RATPACK’S TESTHTTPCLIENT
ApplicationUnderTest app = new ApplicationUnderTest() {
@Override
URI getAddress() { "http://127.0.0.1:${PORT}".toURI() }
}
@Delegate TestHttpClient client = TestHttpClient.testHttpClient(app)
def "The echo path should return what is send to it"() {
given: "A simple text request"
requestSpec { pay ->
pay.body.type(MediaType.PLAIN_TEXT_UTF8).text(' ')
}
when: "The data is posted"
post '/'
then: "It should be echoed back"
response.statusCode == 200
response.body.text == 'You said: '
}
10 . 5
QUICK HTTP TESTING
Quickly point to a remote or in-process server
Build payload in a simplistic manner
Execute the verb
Check the response in a readable manner
10 . 6
QUICK HTTP TESTING
def "The echo path should return what is send to it"() {
given: "A simple text request"
requestSpec { pay ->
pay.body.type(MediaType.PLAIN_TEXT_UTF8).text(' ')
}
when: "The data is posted"
post '/'
then: "It should be echoed back"
response.statusCode == 200
response.body.text == 'You said: '
}
10 . 7
OTHER GR8-UNIVERSE TOOLS
Grails - Build web applications fast
Griffon - Best way to build desktop apps
Grooscript - Groovy to Javascript
Groovy VFS - File operations on remote servers using
variety of protocols
Sshoogr - SSH & SCP
Groowin - WinRM
11
THANK YOU
Schalk W. Cronjé
Email: ysb33r@gmail.com
Twitter: @ysb33r
12
BITS & PIECES
13
GROOVY VFS
def vfs = new VFS()
vfs {
cp 'ftp://some.server/pub/file0.txt?vfs.ftp.passiveMode=1',
'sftp://user:pass@another.server/path/file1.txt',
overwrite : true
}
https://github.com/ysb33r/groovy-vfs
14
15
SSHOOGR
remoteSession('user:pass@another.server') {
exec 'rm -rf ~/tmp/*'
exec 'touch this.file'
remoteFile('this.file').text = "enabled=true"
}
https://github.com/aestasit/sshoogr
16
GROOSCRIPT
http://grooscript.org/
THANK YOU
Schalk W. Cronjé
Email: ysb33r@gmail.com
Twitter: @ysb33r
17
ABOUT THIS PRESENTATION
Written in Asciidoctor (1.5.3.2)
Styled by asciidoctor-revealjs extension
Built using:
Gradle
gradle-asciidoctor-plugin
gradle-vfs-plugin
All code snippets tested as part of build

Weitere ähnliche Inhalte

Was ist angesagt?

Apache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystemApache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystemKostas Saidis
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Rajmahendra Hegde
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingSchalk Cronjé
 
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume LaforgeGroovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume LaforgeGuillaume Laforge
 
[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
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradleLiviu Tudor
 
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
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Tomek Kaczanowski
 
うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-kyon mm
 
Gradle - time for a new build
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new buildIgor Khotin
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Roberto Franchini
 
Build microservice with gRPC in golang
Build microservice with gRPC in golangBuild microservice with gRPC in golang
Build microservice with gRPC in golangTing-Li Chou
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End DevelopmentWe Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End DevelopmentAll Things Open
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構Bo-Yi Wu
 

Was ist angesagt? (20)

Apache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystemApache Groovy: the language and the ecosystem
Apache Groovy: the language and the ecosystem
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
 
What's New in Groovy 1.6?
What's New in Groovy 1.6?What's New in Groovy 1.6?
What's New in Groovy 1.6?
 
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume LaforgeGroovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
 
groovy & grails - lecture 10
groovy & grails - lecture 10groovy & grails - lecture 10
groovy & grails - lecture 10
 
[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...
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradle
 
groovy & grails - lecture 9
groovy & grails - lecture 9groovy & grails - lecture 9
groovy & grails - lecture 9
 
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
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010
 
groovy & grails - lecture 5
groovy & grails - lecture 5groovy & grails - lecture 5
groovy & grails - lecture 5
 
うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-うさぎ組 in G* WorkShop -うさみみの日常-
うさぎ組 in G* WorkShop -うさみみの日常-
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Gradle - time for a new build
Gradle - time for a new buildGradle - time for a new build
Gradle - time for a new build
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
 
Build microservice with gRPC in golang
Build microservice with gRPC in golangBuild microservice with gRPC in golang
Build microservice with gRPC in golang
 
groovy & grails - lecture 13
groovy & grails - lecture 13groovy & grails - lecture 13
groovy & grails - lecture 13
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End DevelopmentWe Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End Development
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
 

Ähnlich wie Using the Groovy Ecosystem for Rapid JVM Development

An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersKostas Saidis
 
Boosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyBoosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyJames Williams
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingAndres Almiray
 
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
 
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume LaforgeGR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume LaforgeGR8Conf
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
Whitebox testing of Spring Boot applications
Whitebox testing of Spring Boot applicationsWhitebox testing of Spring Boot applications
Whitebox testing of Spring Boot applicationsYura Nosenko
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Tino Isnich
 
Silicon Valley JUG: JVM Mechanics
Silicon Valley JUG: JVM MechanicsSilicon Valley JUG: JVM Mechanics
Silicon Valley JUG: JVM MechanicsAzul Systems, Inc.
 
Develop and deploy haskell with docker
Develop and deploy haskell with dockerDevelop and deploy haskell with docker
Develop and deploy haskell with dockerChris Biscardi
 
Advanced debugging  techniques in different environments
Advanced debugging  techniques in different environmentsAdvanced debugging  techniques in different environments
Advanced debugging  techniques in different environmentsAndrii Soldatenko
 
Retrolambda+bolts
Retrolambda+boltsRetrolambda+bolts
Retrolambda+boltsTom Sun
 
LISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial HandoutsLISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial HandoutsTobias Oetiker
 
GTAC Boosting your Testing Productivity with Groovy
GTAC Boosting your Testing Productivity with GroovyGTAC Boosting your Testing Productivity with Groovy
GTAC Boosting your Testing Productivity with GroovyAndres Almiray
 
Node.js basics
Node.js basicsNode.js basics
Node.js basicsBen Lin
 
10 Cool Facts about Gradle
10 Cool Facts about Gradle10 Cool Facts about Gradle
10 Cool Facts about GradleEvgeny Goldin
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseChristian Melchior
 
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGHDeploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGHErica Windisch
 

Ähnlich wie Using the Groovy Ecosystem for Rapid JVM Development (20)

An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java Developers
 
Boosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with GroovyBoosting Your Testing Productivity with Groovy
Boosting Your Testing Productivity with Groovy
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 Groovytesting
 
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
 
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume LaforgeGR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
GR8Conf 2009: What's New in Groovy 1.6? by Guillaume Laforge
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
Whitebox testing of Spring Boot applications
Whitebox testing of Spring Boot applicationsWhitebox testing of Spring Boot applications
Whitebox testing of Spring Boot applications
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01
 
Docker perl build
Docker perl buildDocker perl build
Docker perl build
 
Silicon Valley JUG: JVM Mechanics
Silicon Valley JUG: JVM MechanicsSilicon Valley JUG: JVM Mechanics
Silicon Valley JUG: JVM Mechanics
 
Develop and deploy haskell with docker
Develop and deploy haskell with dockerDevelop and deploy haskell with docker
Develop and deploy haskell with docker
 
Advanced debugging  techniques in different environments
Advanced debugging  techniques in different environmentsAdvanced debugging  techniques in different environments
Advanced debugging  techniques in different environments
 
Retrolambda+bolts
Retrolambda+boltsRetrolambda+bolts
Retrolambda+bolts
 
LISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial HandoutsLISA Qooxdoo Tutorial Handouts
LISA Qooxdoo Tutorial Handouts
 
GTAC Boosting your Testing Productivity with Groovy
GTAC Boosting your Testing Productivity with GroovyGTAC Boosting your Testing Productivity with Groovy
GTAC Boosting your Testing Productivity with Groovy
 
Node.js basics
Node.js basicsNode.js basics
Node.js basics
 
10 Cool Facts about Gradle
10 Cool Facts about Gradle10 Cool Facts about Gradle
10 Cool Facts about Gradle
 
Taming AEM deployments
Taming AEM deploymentsTaming AEM deployments
Taming AEM deployments
 
Coroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in PractiseCoroutines for Kotlin Multiplatform in Practise
Coroutines for Kotlin Multiplatform in Practise
 
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGHDeploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
 

Mehr von Schalk Cronjé

DocuOps & Asciidoctor in a JVM World
DocuOps & Asciidoctor in a JVM WorldDocuOps & Asciidoctor in a JVM World
DocuOps & Asciidoctor in a JVM WorldSchalk Cronjé
 
What's new in Asciidoctor
What's new in AsciidoctorWhat's new in Asciidoctor
What's new in AsciidoctorSchalk Cronjé
 
Probability Management
Probability ManagementProbability Management
Probability ManagementSchalk Cronjé
 
Seeking Enligtenment - A journey of purpose rather than instruction
Seeking Enligtenment  - A journey of purpose rather than instructionSeeking Enligtenment  - A journey of purpose rather than instruction
Seeking Enligtenment - A journey of purpose rather than instructionSchalk Cronjé
 
Seeking Enligtenment - A journey of purpose rather tan instruction
Seeking Enligtenment - A journey of purpose rather tan instructionSeeking Enligtenment - A journey of purpose rather tan instruction
Seeking Enligtenment - A journey of purpose rather tan instructionSchalk Cronjé
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingSchalk Cronjé
 
Beyond Estimates - Probability Management
Beyond Estimates - Probability ManagementBeyond Estimates - Probability Management
Beyond Estimates - Probability ManagementSchalk Cronjé
 
Documentation An Engineering Problem Unsolved
Documentation  An Engineering Problem UnsolvedDocumentation  An Engineering Problem Unsolved
Documentation An Engineering Problem UnsolvedSchalk Cronjé
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingSchalk Cronjé
 
Death of Agile : Welcome to Value-focused Testing
Death of Agile : Welcome to Value-focused TestingDeath of Agile : Welcome to Value-focused Testing
Death of Agile : Welcome to Value-focused TestingSchalk Cronjé
 
Tree of Knowledge - About Philosophy, Unity & Testing
Tree of Knowledge - About Philosophy, Unity & TestingTree of Knowledge - About Philosophy, Unity & Testing
Tree of Knowledge - About Philosophy, Unity & TestingSchalk Cronjé
 
Beyond estimates - Overview at Agile:MK
Beyond estimates - Overview at Agile:MKBeyond estimates - Overview at Agile:MK
Beyond estimates - Overview at Agile:MKSchalk Cronjé
 
Groovy VFS (with 1.0 news)
Groovy VFS (with 1.0 news)Groovy VFS (with 1.0 news)
Groovy VFS (with 1.0 news)Schalk Cronjé
 
Beyond estimates - Reflection on the state of Agile Forecasting
Beyond estimates - Reflection on the state of Agile ForecastingBeyond estimates - Reflection on the state of Agile Forecasting
Beyond estimates - Reflection on the state of Agile ForecastingSchalk Cronjé
 
Seeking enligtenment - A journey of "Why?" rather than "How?"
Seeking enligtenment - A journey of "Why?" rather than "How?"Seeking enligtenment - A journey of "Why?" rather than "How?"
Seeking enligtenment - A journey of "Why?" rather than "How?"Schalk Cronjé
 
RfC2822 for Mere Mortals
RfC2822 for Mere MortalsRfC2822 for Mere Mortals
RfC2822 for Mere MortalsSchalk Cronjé
 
Prosperity-focused Agile Technology Leadership
Prosperity-focused Agile Technology LeadershipProsperity-focused Agile Technology Leadership
Prosperity-focused Agile Technology LeadershipSchalk Cronjé
 

Mehr von Schalk Cronjé (20)

DocuOps & Asciidoctor in a JVM World
DocuOps & Asciidoctor in a JVM WorldDocuOps & Asciidoctor in a JVM World
DocuOps & Asciidoctor in a JVM World
 
DocuOps & Asciidoctor
DocuOps & AsciidoctorDocuOps & Asciidoctor
DocuOps & Asciidoctor
 
What's new in Asciidoctor
What's new in AsciidoctorWhat's new in Asciidoctor
What's new in Asciidoctor
 
Probability Management
Probability ManagementProbability Management
Probability Management
 
Seeking Enligtenment - A journey of purpose rather than instruction
Seeking Enligtenment  - A journey of purpose rather than instructionSeeking Enligtenment  - A journey of purpose rather than instruction
Seeking Enligtenment - A journey of purpose rather than instruction
 
Seeking Enligtenment - A journey of purpose rather tan instruction
Seeking Enligtenment - A journey of purpose rather tan instructionSeeking Enligtenment - A journey of purpose rather tan instruction
Seeking Enligtenment - A journey of purpose rather tan instruction
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
 
Beyond Estimates - Probability Management
Beyond Estimates - Probability ManagementBeyond Estimates - Probability Management
Beyond Estimates - Probability Management
 
Documentation An Engineering Problem Unsolved
Documentation  An Engineering Problem UnsolvedDocumentation  An Engineering Problem Unsolved
Documentation An Engineering Problem Unsolved
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
 
Death of Agile : Welcome to Value-focused Testing
Death of Agile : Welcome to Value-focused TestingDeath of Agile : Welcome to Value-focused Testing
Death of Agile : Welcome to Value-focused Testing
 
Asciidoctor in 15min
Asciidoctor in 15minAsciidoctor in 15min
Asciidoctor in 15min
 
Tree of Knowledge - About Philosophy, Unity & Testing
Tree of Knowledge - About Philosophy, Unity & TestingTree of Knowledge - About Philosophy, Unity & Testing
Tree of Knowledge - About Philosophy, Unity & Testing
 
Beyond estimates - Overview at Agile:MK
Beyond estimates - Overview at Agile:MKBeyond estimates - Overview at Agile:MK
Beyond estimates - Overview at Agile:MK
 
Groovy VFS (with 1.0 news)
Groovy VFS (with 1.0 news)Groovy VFS (with 1.0 news)
Groovy VFS (with 1.0 news)
 
Beyond estimates - Reflection on the state of Agile Forecasting
Beyond estimates - Reflection on the state of Agile ForecastingBeyond estimates - Reflection on the state of Agile Forecasting
Beyond estimates - Reflection on the state of Agile Forecasting
 
Seeking enligtenment - A journey of "Why?" rather than "How?"
Seeking enligtenment - A journey of "Why?" rather than "How?"Seeking enligtenment - A journey of "Why?" rather than "How?"
Seeking enligtenment - A journey of "Why?" rather than "How?"
 
RfC2822 for Mere Mortals
RfC2822 for Mere MortalsRfC2822 for Mere Mortals
RfC2822 for Mere Mortals
 
Groovy VFS
Groovy VFSGroovy VFS
Groovy VFS
 
Prosperity-focused Agile Technology Leadership
Prosperity-focused Agile Technology LeadershipProsperity-focused Agile Technology Leadership
Prosperity-focused Agile Technology Leadership
 

Kürzlich hochgeladen

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceanilsa9823
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...Health
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 

Kürzlich hochgeladen (20)

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 

Using the Groovy Ecosystem for Rapid JVM Development

  • 1. #ACCU2016 ACCU Bristol 2016 USING THE GROOVY ECOSYSTEM FOR RAPID JVM DEVELOPMENT Schalk W. Cronjé
  • 2. 1 ABOUT ME Email: Twitter / Ello : @ysb33r ysb33r@gmail.com
  • 4. 3 . 1 SDKMAN Manages parallel version of multiple SDKs Mostly for (but not limited to) JVM-related systems Windows users can use Posh-GVM (Powershell) Windows 10 Bash ?? curl -s http://get.sdkman.io | bash
  • 7. 3 . 4 APACHE GROOVY A dynamic & static typed language for the JVM with REPL capability.
  • 8. 4 . 1 GROOVY VS JAVA In Groovy: All class members are public by default No need to create getters/setters for public elds Both static & dynamic typing supported def means Object
  • 9. 4 . 2 CALLING METHODS class Foo { void bar( def a,def b ) {} } def foo = new Foo() foo.bar( '123',456 ) foo.bar '123', 456 foo.with { bar '123', 456 }
  • 10. 4 . 3 CALLING METHODS WITH CLOSURES class Foo { void bar( def a,Closure b ) {} } def foo = new Foo() foo.bar( '123',{ println it } ) foo.bar ('123') { println it } foo.bar '123', { println it }
  • 11. 4 . 4 MAPS IN GROOVY Hashmaps in Groovy are simple to use def myMap = [ plugin : 'java' ] Maps are easy to pass inline to functions project.apply( plugin : 'java' ) Which can also be written as project.with { apply plugin : 'java' }
  • 12. 4 . 5 LISTS IN GROOVY Lists in Groovy are simple too def myList = [ 'clone', 'http://github.com/ysb33r/GradleLectures' ] This makes it possible write a method call as args 'clone', 'http://github.com/ysb33r/GradleLectures'
  • 13. 4 . 6 CLOSURE DELEGATION IN GROOVY When a symbol cannot be resolved within a closure, Groovy will look elsewhere In Groovy speak this is called a Delegate. This can be programmatically controlled via the Closure.delegate property.
  • 14. 4 . 7 CLOSURE DELEGATION IN GROOVY class Foo { def target } class Bar { Foo foo = new Foo() void doSomething( Closure c ) { c.delegate = foo c() } } Bar bar = new Bar() bar.doSomething { target = 10 }
  • 15. 4 . 8 MORE CLOSURE MAGIC If a Groovy class has a method call(Closure), the object can be passed a closure directly. class Foo { def call( Closure c) { /* ... */ } } Foo foo = new Foo() foo { println 'Hello, world' } // This avoids ugly syntax foo.call({ println 'Hello, world' })
  • 16. 4 . 9 SMOOTH OPERATOR: ELVIS ?: // Selecting a default value if variable is not set String a String b = 'def' // Prints 'foo' println a ?: 'foo' // Print 'def' println b ?: 'foo'
  • 17. 4 . 10 SMOOTH OPERATOR: SAFE NAVIGATION ?. // Returns a value if not-null, otherwise null String a String b = 'def' assert a?.size() == null assert b?.size() == 3 println a.size() // Throws NPE
  • 18. 4 . 11 4 . 12 SMOOTH OPERATOR: SPREAD *. // Apply operation to each member in collection def a = [ 'a','bb','c' ] assert a*.size() == [ 1,2,1 ]
  • 19. STATIC VS DYNAMIC By default code in Groovy is compiled with dynamic typing. Typing can be modifed by selective application of annotations: @CompileStatic - compile static typing @CompileDynamic - compile dynamic typing @TypeChecked - compile dynamic, but check types Apply to classes & methods.
  • 20. 4 . 13 IS GROOVY SLOWER THAN JAVA? Yes and No. Context is critical Russell Winder has done number of experiments JSON parsing in Groovy is faster than Java. Develop rst, measure, then optimise! Remember C++ → C → Assembler optimisation?
  • 21. 4 . 14 APACHE GROOVY Apache Groovy home Documentation Twitter @ApacheGroovy http://groovy-lang.org/ http://groovy-lang.org/documentation.html
  • 22. 4 . 15 5 . 1  
  • 23. 5 . 2 GRADLE Very modern, next-generation build & deployment pipeline tool DSL is based on Groovy Vast collection of plugins
  • 24. GRADLE apply plugin : 'groovy' repositories { jcenter() } dependencies { testCompile 'org.spockframework:spock-core:1.0-groovy-2.4' testCompile "org.gebish:geb-spock:0.13.0" testCompile "org.seleniumhq.selenium:selenium-api:2.53.0" testRuntime "org.seleniumhq.selenium:selenium-support:2.53.0" testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:2.53.0" }
  • 25. 5 . 3 GRADLE Make it easy to integrate development and complex testing Deploy local & to remote sites via plugins Use Docker local & remote "I do not have means to test on my machine" becomes less of an argument.
  • 26. 5 . 4 GRADLE JVM POLYGOT Build a distributable application packaged as as ZIP Runnable via shell script or batch le Contains classes written Java, Groovy & Kotlin source Test source code with Spock Framework
  • 27. 5 . 5 GRADLE JVM POLYGOT apply plugin : 'java' apply plugin : 'groovy' apply plugin : 'com.zoltu.kotlin' apply plugin : 'application' repositories { jcenter() } dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.3' compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1' testCompile 'org.spockframework:spock-core:1.0-groovy-2.4' } version = '1.0' mainClassName = "gradle.workshop.HelloJava"
  • 28. 5 . 6 GRADLE DEPENDENCY MANAGEMENT Easy to use Flexible to con gure for exceptions Uses dependencies closure First word on line is usually name of a con guration. Con gurations are usually supplied by plugins. Dependencies are downloaded from repositories Maven coordinates are used as format
  • 29. 5 . 7 GRADLE REPOSITORIES Speci ed within a repositories closure Processed in listed order to look for dependencies jcenter() preferred open-source repo. mavenLocal(), mavenCentral(), maven {} Ivy repositories via ivy {} Flat-directory repositories via flatDir
  • 30. 5 . 8 GRADLE REPOSITORIES repositories { jcenter() mavenCentral() maven { url "https://plugins.gradle.org/m2/" } ivy { url 'file://path/to/repo' layout 'pattern', { artifact '[module]/[revision]/[artifact](.[ext])' ivy '[module]/[revision]/ivy.xml' } } }
  • 31. 5 . 9 BUILDSCRIPT The buildscript closure is special It tells Gradle what to load into the classpath before evaluating the script itself. It also tells it where to look for those dependencies. Even though Gradle 2.1 has added a new way of adding external plugins, buildscript are much more exible.
  • 32. 5 . 10 EXTENSIONS Extensions are global con guration blocks added by plugins. Example: The jruby-gradle-base plugin will add a jruby block. apply plugin: 'com.github.jruby-gradle.base' jruby { defaultVersion = '1.7.11' }
  • 33. 5 . 11 GRADLE TASKS Can be based upon a task type task runSomething ( type : Exec ) { command 'git' args 'clone', 'https://bitbucket.com/ysb33r/GradleWorkshop' } Can be free-form task hellowWorld << { println 'Hello, world' }
  • 34. 5 . 12 5 . 13 GRADLE: BUILDING C++ apply plugin : 'cpp'
  • 35. GRADLE: BUILDING C++ Need to change convention from traditional C++ projects .cpp les go in src/${name}/cpp Exported headers les go in src/${name}/headers Local header les should be in src/${name}/cpp Object les will end up in ${buildDir}/objs Binary les will end up in ${buildDir}/binaries
  • 36. 5 . 14 5 . 15 BUILDING C++: PROJECT LAYOUT ├── build.gradle └── src └─── hello    ├── cpp │ └─── hello.cpp │    └── headers └─── hello.hpp
  • 37. 5 . 16 BUILDING C++: EXISTING PROJECTS Source directories can be adjusted Alternative compiler locations
  • 38. 5 . 17 BUILDING C++: ALTERNATIVE SOURCE sources { cpp { source { srcDir "myDir" include "**/*.cpp" } } }
  • 39. BUILDING C++: TOOL SUPPORT Operating System Tool Chain Of cial Linux gcc, clang Y MacOS X Xcode Y gcc-macports, clang- macports N Windows Visual C++, gcc-cygwin32, gcc-mingw Y gcc-cygwin64 N
  • 41. 5 . 18 5 . 19 BUILDING C++: EXECUTABLE model { components { hello(NativeExecutableSpec) } }
  • 42. BUILDING C++: CUSTOM COMPILER model { toolChains { gcc(Gcc) { path '/installed/in/foo/dir/gcc' eachPlatform { cppCompiler.withArguments { args -> args << "-DNDEBUG" } } } } }
  • 43. 5 . 20 BUILDING C++: OTHER FEATURES Cross compilation Multi-architecture targets Set compiler & linker ags Multi-variant builds
  • 44. 5 . 21 BUILDING C++: WEAKNESS Currently only have built-in support for CUnit Only platform con guration tool support is CMake No Autotools equivalent DSL can be slicker
  • 45. 5 . 22   Website: Plugins Portal: User Forum: @gradle @DailyGradle http://gradle.org http://plugins.gradle.org http://discuss.gradle.org
  • 48. 7 . 1 LET’S GET UNIT TESTING class CalculatorSpec extends Specification { def "A calculator must be able to add numbers"() { given: 'That I have a calculator' def calc = new Calculator() when: "I add 2, 3 and -20" def answer = calc.plus 2,3,-20 then: "The answer should be -15" answer == -15 } }
  • 49. 7 . 2 WHEN THIS TEST FAILS
  • 50. 7 . 3 WHEN THIS TEST FAILS
  • 51. 7 . 4 SPOCK FRAMEWORK Built on top of JUnit 4.x. Use it with all your JUnit tools! Use for more than just unit tests. Mocks & stubs included Easily test Java, Groovy, Kotlin, Scala etc.
  • 52. 7 . 5 DATA-DRIVEN TESTS @Unroll def "A calculator must be able to multiply"() { given: 'That I have a multiplying calculator' def calc = new Calculator() expect: "The answer to be #answer" answer == calc.multiply (a,b,c) where: "The operation is #a * #b * #c" a | b | c || answer 3 | 7 | 5 || 105 1 | 3 | 0 || 0 2 | -1| 1 || -2 }
  • 53. 7 . 6 ANOTHER COOL FAILURE REPORT
  • 54. 7 . 7 HANDLING EXCEPTIONS def "Dividing by zero should throw an exception"() { given: 'That I have a dividing calculator' def calc = new Calculator() when: "I divide by zero" calc.divide 1,0 then: "I expect an error" thrown(ArithmeticException) }
  • 55. 7 . 8 MOCK OUT INTERFACES public interface RemoteCalculator { public Number plus(Number... args); } def "Remote calculator"() { given: "A remote calculator is available" def calc = Mock(RemoteCalculator) when: "Multiple items are sent for addition" calc.plus 1,2,3,4,5 then: "The calculator is only called once" 1 * calc.plus(_) }
  • 56. 7 . 9 SPOCK FRAMEWORK Spock Framework: Spock Reports http://spockframework.github.io/spock/docs/1.0/index.html https://github.com/renatoathaydes/spock-reports
  • 57. 7 . 10 WEBSITE TESTING One of the most predominant area of testing of this decade Test-driven webpage development is less effort in long run Selenium is the leading tool Selenium tests can be overly verbose
  • 58. 8 . 1 TRIVIAL TEST EXAMPLE def "Learn about testing checkboxes"() { when: "I go to that the-internet site" go "${webroot}/checkboxes" then: 'I am expecting Checkbox page' $('h3').text() == 'Checkboxes' and: 'The checkbox states are no & yes' $(By.id('checkboxes')).$('input')*.@checked == ['','true'] }
  • 59. 8 . 2 9 . 1  
  • 60. GEB Integrates with Spock Framework JUnit TestNG Cucumber-JVM Makes Selenium readable Anything you can do in Selenium you can do in Geb
  • 61. 9 . 2 TRIVIAL TEST EXAMPLE COMPLETE class CheckboxExampleSpec extends GebSpec { def "Learn about testing checkboxes"() { when: "I go to that the-internet site" go "${webroot}/checkboxes" then: 'I am expecting Checkbox page' $('h3').text() == 'Checkboxes' and: 'The checkbox states are no & yes' $(By.id('checkboxes')).$('input')*.@checked == ['','true'] } }
  • 62. 9 . 3 GRABBING SCREENSHOTS class CheckboxReportingSpec extends GebReportingSpec { def 'Learn about testing checkboxes'() { when: 'I go to that the-internet site' go "${webroot}/checkboxes" report 'checkbox-screen' then: 'I am expecting Checkbox page' $('h3').text() == 'Checkboxes' and: 'The checkbox states are no & yes' $(By.id('checkboxes')).$('input')*.@checked == ['','true'] } } Keep record during test Stores HTML & PNG.
  • 63. 9 . 4 GRABBING SCREENSHOTS
  • 65. 9 . 6 10 . 1  
  • 66. 10 . 2 RATPACK FRAMEWORK Set of Java libraries for building modern HTTP applications. Built on Java 8, Netty and reactive principles. Groovy syntax for those who prefer it.
  • 67. RATPACK QUICKSTART SERVER @Grapes([ @Grab('io.ratpack:ratpack-groovy:1.2.0'), @Grab('org.slf4j:slf4j-simple:1.7.12') ]) import static ratpack.groovy.Groovy.ratpack ratpack { handlers { get { render "Hello World!nn" } get(":name") { render "Hello $pathTokens.name!nn" } } }
  • 68. 10 . 3 10 . 4 RATPACK’S TESTHTTPCLIENT Can be used standalone Use maven coordinates: io.ratpack:ratpack-test:1.2.0
  • 69. RATPACK’S TESTHTTPCLIENT ApplicationUnderTest app = new ApplicationUnderTest() { @Override URI getAddress() { "http://127.0.0.1:${PORT}".toURI() } } @Delegate TestHttpClient client = TestHttpClient.testHttpClient(app) def "The echo path should return what is send to it"() { given: "A simple text request" requestSpec { pay -> pay.body.type(MediaType.PLAIN_TEXT_UTF8).text(' ') } when: "The data is posted" post '/' then: "It should be echoed back" response.statusCode == 200 response.body.text == 'You said: ' }
  • 70. 10 . 5 QUICK HTTP TESTING Quickly point to a remote or in-process server Build payload in a simplistic manner Execute the verb Check the response in a readable manner
  • 71. 10 . 6 QUICK HTTP TESTING def "The echo path should return what is send to it"() { given: "A simple text request" requestSpec { pay -> pay.body.type(MediaType.PLAIN_TEXT_UTF8).text(' ') } when: "The data is posted" post '/' then: "It should be echoed back" response.statusCode == 200 response.body.text == 'You said: ' }
  • 72. 10 . 7 OTHER GR8-UNIVERSE TOOLS Grails - Build web applications fast Griffon - Best way to build desktop apps Grooscript - Groovy to Javascript Groovy VFS - File operations on remote servers using variety of protocols Sshoogr - SSH & SCP Groowin - WinRM
  • 73. 11 THANK YOU Schalk W. Cronjé Email: ysb33r@gmail.com Twitter: @ysb33r
  • 75. 13 GROOVY VFS def vfs = new VFS() vfs { cp 'ftp://some.server/pub/file0.txt?vfs.ftp.passiveMode=1', 'sftp://user:pass@another.server/path/file1.txt', overwrite : true } https://github.com/ysb33r/groovy-vfs
  • 76. 14 15 SSHOOGR remoteSession('user:pass@another.server') { exec 'rm -rf ~/tmp/*' exec 'touch this.file' remoteFile('this.file').text = "enabled=true" } https://github.com/aestasit/sshoogr
  • 78. THANK YOU Schalk W. Cronjé Email: ysb33r@gmail.com Twitter: @ysb33r
  • 79. 17 ABOUT THIS PRESENTATION Written in Asciidoctor (1.5.3.2) Styled by asciidoctor-revealjs extension Built using: Gradle gradle-asciidoctor-plugin gradle-vfs-plugin All code snippets tested as part of build