Java Magazine #2 - 2013

40
Google en Java hand in hand Gradle is klaar voor de enterprise Aan de slag met Android Studio Highlights Google I/O juli/augustus 2013 nr. 2 Onafhankelijk tijdschrift voor de Java-professional Features MAGAZINE

description

Java Magazine #2 staat geheel in het teken van de samenwerking tussen Google en Java.

Transcript of Java Magazine #2 - 2013

Page 1: Java Magazine #2 - 2013

Google en Java hand in hand

Gradle is klaar voor de enterprise

Aan de slag met Android Studio

HighlightsGoogle I/O

juli/augustus 2013 nr. 2

Onafhankelijk tijdschrift voor de Java-professional

Features

MAGAZINE

cover.indd 1 09-07-13 13:01

Page 2: Java Magazine #2 - 2013

Je moet wel gek zijn om als Java-specialist bij CGI te werken.

Experience the commitment®

Werken bij CGI, een van de vijf wereldspelers in IT-dienstverlening én de grootste Java-werkgever in Nederland? Dan moet je wel een beetje gek zijn. Om te beginnen gek van je vak: Java-specialist. Want dat maakt onze ‘members’ (zo noemen wij collega’s) zo bijzonder. CGI-members zijn gedreven professionals die altijd een stap extra zetten om de verwachtingen van onze klanten te overtreffen. En daarmee ook de dikke 9 voor klanttevredenheid die we nu al scoren.

Bovendien ben je gek op uitdagende, ‘mission critical’-projecten voor grote klanten. Bij wie je gedetacheerd wordt of voor wie je vanuit onze eigen kantoren aan de slag gaat. Volgens de allernieuwste technieken. Met volop doorgroeimogelijkheden. Zodat je beter en beter wordt. Omringd en gesteund door minstens zo gekke en vakkundige CGI-members die hun expertise graag met je delen.

Dus… Gek van je vak, door en door thuis in Java en vastbesloten om écht het verschil te maken?! Dan is het zeker niet gek om een kijkje te nemen op www.werkenbijcgi.nl of direct te solliciteren via [email protected].

CGI Adv JavaSpec_210x275mm.indd 1 04-07-13 11:08Untitled-1 1 8-7-2013 11:59:07

Page 3: Java Magazine #2 - 2013

JAVA magazine | 02 2013

Voorwoord

Het opnieuw uitbrengen van Java Magazine en de nieuwe website zijn niet onopgemerkt gebleven onder de leden van de NLJUG. Veel positieve reacties en mogelijke verbeterpunten zijn bij ons in de mailbox binnengestroomd. Hierbij wil ik graag iedereen bedanken voor zijn feedback en input. Maar blijf ons zeker bestoken met jullie kennis, zodat we dit met de rest van de NLJUG community kunnen delen. NLJUG bestaat immers voor én door de leden!

In dit nummer van Java Magazine zal vooral aandacht besteed worden aan producten en diensten van Google. Google is vandaag de dag namelijk dé manier om iets te zoeken, en het werkwoord ‘googelen’ is zelfs officieel opgenomen in de Dikke van Dale. Kortom, niemand kan om Google heen en Java Magazine dus ook niet. Java Magazine was voor jou aanwezig bij de Google I/O conferentie in San Francisco, om hier uitgebreid verslag van te kunnen doen. Verderop in deze tweede editie van Java Magazine vind je een overzicht van alle hoogtepunten van deze Google I/O conferentie. Op de Google I/O conferentie werd ook de nieuwe ontwikkelomgeving Android Studio door het Android SDK team gepresenteerd. Wij doken alvast wat dieper in Android Studio, en delen de eerste indruk hierover met jou.

Dit nummer bevat ook een spoedcursus AngularJS, de javascript library van Google. In dit artikel wordt een overzicht gegeven wat AngularJS is, hoe het werkt en wat de belangrijkste concepten zijn die je in AngularJS tegen komt. Ook wordt er in deze editie uitgebreid aandacht besteed aan Google Dart. Bij Google zelf noemen ze Dart hét alternatief voor het maken van grote webapplicaties. Kortom; Java Magazine staat weer boordevol informatie voor de echte Java-specialist!

PS: De voorbereidingen voor de JFall 2013 op 6 november zijn momenteel weer in volle gang en het belooft weer een prachtig evenement te gaan worden in Nijkerk. Ook de Call for Papers is inmiddels gestart en staat online op nljug.org. ramon wielemanContent manager Java [email protected]

Colofon Java Magazine 02-2013

Content manager:

Ramon Wieleman

E-mail: [email protected]

Eindredactie:

Lilian Krijt

Auteurs: Jos Dirksen, Hans Riezebos, Joop Lanting,

Hubert Klein Ikkink, Frans van Buul, Bert Jan Schrij-

ver, Robert Scholte, Eelco Meuter, Nanne Baars,

Teun Hakvoort, Sander de Groot, Peter

Hendriks, Bert Ertman, Dennis Rutjes

redactiecommissie: Nanne Baars, Eelco Meuter,

Bert Jan Schrijver, Ben Ooms, Bert Ertman, Lucas

Jellema, Tim Prijn

Vormgeving:

Britt Zaal

Uitgever:

Martin Smelt

Traffic:

Marco Verhoog

Media order:

Mirella van der Willik

Marketing:

Ramon Wieleman,

drukkerij:

Senefelder Misset, Doetinchem

distributie:

Betapress

Advertenties:

Richelle Bussenius

E-mail: [email protected]

Telefoon: 023 752 39 22

Fax: 023 535 96 27

Java Magazine verschijnt 4 maal per jaar en is onderdeel van

het lidmaatschap NLJUG en kost € 39,50 (België € 40,50) per

jaar.

Naast het Java Magazine krijgt u gratis toegang tot de vele NL-

JUG workshops en het JFALL congres. Het NLJUG is lid van het

wereldwijde netwerk van JAVA user groups. Voor meer informa-

tie of wilt u lid worden, zie www.nljug.org. Een nieuw lidmaat-

schap wordt gestart met de eerst mogelijke editie voor een

bepaalde duur. Het lidmaatschap zal na de eerste (betalings)

periode stilzwijgend worden omgezet naar lidmaatschap van

onbepaalde duur, tenzij u uiterlijk één maand voor afloop van

het initiële lidmaatschap schriftelijk (per brief of mail) opzegt.

Na de omzetting voor onbepaalde duur kan op ieder moment

schriftelijk worden opgezegd per wettelijk voorgeschreven

termijn van 3 maanden. Een lidmaatschap is alleen mogelijk

in Nederland en België. U kunt mailen naar members@nljug.

org  of schrijven naar NLJUG BV, ledenadministratie, postbus

3389, 2001 DJ Haarlem.

Op werkdagen kunt u bellen tussen 10 en 14 uur naar telefoon-

nummer 023–5364401. Verhuisberichten of bezorgklachten

kunt u doorgeven via www.hubstore.nl (Klantenservice).

Abonnementenadministratie

Ingrid van der Aar, Tanja Ekel, Brigitte Hetem

Google is taking over

Voorwoord.indd 3 09-07-13 12:17

Page 4: Java Magazine #2 - 2013

Voor elke serieuze Java-ontwikkelaar of Java bedrijf is het een must om lid te worden van de NLJUG. Als je up-to-date wilt zijn en blijven is dit de manier om het te doen: word lid van de NLJUG op www.nljug.org. Het lidmaatschap kost € 39,50 (incl. 6% BTW)

De voordelen van lidmaatschap• Gratis toegang tot J-Fall 2013

• Gratis toegang tot NLJUG University sessions

• Gratis 4 maal per jaar het Java Magazine

» Ga naar: www.nljug.org

SLECHTS

€39,50

Java werf A4.indd 4 09-07-13 13:34

Page 5: Java Magazine #2 - 2013

JAVA MAGAZINE | 02 2013

INHOUDSOPGAVE

06 ANGULAR.JSDe javascript library van Google

10 BOEKREVIEW Agile ALM

11 COLUMNZiekenhuisbezoek

14 GRADLEis klaar voor de ‘enterprise’

16 GOOGLE DARTThe next web app platform?

22 CUCUMBEREffectief automatisch testen

28 DEVOXX4KIDSTechniek en informatica voor kinderen

29 LIBRARIESLibraries uitgelicht

30 AAN DE SLAG METAndroid Studio

33 HIGHLIGHTS GOOGLE I/O We’re just getting started

36 BESTUURSCOLUMN Van het bestuur

38 TIPS & TRICKS Meer met Maven

SCHRIJVEN VOOR JAVA MAGAZINE?

Ben je een enthousiast lid van NLJUG en zou je graag willen bijdragen

aan Java Magazine? Dat kan! Neem contact op met de redactie, leg uit op welk gebied je expertise ligt en over welk onderwerp je graag zou willen schrijven. Direct artikelen inleveren mag ook. Mail naar [email protected] en wij nemen zo spoedig mogelijk contact met je op.

Google DartDe browser is steeds vaker een platform waarin complete applicaties komen

te draaien. Het is steeds gebruikelijker om web applicaties in JavaScript te

bouwen, de zogenaamde Single Page Applications. Daarvoor worden allerlei

JavaScript frameworks gebruikt zoals: AngularJS of Backbon, gecombineerd

met Modernizr, Grunt, jQuery, Jasmine of Karma. Voor ontwikkelaars die met de

genoemde frameworks werken, zou kunnen gelden dat ze over een aantal jaren

in Dart aan het programmeren zijn.

28Devoxx4KidsNa de succesvolle eerste Devoxx4Kids in Brussel en Gent vorig jaar, vond op 8

juni de eerste Devoxx4Kids in Nederland plaats. Het idee achter de Devoxx4Kids

is kinderen op een speelse manier kennis te laten maken met techniek en infor-

matica. Hierbij vloog er een drone door de collegezaal en gingen de kinderen aan

de slag met Lego Mindstorms, Scratch en Arduino. Java Magazine was erbij en

doet verslag van dit evenement voor de Javanen van de toekomst.

16

Gradle is klaar voor de ‘enterprise’Bij enterprise denk je al snel aan grote complexiteit, verschillende omgevingen,

legacy code, grote projecten met teams en andere zaken. Wat je vaak ziet in een

dergelijke omgeving is dat het automatisch build proces niet meer onderhoudbaar

is, de performance niet goed is en geen goede ondersteuning biedt voor speciale

zaken die afwijken van wat de build tool standaard inhoudt. Gradle biedt een

toolkit om in een enterprise omgeving goed aan de slag te kunnen en deze zaken

wel goed te regelen. Java Magazine legt je uit hoe je dat voor elkaar krijgt.

Gradle is klaar voor de ‘enterprise’Bij enterprise denk je al snel aan grote complexiteit, verschillende omgevingen,

legacy code, grote projecten met teams en andere zaken. Wat je vaak ziet in een

14

Inhoudsopgave.indd 3 09-07-13 12:17

Page 6: Java Magazine #2 - 2013

06

JAVA magazine

AngularJS is een javascript library, ontwik-keld door Google, waarmee je op een eenvou-dige, intuïtieve en declaratieve manier web applicaties kan bouwen. In dit artikel geef ik een overzicht van wat AngularJS is, hoe het werkt en wat de belangrijkste concepten zijn die je in AngularJS tegen komt. De kortste uitleg waarom AngularJS ontwikkeld is komt van de site van AngularJS zelf (angularjs.org):

“HTML is great for declaring static docu-ments, but it falters when we try to use it for declaring dynamic views in web-applications. AngularJS lets you extend HTML vocabulary for your application. The resulting environ-ment is extraordinarily expressive, readable, and quick to develop. Other frameworks deal with HTML’s shortcomings by either abstrac-ting away HTML, CSS, and/or JavaScript or by providing an imperative way for manipu-lating the DOM. Neither of these address the root problem that HTML was not designed for dynamic views.”

Om bovenstaande te bereiken biedt Angular-JS je de mogelijkheid om HTML uit te breiden met eigen attributen, waarmee je eenvoudig, op een declaratieve manier, je pagina kunt koppelen aan je, ook in javascript geschre-ven, applicatie logica. Dit klinkt allemaal erg abstract, maar als je kijkt naar het volgende voorbeeld zal het snel duidelijk worden hoe

Jos Dirksen is enterpise architect  bij Malmberg, een educatieve uitgever.   Jos heeft verschil-lende projecten met Angular uitgevoerd en schrijft hier ook regelmatig over op zijn website: www.smartjava.org.AngularJS dit voor elkaar krijgt.

Minimale AngularJS applicatieDit voorbeeld bestaat uit drie bestanden:< index.html: de web pagina die de

verschillende scripts laadt< app.js: bevat de javascript code die nodig

is om de applicatie te ‘bootstrappen’< controllers.js: bevat de controllers die je van-

uit de web pagina benadertLaten we beginnen met de index.html:

Dit is een standaard HTML pagina, waaraan een aantal AngularJS attributen toegevoegd zijn. Deze worden directives genoemd in Angu-larJS. Voordat ik dit uit ga leggen, kijken we eerst even naar de app.js en de controllers.js bestanden.

index.html:<!doctype html> <html xmlns:ng=”http:// angularjs.org” ng-app=”jmApp”> <body ng-controller=”JavaMagazineController”>

<p>{{greeting}}</p> <script src=”lib/angular/angular.js” type=”text/ javascript”></script> <script src=”js/app.js” type=”text/javascript”></script> <script src=”js/ controllers.js” type=”text/javascript”></script>

</body></html>

Angular.jsEen veel gebruikte manier om web applicaties te maken in de Java wereld is met behulp van frameworks en technologieën zoals JSF, GWT, Vaadin, Wicket of Seam. Met deze frameworks programmeer je de business logica in Java en gebruik je vaak een templating taal voor het maken van je web pagina’s. De web frontend en de business logica zitten dan vaak dicht bij elkaar geïntegreerd. De laatste tijd zie je echter de opkomst van volwaardige web applicaties waar de hele web frontend gebouwd wordt in javascript en die met een set van backend services communiceert via REST. Denk hierbij aan javascript libraries zoals backbone.js, ember.js en knockout.js. Een relatief nieuwe toevoeging aan dit rijtje is AngularJS.

Angular_2koloms.indd 6 09-07-13 12:26

Page 7: Java Magazine #2 - 2013

JAVA MAGAZINE | 02 2013

ANGULAR.JS

de JavaMagazineController. Vervolgens wordt er gekeken of er een variabele met de naam greeting gekoppeld is aan het scope object (alleen javascript variabelen die je definieert op het scope object kun je vanuit je HTML pagina be-naderen). Deze waarde wordt getoond, wat resulteert in screenshot 1.

In dit voorbeeld zie je al een aantal concepten van AngularJS terugkomen. Databinding gaat via {{var}}, je gebruikt directives om AngularJS functionaliteit aan te roepen en via controllers wordt data en functionaliteit ontsloten. Dit artikel is te kort om in detail in te gaan in wat AngularJS allemaal kan, daarom pakken we een aantal features van AngularJS eruit, zodat je een beeld krijgt wat mogelijk is, en hoe eenvoudig het werken met AngularJS is.

Angular-SeedAngular-Seed is niet zozeer een feature van AngularJS, maar een manier om snel te kunnen starten met AngularJS. Via git kun je dit project clonen en dan heb je direct een werkende applicatie met een net opgezette structuur, vanuit waar je je eigen applicatie kan ontwikkelen:

De applicatie kun je nu direct openen in je browser (liefst via een lokaal geïnstal-leerde web browser om security issues te voorkomen): localhost/Dev/git/angular-seed/app/

DirectivesAngularJS komt met een groot aantal di-rectives die je kunt gebruiken in je HTML pagina. Een aantal hiervan behandelen we hier, zodat je een beeld krijgt van wat er mogelijk is en hoe directives werken.

Wat je hier ziet is een minimale AngularJS applicatie. Als je dit in je browser opent, krijg je, zoals je waarschijnlijk al wel verwacht had, het volgende te zien als in screenshot 1.Maar hoe werkt dit? Laten we er stapje voor stapje doorheen lopen:1. In de HTML pagina hebben we de

ng-app=”JMApp” directive staan. Dit directive wordt gebruikt voor het bootstrappen van je module. Het bootstrappen zelf gebeurt in het app.js bestand via de var myApp = angular.module(‘jmApp’, []); code. Hiermee vertel je AngularJS dat hij de module met de naam JMApp moet initialiseren.

2. Naast de module wordt tijdens het laden van de javascript bestanden ook al een controller aangemaakt. De controller is gedefinieerd in het controllers.js bestand. Zoals je kunt zien in de code, registreer je de controller op de module die in app.js aangemaakt is.

3. Tijdens het initialiseren van je applicatie zal AngularJS je pagina controleren voor andere directives en deze verwerken. In dit geval ko-men we het directive ng-controller=”JavaMagazineController” tegen. Dit directive geeft aan dat all directives, en andere AngualrJS constructies, die op Geneste elementen van dit HTML element staan, afgehandeld worden door de controller met de naam JavaMagazineController.

4. De laatste AngularJS specifieke constructie die je hier kunt zien is {{greeting}}. Dit is de manier waarop je data uit je controller kunt kop-pelen aan je pagina. AngularJS zal eerst bepalen welke controller hij moet raadplegen. In dit geval is dit

app.js:var myApp = angular.module(‘jmApp’, []);

controllers.js:var myApp = angular.module(‘jmApp’, []);myApp.controller(‘JavaMagazineController’, [‘$scope’, function (scope) { scope.greeting = ‘Hello JavaMagazine!’;}]); Screenshot 1

[email protected]:~/git$ git clone https://github.com/angular/angular-seedCloning into angular-seed...remote: Counting objects: 978, done.remote: Compressing objects: 100% (464/464), done.remote: Total 978 (delta 501), reused 849 (delta 419)Receiving objects: 100% (978/978), 6.37 MiB | 1.11 MiB-/s, done.Resolving deltas: 100% (501/501), [email protected]:~/git$

Voor een compleet overzicht van de directives die beschikbaar zijn kun je kijken op de docs.angularjs.org/api pagina. Het maken van eigen di-rectives is ook eenvoudig. Voor meer informatie hierover; kijk op docs.angularjs.org/guide/directive.

ng-repeatHet eerste wat je vaak nodig hebt in web applicaties is de mogelijkheid om te itereren over data in je model. In AngularJS doe je dit met behulp van het ng-repeat directive:

In deze twee fragmenten zie je hoe je met AngularJS kunt itereren over een array die door de controller ontsloten wordt.

ng-show en ng-hideMet deze twee directives kun je con-ditioneel een gedeelte van je pagina verbergen of tonen:

Index.html:...<ul> <li ng-repeat=”stock in stocks”> {{$index + 1}}. {{stock.symbol}} is {{stock.name}}.

</li></ul>...

Controllers.js:... scope.stocks = [{ “symbol” : “GOOG”, “name” : “Google” },{ “symbol” : “AAPL”, “name” : “Apple” }];...

Angular.js

Angular_2koloms.indd 7 09-07-13 12:26

Page 8: Java Magazine #2 - 2013

08

JAVA magazine

Controllers.js:...scope.showme = true;...

Index.html:...<p>Count: {{count}}</p><input type=”button” ng-click=”increaseCount($event)” value=”click”/>...

Controller.js:scope.count = 0;scope.increaseCount = function(event) { scope.count++;};

services.js:var DummyService = function() {

this.doSomething = function() { console.log(‘doing some-thing’) }}

app.js:var myApp = angular.module(‘jmApp’, []);myApp.factory(‘dummy’, function() { var dummy = new DummyService(); return dummy;});

Naast deze twee directives heb je ook nog ng-class. Met ng-class kun je de classes van een element koppelen aan een waarde uit je model. Hiermee kun je hetzelfde effect bereiken.

ng-click, ng-mousedown, ng-mouseenter, ng-mouse...De laatste directives die besproken worden zijn de ‘mouse’ gerelateerde. Je kunt met AngularJS direct mouse events koppelen aan functies in je model. In het volgende voorbeeld is de ng-onclick gekoppeld aan een knop. Zodra je op de knop klikt wordt er een functie in de controller aangeroepen die een teller ophoogt. Deze teller is ook weer gebonden vanuit de HTML pagina, dus je zult de waarde hiervan direct zien ophogen.

In dit voorbeeld binden we de ng-click aan de increaseCount functie van de controller. In de increaseCount functie in de controller verhogen we de teller en AngularJS zorgt voor de rest. Het resultaat hiervan ziet er dan zo uit als in screenshot 2. Hetzelfde principe kan ook gevolgd worden voor de overige ng-mouse* directives die AngularJS aanbiedt.

ServicesMet directives definieer je op een declara-tieve manier hoe je ‘view’ eruit komt te zien. Een ander belangrijk concept in AngularJS zijn services. Met een service ratieve manier

hoe je ‘view’ eruit komt te zien. Een ander belangrijk concept in AngularJS zijn services. Met een service kun je een brok herbruik-bare functionaliteit via dependcy injection beschikbaar stellen binnen je controller. De business logica die je binnen je web appli-catie nodig hebt, kun je dus op een goede manier abstraheren en beschikbaar stellen voor de rest van je applicatie. Hoe gaat dit in zijn werk?

Maak een eigen serviceAls eerste heb je een service nodig:

Een service is niets anders dan een javascript object dat een aantal functies ontsluit. In dit geval wordt de functie ‘doSomething’ aangeboden. Als we een service gemaakt heb-ben, zal deze ook bij de module geregistreerd moeten worden:

Via de factory function op de module die je in het begin van dit artikel gemaakt hebt, kun je services registreren. In dit geval regis-treren we een service met de naam ‘dummy’. Het tweede argument is een factory function die een instantie van de service teruggeeft. In dit geval wordt er een nieuwe Dummy-Service geïnstantieerd, en teruggegeven. Je kunt services op meerdere plekken gebrui-ken. Meestal zal je dit gebruiken vanuit een controller, een andere service of mogelijk een filter (die je verder in het artikel nog tegen-komt). In ons voorbeeld hebben we al een controller. Om de service vanuit die control-ler te gebruiken doe je het volgende:

Index.html:...<p ng-show=”showme”>Alleen zichtbaar als showme = true</p><p ng-hide=”showme”>Alleen zichtbaar als showme = false</p>...

AngulArJS biedt een erg flexibel MVC Model, dAt goedteStbAAr en eenVoudig te gebruiken iS

Angular_2koloms.indd 8 09-07-13 12:27

Page 9: Java Magazine #2 - 2013

ANGULAR.JS

JAVA MAGAZINE | 02 2013

Screenshot 2

app.jsmyApp.factory(‘dummy’, [‘$log’,function(log) { var dummy = new DummyService(log); return dummy;}]);

services.jsvar DummyService = function(log) { this.doSomething =

app.js //src: http://docs.angularjs.org/guide/dev_guide.templates.filters.creating_filtersmyApp.filter(‘reverse’, function() { return function(input, uppercase) { var out = “”; for (var i = 0; i < input.length; i++) { out = input.charAt(i) + out; } // conditional based on optional argument if (uppercase) { out = out.toUpperCase(); } return out; } });

In de controller functie van onze mo-dule, die je gebruikt om een controller aan te maken, geef je de naam van een controller aan (JavaMagazineCon-troller) en de function die de controller beschrijft. Daarnaast geef je ook aan welke services geïnject moeten worden. In dit geval is dat $scope en dummy. $scope is een standaard service die vanuit AngularJS aangeboden wordt, en dummy is de naam van de service die je net zelf gemaakt hebt. Het aantal services wat je hier definieert, neem je ook op in de constructor van je control-ler function ‘function (scope, dummy)’ en AngularJS zorgt ervoor dat de juiste service wordt geïnjecteerd.

Inject een service in een andere serviceHet kan ook zijn dat je in je eigen ser-vice gebruik wil maken van andere ser-vices. AngularJS biedt een groot aantal services die je hiervoor kunt gebruiken. Het injecteren van een service in een andere service volgt hetzelfde principe wat je net zag voor de controller:

Hier geef je, op dezelfde manier als jeeerder voor de controller hebt gedaan, de dependencies aan die je service ver-wacht. In dit geval willen we graag dat $log, een standaard AngularJS service, in de factory functie voor onze service geïnjecteerd wordt. De service imple-mentatie verandert nu natuurlijk ook:

Voordat we doorgaan met filters nog een laatste punt over services. AngularJS heeft veel standaard services die je kunt gebruiken. Zo zijn er services specifiek voor het maken van REST calls, voor log-ging, voor routering en vele andere. Op de AngularJS API site staat daar uitleg over: docs.angularjs.org/api/

FiltersHet laatste onderdeel wat besproken wordt zijn filters. Met filters kun je data formateren voordat deze aan de gebruiker getoond wordt. AngularJS heeft op de API pagina een aantal standaard filters staan die je direct kunt gebruiken, maar het is ook erg eenvoudig om zelf een filter te maken:

Hier zie je de filter function van de module gebruikt worden om een filter te maken. Het concept hierachter is precies hetzelfde als voor het maken van een service. Je definieert een naam ‘reverse’, en definieert een factory function. Ook hier kun je weer op dezelfde manier services injecteren zoals je eerder hebt kunnen zien. Om dit te gebruiken moet je de pagina (van het eerste voorbeeld) aanpassen:

En het resultaat hiervan is te zien in screenshot 3.

ConclusieAngularJS biedt een goede uitbreiding op HTML. Het biedt een erg flexibel MVC model, dat goed testbaar en eenvoudig te gebruiken is. Het dwingt verder geen specifiek ontwikkelmodel af, en je kunt de onderdelen gebruiken die je wil. Verder biedt AngularJS erg goede two-way data binding, zonder dat je daar je model voor aan hoeft te passen, en biedt een simpel depen-dency injection model.In dit artikel heb ik slechts een heel klein gedeelte laten zien van wat er allemaal mo-gelijk is met AngularJS. AngularJS is een framework wat er voor zorgt dat je eenvoudig het MVC model kunt implementeren, en zorgt ervoor dat je op een nette, goed onderhoudbare manier web applicaties kunt ontwik-kelen. Het zorgt er niet voor dat je je als ontwikkelaar aan bepaalde conventies moet houden, maar biedt je juist handvatten en best practices die je kunt gebruiken. Meer informatie kun je vinden op de site van AngularJS: angularjs.org.

index.html...

Screenshot 3

controllers.jsmyApp.controller(‘JavaMagazineController’, [‘$scope’,’dummy’, function (scope, dummy) { ... scope.callService = function() { dummy.doSomething(); }}]);

function() { log.warn(‘doing something’); }}

<p>{{greeting}}</p>...

Angular_2koloms.indd 9 09-07-13 12:27

Page 10: Java Magazine #2 - 2013

10

JAVA magazine

BoekBespreking

DoelgroepIntentie van het boek is een gids te zijn voor Java ontwikkelaars, testers en release engineers. Met voorbeel-den wordt uitgelegd hoe de gehele applicatie lifecycle te zien als een set van gedefinieerde taken, en hoe dan vervolgens met tools en theorieën ef-fectief in de praktijk uit te voeren.

indeling en samenvattingHet boek is opgezet in vier delen. Het eerste deel introduceert Agile ALM door uit te werken hoe software engi-neering geëvolueerd is naar Agile ALM, door het noemen van de bouwblok-ken zoals stakeholder focus, service oriëntatie, taakgebaseerde aanpak en configureerbare en pluggable sys-temen, door uit te leggen waarom het belangrijk is Agile strategieën te vormen binnen de ALM context: stra-tegieën t.a.v. VCS gebruik, productieve workspaces, continuous integration, component repositories, standaarden en release cycles. Concretisering van de strategieën worden uitgewerkt in het vervolg van het boek. Deel twee van het boek werkt de func-tionele aspecten van Agile ALM uit: hoe Scrum te gebruiken voor Release Management, in combinatie met het implementeren van task-based deve-lopment met de hiervoor beschikbare toolchain alternatieven.Het derde deel van het boek gaat over

integratie management en (technisch) releasen. Eerder genoemde strate-gieën worden verder uitgewerkt en tools worden geïntroduceerd. Denk hier aan sandboxes, mocken, conti-nuous integration en Maven. Verder komen integratie met andere dan Java (derived) talen, configuratie van ap-plicaties voor meerdere omgevingen, auditing en staging aan de orde. Deel vier heet ‘outside-in and barrier-free development’. Het gaat over collabo-rative development, requirements en test management en het integreren van verschillende talen en tools. On-derwerpen als Data driven testing en Behavior driven development worden meegenomen.

Wordt de doelgroep bereiktVeel aspecten van het werk van ontwikkelaars, testers en release managers worden behandeld, dus de doelgroep zal met dit boek zeker haar voordeel kunnen doen.

Wat vind ik van het boek Het eerste deel van het boek vereist de nodige concentratie om alle achter-gronden, theorieën en strategieën door te lezen. Naarmate het boek vordert, leest het gemakkelijker door (code) voorbeelden. Veel onderwerpen komen op een gestructureerde manier aan de orde. Tools en technieken, waar je altijd al eens meer van wilt weten, worden nu mooi bij elkaar in een boek geïntroduceerd en in relatie tot elkaar gepositioneerd. Hieruit blijkt het vakmanschap van de auteur en de zorg waarmee het boek is geschreven.De auteur wijdt een hoofstuk aan Task-based development, waarin hij

nuttige ‘example toolchains’ behan-delt. Ondanks dat sommige paragrafen door co-auteurs zijn geschreven, vormt het boek een mooi geheel. Het boek bevat voorbeelden van het gebruik van een aantal specifieke libraries. De kans is groot, dat deze voor de lezer op dit moment niet relevant zijn en dat deze de paragraaf overslaat. Zo nodig is de benodigde documentatie immers te downloaden. Op een paar plaatsen bevat het boek dan net iets teveel voorbeelden. Samengevat vind ik het een goed boek, het vakmanschap komt je bij het lezen tegemoet, een aanrader voor software professionals. Aanbevolen!

BoekbesprekingMichael Hüttermann is Java Champion, Agile Alliance member en oprichter van de Java User Group Keulen. Als spreker was hij ‘onder ons’ tijdens JFall 2011. Zijn onderwerpen zijn Agile software development, SCM/ALM, DevOps, Continuous Delivery en Java/JEE.

Agile ALM, lightweight tools and agile strategies

REFEREntiETitel: Agile ALM, lightweight tools and agile strategiesAuteur: Michael HüttermannISBN: 9781935182634Uitgever: Manning

Hans riezebos is software developer bij Luminis.

Boekreview.indd 10 09-07-13 12:18

Page 11: Java Magazine #2 - 2013

JAVA magazine | 02 2013

Column

ZiekenhuisbezoekIn het ziekenhuis kan men zich de principes van de automatisering en het programmeren zeer aanschouwelijk eigen maken. Daarbij doel ik niet op de ingezette apparatuur, maar op de omstandigheden. De volgende voorbeelden zijn geschikt voor basis automatiseringsonderwijs.

Joop lanting, Amsterdam 1947.Gepensioneerd systeemprogrammeur, een der eersten in Europa met UNIX (1977), was onder meer werkzaam aan de Universiteit van Amsterdam, MultiHouse en Unisys.

1) De context switch.Voorjaar 1960 kreeg ik buikpijn; het ging niet over, dus mijn moeder sleepte me naar de huisarts.De weledelgeleerde was helaas op vakantie en zijn vervanger, die meer op een gepensioneerde boekverkoper leek, oordeelde “buikgriepje, aspirientje!”. Het werd echter steeds erger en wederom maakten wij de gang naar de geneesheer. Die was gelukkig terug en constateerde “opname!” (naar het ziekenhuis dus). Aldaar kwam ik op een zaal met nog 11 patiënten en evenzovele witte jassen verdrongen zich om mijn bed.Buikvliesontsteking! Dus een week met ijs op mijn buik en niets erin: vasten! Na deze en andere kwellingen mocht, nee, moest ik naar huis: “... over een kwartaal terug komen voor de operatie”. Helaas, onze hond liep weg en doordat ik onze hele woonwijk door rende om het huisdier weer terug te vinden, maakte ik me veel te druk en mijn buik ook. Mijn eerste rit met een ambulance! Wederom enige witte jassen rond mijn bed, die mompelden “we kunnen hem nog net redden”. Leuk om te weten. Ik werd naar een operatiekamer gerold en op een tafel gehesen. Een van de ‘geneze-rikken’ sprak mij geruststellend toe: “zo knul, je krijgt een kapje over je gezicht en je zult niets voelen”. “Hoeveel is 7 maal 13?” Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz ...“Eenennegentig!” antwoordde ik tegen een hele andere zaal met 24 bedden langs de zijden en een verpleegster met leeslampje in het midden. Mijn hersenen hadden 3 uur stil gestaan, maar de ‘resulta-ten’ waren bewaard gebleven! Net als bij een programma dat even wordt onderbroken of geswapt.

2) Het Java Interface.Ik zat in de Intercity van Utrecht naar Amsterdam en kreeg plotseling een hevige pijn op de borst. De moeder en twee kinderen in dezelfde coupe liet ik niets merken maar ik moet er pimpelpaars hebben uitgezien. De eerste mogelijkheid tot ontsnappen was het Amstelstation. Vlakbij was een zieken-huis, daar had mijn moeder gelegen, wist ik nog. Zodra de deuren open gingen stortte ik me naar buiten en snelde de trap af. In één moeite door rende ik naar de oostelijke uitgang, de hele Wibautstraat uit, en hijgend bereikte ik het ziekenhuis aan het Ooster-park. Bij de balie stond een man in witte jas met een stethoscoop om de nek.Elke seconde telde nu. Ik wierp me aan zijn voeten en stamelde “Dokter, red me, ik heb een HARTAANVAL!”. “Zo, zo”, mompelde de man, “en waar komt u nu vandaan?”. Met mijn laatste adem produceerde ik: “van het Amstelstation”. “Bent u helemaal komen rennen?”, kwam het weer. Ik kon alleen nog maar knikken. “Nou, dan hebt u géén hartaanval”. Nu besefte ik dat ik enkel en alleen op de witte jas en de stethoscoop was afgegaan. Die man had stukadoor of bakker kunnen zijn geweest, maar die outfit kwalificeerde hem tot mijn ‘redder’. Net een Java interface dus.

Oh ja, het bleek een licht geval van hyperventilatie te zijn geweest.;JOOP!

Ben jij ook eenChampions League speler?

Kijk voor onze vacatures op pagina 20/21 van dit magazine.

03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1 4/23/2013 5:24:44 PM

Advertentie

Column.indd 11 09-07-13 12:19

Page 12: Java Magazine #2 - 2013

12

JAVA magazine

Gradle is klaar voor de ‘enterprise’Wanneer je denkt aan ‘enterprise’, dan denk je aan grote complexiteit, veel verschillende soorten omgevingen (heterogeen), legacy code, één of meerdere grote projecten met veel teams, veel gedeelde componenten en andere zaken. Wat je vaak ziet in een dergelijke omgeving is dat het automatisch build proces niet meer onderhoudbaar is, de perfor-mance niet goed is en geen goede ondersteuning biedt voor speciale zaken die afwijken van wat de build tool standaard inhoudt. Gradle biedt een toolkit om in een ‘enterprise’ omgeving goed aan de slag te kunnen en deze zaken wel goed te regelen.

Voordat we gaan kijken wat Gradle allemaal te bieden heeft om je in een “enterprise” omgeving goed te helpen, is het goed om eerst te kijken naar wat Gradle is. Gradle is een build en automatiseer toolkit die draait op de Java Virtual Machine (JVM). Gradle is het resultaat van evolutie in build tools en probeert het beste te pakken uit bestaande build tools als Maven. Met Gradle kun je het bouwen, testen, publiceren en de deployment van software automatiseren. Maar Gradle kan ook gebruikt worden voor andere type projecten, zoals statische websites.

Eigenschappen GradleEen aantal belangrijke eigenschappen van Gradle zijn beschrijvende builds, waarbij je aangeeft wat je wilt uitvoeren, maar je niet hoeft aan te geven hoe. Ook is er een duide-lijke build-by-convention met defaults die we kennen uit bijvoorbeeld Maven projecten. Maar er is wel de mogelijkheid om dit aan te passen aan standaarden in je eigen organisatie. Er is een zogenaamde Deep API, en dat betekent dat je op heel veel niveau’s aanpassingen kan maken in een build. Daarnaast zijn er multi-project builds, waarbij het mogelijk is om af-hankelijkheden tussen projecten te definiëren. Gradle is in staat om zelf te bepalen of bij een wijziging binnen één project de van dat project afhankelijke projecten ook opnieuw gebouwd moeten worden. Dit hoef je dus niet zelf te doen, maar kun je overlaten aan Gradle. De ondersteuning van plugins is ook belangrijk in Gradle. Een plugin kan een set van taken

Hubert Klein Ikkink is een Groovy/Grails consultant en developer bij JDriven. Hij is binnen de Groovy community beter bekend als mrhaki, want dat is de nickname die hij gebruikt om blog posts te schrijven over Groovy, Gradle, Grails en andere zaken die te maken hebben met Groovy technologiën. Hij heeft vorig jaar het boek ‘Gradle Effective Implementation Guide’-geschreven.

bevatten, maar bijvoorbeeld ook configuratie of nieuwe elementen toevoegen aan een build. Ook heeft Gradle ondersteuning voor depen-dency management en het gebruik van Maven/Ivy repositories. Als laatste is er de Gradle wrapper, waarmee het mogelijk is om een ei-gen Gradle distributie te definiëren met daarin je eigen standaarden, plugins en conventies, en deze op één manier te distribueren aan alle ontwikkelaars in de team(s).

Hoe werkt Gradle?Gradle biedt drie niveau’s van functionaliteit aan. Als eerste is er de logica voor het uitvoe-ren van taken. Daarnaast is er een Domain Specific Language (DSL) voor verschillende domeinen, zoals Java, Groovy, Scala, JavaScript, C++, Docbook en meer. Daar bovenop kunnen weer implementaties komen die gebaseerd op conventies functionaliteit kunnen aanbieden. Dankzij de DSL is het mogelijk om binnen de enterprise eigen standaarden en conventies toe te passen, gebaseerd op bestaande Gradle functionaliteit of met eigen functionaliteit. De basis van Gradle is geschreven in Java en de DSL is Groovy. Dit betekent dat we de scripts schrijven in Groovy en niet in bijvoorbeeld XML. Het grote voordeel hiervan is dat een script ook code is en dat we die code kunnen refactoren, bijvoorbeeld om een betere onderhoudbaar-heid te krijgen van onze build scripts.

Configuratie standaardenAls je binnen je organisatie bepaalde stan-daarden wilt doorvoeren voor de builds of de

Enterprise.indd 12 09-07-13 12:19

Page 13: Java Magazine #2 - 2013

JAVA magazine | 02 2013

Gradle is klaar voor de enterprise

Gradle is klaar voor de ‘enterprise’

bestaande standaarden en configuraties wilt gebruiken, dan kun je dat in Gradle aangeven. Je hebt toegang tot de API van Gradle, en er zijn verschillende plekken waar je kunt inhaken op het Gradle build proces. Zo is het bijvoor-beeld mogelijk om te signaleren welke depen-dencies gedefinieerd zijn in een project en daar een check op uit te voeren. Stel dat in je project hebt gedefinieerd dat er geen dependency mag zijn op de Jakarta Commons Logging library. In het volgende Gradle build script is te zien hoe we na het resolven van de dependencies voor het compileren kunnen zien welke dependen-cies er zijn en daarop ingrijpen.

Daarnaast bied Gradle de mogelijkheid om vele zaken te configureren, zelfs voor elementen die nog niet bestaan. Dit betekent dat we een standaard configuratie kunnen maken en dat die ook toegepast wordt op objecten die later door bijvoorbeeld andere projecten of builds worden aangemaakt. In het volgende script zien we hoe we alle taken van het type Test de property maxParallelForks van een waarde kunnen voorzien. Met deze property is het trouwens mogelijk om tests sneller uit te la-ten voeren, door ze parallel uit te voeren. Een andere feature van Gradle die ervoor zorgt dat builds ook snel zijn.

pluginsGradle gebruikt plugins om gerelateerde taken of extra configuratie mogelijkheden modulair op te nemen in een build. Plugins kunnen ook

van elkaar afhankelijk zijn. Zo is er bijvoorbeeld een java-base plugin die extra configuration mogelijkheden biedt voor Java projecten, en een java plugin die daarop gebaseerd is, en dan weer specifieke taken aanbiedt die te maken hebben met bijvoorbeeld het compileren en testen van Java projecten. Je kunt ook zelf een plugin schrijven en daarmee bepaalde standaarden toevoegen aan projecten. Deze plugin kan dan nog gedistribueerd worden via een repository zoals Nexus of Artifactory binnen de organisatie, zodat de code gedeeld wordt voor verschillende projecten. Stel, je wilt configureren dat projecten altijd dependencies downloaden vanaf een central repository op het netwerk van de onderneming. Of je wilt be-paalde dependencies voor elk project toevoe-gen. Je kunt dit realiseren door het maken van een plugin. De plugin bevat de code voor onze conventies en wordt dan door andere projecten gebruikt. De volgende code is een voorbeeld van een plugin waarbij de repository voor dependencies wordt geconfigureerd, dit zorgt ervoor dat elk Java project een dependency krijgt op de SLF4J logging library.

Je kunt de plugin deployen naar de eigen de-pendency repository. Andere projecten kunnen dan de plugin gebruiken. Stel, het volgende Java project wil de plugin gebruiken, dan kun-nen we het classpath van de build uitbreiden via een buildscript configuratie en daarna de plugin gebruiken. Je kunt dit ook automatisch toepassen op projecten binnen de organisatie, daarvoor moet je de Gradle wrapper gebruiken,

tasks.withType(Test) { // Ook nieu-we taken van type Test krijgen deze property maxParallelForks = project. numberOfForks}

ext { numberOfForks = Math.max(2, (int) (Runtime.runtime.availableProces-sors() / 2))}

package gradle.jdriven

import org.gradle.api

class JDrivenStandards extends Plugin<Project> { void apply(Project project) { final repositoryUrl = ‘http://nexus.jdriven.net/nexus/’ project.repositories { all { ArtifactRepository repo -> if (!repo instanceof MavenArtifactRepository || repo.url.toString() != repositoryUrl) {project.logger.info ‘Repository removed.’remove repo } maven { url repositoryUrl } } project.plugins.withType(JavaPlugin) { project.dependencies { compile ‘org.slf4j:slf4j-api:1.7.5’ } }

} }

configurations { compile.incoming.afterResolve = { final jclDependencies = compile.resolvedConfiguration.resolvedArtifacts.findAll { it.moduleVersion.id.group == ‘commons-logging’ if (jclDependencies) { throw new Exception(“Found JCL dependencies ${jclDependen-cies*.moduleVersion*.id}”) }}

Enterprise.indd 13 09-07-13 12:19

Page 14: Java Magazine #2 - 2013

14

JAVA magazine

welke later nog besproken wordt.

DSL extensiesJe hebt nu een aantal voorbeelden gezien van Gradle build scripts. De methoden en properties die je hebt gezien zijn een standaard onderdeel van de Gradle DSL. Maar je kunt de DSL ook uitbreiden en aanpassen, zodat je eigen termen kan gebruiken die gelden voor je organisatie. Dit biedt ook een manier om de build script beter leesbaar of onderhoudbaar te maken. Stel je wilt een vaste set van project dependencies aanbieden aan de ontwikkelaars, zodat ze via een eigen configuratie kunnen kiezen welke set ze willen gebruiken. In het volgende script maken we een nieuwe extensie JDrivenDepen-dencies, met daarin methoden die sets van dependencies definiëren voor een test library Spock en logging library met implementatie SLF4J/Logback (zie listing rechtsboven).

Incremental build supportGradle heeft de feature incremental build support om de performance van builds te vergroten. De feature betekent dat een taak zelf kan bepalen of het nodig is om uitgevoerd te worden. Bijvoorbeeld een taak die code com-pileert, hoeft alleen uitgevoerd te worden als één van de source bestanden is gewijzigd of de output bestanden zijn veranderd. Als blijkt dat dit niet het geval is, dan is een taak up-to-date en hoeft niet uitgevoerd te worden. Dit kan een behoorlijke winst opleveren, vooral bij grotere projecten waarbij veel taken uitgevoerd moeten worden. Deze feature geldt niet alleen voor de taken die al met Gradle worden meegeleverd, maar kun je ook toepassen bij taken die je zelf schrijft. Dit betekent dus dat je je eigen build logica ook kunt laten mee profiteren van de incremental build support in Gradle. Elke taak in Gradle heeft properties voor input (een bestand, directory of property) en output (file, directory). Als je deze properties gebruikt bij de definitie van een taak dan zal Gradle deze ge-bruiken om te bepalen of een taak up-to-date is of niet. In het volgende voorbeeld hebben we

buildscript { repositories { maven { url ‘http://nexus.jdri-ven.net/nexus/’ } } dependencies { classpath ‘jdriven:jdriven-standards:1.0’ }}

apply plugin: ‘java’apply plugin: ‘jdriven-standards’

class JDrivenDependencies { private final Project project

JDrivenDependencies(final Project project) { this.project = project }

void useSpock() { project.dependencies { testCompile ‘org.spockframework:spock-core:0.7-groovy-2.0’ } }

void useSLF4J() { project.dependencies { compile ‘org.slf4j:slf4j-api:1.7.5’ runtime ‘ch.qos.logback:logback-classic:1.0.13’ } }}

extensions.create ‘jdrivenDependencies’, JDrivenDependencies, project

jdrivenDependencies { useSpock() useSLF4J()}

version = ‘1.0’

task genVersionFile {ext { outputFile = new File(“$projectDir/VERSION”) }inputs.property ‘version’, project.versionoutputs.files outputFile

doFirst {outputFile.text = project.version}}

$ gradle genVersionFile:genVersionFile

BUILD SUCCESSFUL

Total time: 4.069 secs

$ gradle genVersionFile:genVersionFile UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.345 secs

een eigen taak die een bestand maakt met de naam VERSION, met daarin de waarde van de project property version. Als de waarde van de version property verandert, moet het bestand opnieuw worden gemaakt.

Als je de taak voor de eerste keer uitvoert, wordt het bestand aangemaakt. Nu kun je de taak nog een keer aanroepen. Is de version property niet veranderd, dan wordt de taak niet uitgevoerd en zie je op de command-line terug dat de taak up-to-date-is.

Enterprise.indd 14 09-07-13 12:19

Page 15: Java Magazine #2 - 2013

JAVA magazine | 02 2013

Multi-project buildsIn een enterprise omgeving zal je vaak te maken hebben met multi-project builds. Bijvoorbeeld als code ondergebracht is in verschillende projecten, maar er wel een afhankelijkheid tussen de projecten is. De projecten kunnen zelfs gebruik maken van verschillende programmeertalen, zoals Java en Scala. Gradle biedt de mogelijkheid om een afhankelijkheid tussen projecten te definiëren via dependencies, en om de meest efficiënt mogelijke manier van bouwen te bepalen. Als ontwikkelaar hoef je niet zelf te bepalen welke projecten een afhankelijk-heid hebben met jouw project of van welke projecten je eigen project afhankelijk is. Indien er veranderingen zijn in de code van projecten waar je afhankelijk van bent, dan kan Gradle die projecten meteen voor je bou-wen met de taak buildNeeded. Ook hier geldt weer de incremental build feature van Grad-le, dus als er geen veranderingen zijn dan worden die projecten ook niet opnieuw ge-bouwd. Daarnaast is er nog de mogelijkheid om de projecten die afhankelijk zijn van je eigen project te laten bouwen, zodat je kunt kijken of de code wijzigingen die je doet, geen zaken in andere projecten verstoord met de taak buildDependents. In Gradle kan je ook de configuratie van multi-project builds op verschillende niveau’s definiëren. Zo is het mogelijk algemene configuratie die door meerdere projecten wordt gebruikt op het hoogste niveau te definiëren en dan voor subprojecten deze configuratie te verfijnen. In het volgende build script wordt voor alle projecten de Java plugin gebruikt, en voor het project met de naam impl wordt ook nog de Groovy plugin toegepast.

In de laatste versie van Gradle is ook de mo-gelijkheid toegevoegd om parallel projecten te bouwen. Deze feature is nog niet final, maar geeft aan dat Gradle performance van builds hoog in het vaandel heeft staan.

Gradle wrapperDe Gradle wrapper is een batch script voor Windows (en een shell script voor andere besturingssystemen), die automatisch een Gradle distributie kan downloaden en builds kan uitvoeren. De wrapper kan worden toegevoegd aan het versie beheer systeem

en maakt het mogelijk dat ontwikkelaars niet eens zelf Gradle hoeven te installeren, maar door het gebruik van de wrapper ze wel Gradle builds kunnen uitvoeren. Je hebt de mogelijkheid om een eigen Gradle distributie te maken voor je organisatie en deze door de wrapper te laten gebruiken. Deze distributie kan al een aantal specifieke eigen plugin’s bevatten, maar ook scripts die automatisch worden toegepast voor alle projecten waar-aan ontwikkelaars werken. Op deze manier kun je er dus voor zorgen dat iedereen in de organisatie niet alleen dezelfde versie van Gradle gebruikt, maar ook nog eens met de plugin’s en scripts die van toepassing zijn binnen de organisatie. Bij het maken van een eigen Gradle distribute kan je init scripts toevoegen. Deze init scripts staan in een directory init.d/ in de distributie en gelden voor de gehele Gradle installatie op een computer, dus niet alleen voor een project of multi-project build. In het volgende init script bijvoorbeeld kan je de standaard Maven repository opgeven die gebruikt wordt en een eigen plugin toevoegen aan alle projecten.

ConclusieGradle heeft veel features en mogelijkheden om gebruikt te worden in een enterprise omgeving. Je kunt met Gradle standaarden definiëren die moeten gelden voor de hele organisatie, en je kunt zelfs je eigen Gradle distributie maken die door iedereen gebruikt kan worden. De incremental build feature en het parallel uitvoeren van projecten betekent dat een build zo snel mogelijk is. Daarnaast biedt Gradle de mogelijkheid om project afhankelijkheden te configureren voor multi-project builds. En uiteindelijk is het ook mo-gelijk om de Gradle DSL uit te breiden met termen en zaken die geldig zijn voor je eigen enterprise, zodat de build script aansluiten bij de terminologie en ook beter leesbaar en onderhoudbaar zijn. De laatste versie van Gradle (1.6) is te downloaden opgradle.org/downloads

allprojects { apply plugin: ‘java’ }project(‘:impl’) { apply plugin: ‘groovy’ }

buildscript { repositories { maven { url ‘http://nexus.jdriven.net/nexus/’ } } dependencies { classpath ‘jdriven:jdriven-standards:1.0’ }}

allprojects { apply plugin: ‘jdriven-standards’ }

GrAdle biedt de MoGeliJk-heid oM een AfhAnkeliJk-heid tussen proJeCten te definiëren ViA dependenCies, en oM de Meest effiCiënt MoGeliJke MAnier VAn bouwen te bepAlen.

GrAdle is klAAr Voor de enterprise

Enterprise.indd 15 09-07-13 12:19

Page 16: Java Magazine #2 - 2013

16

JAVA magazine

The next web app platform?De browser: steeds vaker een platform waarin complete applicaties komen te draaien. Het is steeds gebruikelijker om web applicaties in JavaScript te bouwen: Single Page Applications. Daarvoor worden allerlei JavaScript frameworks gebruikt zoals: AngularJS of Backbon, gecombineerd met Modernizr (ondersteuning voor oude browsers), Grunt (autobuild framework), jQuery, Jasmine (testframework) of Karma (testrunner). Voor ontwikkelaars die met de genoemde frameworks werken, zou kunnen gelden dat ze over een aantal jaren in Dart aan het programmeren zijn…

Want waarom wordt er eigenlijk JavaScript gebruikt in de huidige projecten? Is dat wel de beste oplossing voor grote webapplicaties? Google vindt dat er in ieder geval een alternatief moet zijn en volgens hen is dat Google Dart. In dit artikel wordt uitgelegd waarom er een alternatief moet zijn en onder welke omstan-digheden Google Dart (nog in beta status) een betere oplossing gaat worden.

JavaScript applicaties bouwenOm het nut en noodzaak van Google Dart goed te begrijpen, is een stapje terug in de tijd nodig. In figuur 1 is te zien dat het web eenvoudig begon en momenteel is uitgegroeid tot een complexe wirwar van technologieën, moge-lijkheden en browsers. Een technologie die

Teun Hakvoort is trainer bij Info Support en geeft training in Java technologie en ‘browser’ technologie zoals GWT, JavaScript en AngularJS.

daarin een grote rol speelt is JavaScript (gele lijn in figuur 1). De context waarin JavaScript begon (ongeveer 1998), is totaal verschillend in vergelijking met de context van nu. Toch is de essentie van JavaScript vrijwel hetzelfde geble-ven. JavaScript is duidelijk niet ontworpen om als basisplatform te dienen voor grote webap-plicaties. Vanuit ‘maintainability-‘ en ‘testa-bility-‘oogpunt zal er snel behoefte ontstaan aan een standaard modulesysteem en een testframework. Dit zijn behoeften waarvoor geen ingebouwde voorzieningen in JavaScript aanwezig zijn. Daarnaast kent de taal de nodige gebreken. Om enkele nadelen van JavaScript te noemen: het is geen OO-taal, kent global scoping, heeft geen compile-time type checking en kent allerlei obscure constructies. Waarom

Figuur 1 Evolutie van het

web (bron: evolutionofthe-

web.com)

Google Dart.indd 16 09-07-13 12:19

Page 17: Java Magazine #2 - 2013

JAVA magazine | 02 2013

GooGle dart

the next web app platform?

wordt er dan toch gekozen voor JavaScript als platform? Omdat – wil je niet afhankelijk zijn van browser plugins – JavaScript het enige alternatief is… Is dat wel zo? Is JavaScript wel het enige alternatief? Er kan toch ook ontwik-keld worden met bijvoorbeeld Google Web Toolkit die Java-code compileert naar JavaScript (zodat alleen de ‘binaries’ JavaScript opleve-ren)? In dit geval wordt er gebruik gemaakt van een bestaande ontwikkelcontext (Java), wat eigenlijk nooit bedoeld is om webapplicaties in te bouwen. Daarom kan deze oplossing gezien worden als een tussenoplossing maar niet als eindoplossing. Kortom: tijd om een alternatief te onderzoeken.

Waarom Google dart?Volgens Google is Dart hét alternatief voor het maken van grote web applicaties. Google ontwikkelt veel grote webapplicaties en is bereid om flink te investeren in het ontwikkelen van een nieuw platform. Google Dart is duidelijk niet bedoeld als vervanging van JavaScript, maar wil een extra optie bieden die zich met name richt op het ontwikkelen van grotere applicaties. Als we het hebben over het Dart platform dan gaat het over: 1) de programmeer-taal: Dart; 2) de tools waarin ontwikkeld wordt en 3) de manier waarop ontwikkeld wordt. Dart is dus niet alleen een taal, maar een compleet platform inclusief benodigde build- en ontwik-keltools: ‘the batteries are included’.

dart platformHet Dart platform, weergegeven in figuur 2, be-staat uit verschillende onderdelen. Elk onderdeel wordt kort beschreven. De taal Dart is een op web-ontwikkeling gerichte taal die zowel client- als server side te gebruiken is. Dart code wordt geschreven in de ‘DartEditor’, een sterk vereen-voudigde op Eclipse gebaseerde omgeving. Deze IDE werkt intern met de packagemanager ‘Pub’, waarmee dependency management geregeld wordt. Bij het runnen van de in Dart gemaakte applicatie, zijn er twee mogelijkheden: 1. De code draait in een omgeving die niet met

Dart-code om kan gaan. In dat geval wordt de Dart-code door de ‘Dart2js tool’ gecompileerd naar JavaScript en kan in elke JavaScript om-geving draaien. Deze compiler optimaliseert het gegenereerde JavaScript, wat voor een flinke performancewinst zorgt. Dit compileren dient voor het deployen van de applicatie gedaan te zijn, zodat het gegenereerde JavaS-cript al klaar staat.

2. De code draait in een Dart virtual machine (VM), die zowel standalone kan draaien (ser-ver-mode) als in een browser (browser-mode). ‘Dartium’ – een op Chromium gebaseerde browser – is uitgerust met een Dart VM.

De VM in server-mode stelt extra modules beschikbaar voor I/O toegang. Hiermee is het mogelijk om bijvoorbeeld een webserver te starten, verbinding te maken met het filesys-teem of een database te benaderen. De VM in

Figuur 2 Schematische weergave van het Dart platform

Google Dart.indd 17 09-07-13 12:19

Page 18: Java Magazine #2 - 2013

18

JAVA magazine

browser-mode stelt modules beschikbaar op gebied van DOM manipulatie en verbiedt het gebruik van I/O. Om beter zicht te krijgen op de grote verschillen met traditioneel JavaScript development en het ontwikkelen met Dart, gaan we dieper in op de taal, het gebruik van modules (libraries) en de Dart VM.

De taal DartDe taal Dart is geïnspireerd door Java/C# en JavaScript. Belangrijk is dat de taal eenvoudig te leren moet zijn voor ontwikkelaars die bekend zijn met talen zoals Java en C#.Dart is ontwikkeld om zowel aan de client- als aan de serverkant gebruikt te kunnen worden. Daar springt het eerste mogelijke voordeel in het oog: namelijk dat zowel op de client als op de server in één programmeertaal ontwikkeld wordt. De belangrijkste concepten van de taal zijn:< Alles is een object; dus geen ‘primitive types’.< De taal is zowel ‘static’ typed als ‘dynamic’

typed. In voorbeeld 1 is te zien dat er zowel static types gebruikt kunnen worden (in het voorbeeld JavaDeveloper) als dat er gebruik ge-maakt kan worden van het keyword dynamic.

< Methoden hoeven niet perse in een class te staan – top-level functions.

< Dart kent geen keywords private, protected en public. Als methoden of attributen bedoeld zijn voor intern gebruik, wordt dit aangegeven met de prefix ‘_’.

< Dart kent alleen classes – al dan niet abstract. Een object kan van maximaal één class over-erven maar kan meerdere (abstracte) classes implementeren.

De taal Dart kent allerlei constructies die het leven van ontwikkelaars eenvoudig maken. Een aantal in het oog springende features zijn bijvoorbeeld automatische string interpolatie en concatenatie, zoals weergegeven in voorbeeld 2, en het gebruik van de cascade operator, zoals weergegeven in voorbeeld 3. Verder biedt Dart de mogelijkheid om multi-threaded zowel in de browser als op de server te programmeren. Dit betekent meestal concurrency problemen, ware het niet dat threads in Dart (daar genoemd ‘isolates’) geen gedeeld geheugen hebben en al-leen middels String-based messages met elkaar kunnen communiceren. Dart heeft standaard ondersteuning om asynchroon te programme-ren, kent generics, closures en operator over-loading. Clients kunnen met behulp van Darts Web UI package volledig volgens het MVC/MVP pattern gerealiseerd worden. Er kunnen eigen HTML tags gebouwd worden wat ontwikkelaars de mogelijkheid biedt om eigen UI-componen-ten in Dart te bouwen. Uit alles blijkt dat de taal

Dart aanvoelt als een rijke maar hybride taal. Het is mogelijk om er op een JavaScript achtige manier in te programmeren (dynamic types) en het is ook mogelijk om op een Java/C# manier te programmeren (static types). In vergelijking met Java zijn er verschillen die direct aan te mer-ken zijn als voordeel (cascade operator, string interpolatie, etc.). Voor andere verschillen is het lastig om te bepalen of iets nu een voordeel is of een nadeel. Op sommige punten lijkt het alsof er weer een stap terug gedaan wordt. Bijvoorbeeld als het gaat over globale niet-class gebonden functies. De taal Dart geeft de indruk ontwikkeld te zijn vanuit de mogelijkheden die JavaScript biedt. Dit is enerzijds logisch, aangezien Dart-code gecompileerd moet kunnen worden naar JavaScript. Anderzijds is het de vraag hoe deze hybride taal dan server-side gebruikt gaat wor-den. De problematische aspecten die JavaScript kent, zijn niet aanwezig in Dart. Dart is wél een OO-taal, kent géén global scoping, heeft wél compile-time type checking en kent geen obscure constructies.

Libraries in DartVoor met name Java ontwikkelaars is de manier waarop Dart ‘accessability’ oplost wezenlijk anders dan men gewend is. Java kent (nog) geen standaard modulesysteem. Dart daarentegen wel. Een ‘library’ is een eenheid binnen Dart om functionaliteit ter beschikking te stellen. Een library bestaat uit een verzameling van functies en- of classes. Alles wat binnen een library

JavaDeveloper staticDev = new JavaDeveloper(); staticDev.develop(); var dynamicDev = new JavaDeveloper(); dynamicDev.develop();

void printDynamicDeveloper(dynamic dev) { print(dev.getFavoriteLang()); }

void printStaticDeveloper(JavaDeveloper dev) { print(dev.getFavoriteLang()); }

Voorbeeld 1 Static vs. Dynamic

ButtonElement button = new ButtonElement() ..text = “Click here” ..onClick.listen((e) { }) ..classes.addAll([“btn”,”btn-primary”]);

Voorbeeld 2 String interpolatie

var language = “Dart”;print(“Current language: $language - ${language.toUpperCase()}”);var x = “<div>” //multiline string “hello world” “</div>”;

Voorbeeld 3 Gebruik van de cascade operator

De probLe-mAtische Aspecten Die JAVAscript kent, ziJn niet AAnwezig in DArt

Google Dart.indd 18 09-07-13 12:19

Page 19: Java Magazine #2 - 2013

GooGle dart

JaVa magazine | 02 2013

begint met ‘_’ is van buitenaf niet benaderbaar. Accessability veranderen betekent dus altijd een rename. In voorbeeld 4 is te zien hoe een library opgezet wordt die één publieke klasse (de Log-ger) en daarnaast 3 publieke functies aanbiedt. De interne functie _internalLog en interne klasse _LoggerImpl zijn alleen benaderbaar binnen de library. Middels een bestand in YAML-formaat wordt aanvullende informatie over de library beschreven (zie het als een soort pom.xml). Daarin worden versie-informatie en afhanke-lijkheden opgegeven. Voorbeeld 5 laat zien hoe afhankelijkheden aangegeven worden en dat integratie met bijvoorbeeld GitHub mogelijk is. Het voorbeeld laat eveneens het onderscheid zien tussen ‘gewone’ afhankelijkheden en ‘test’-afhankelijkheden. Ten behoeve van maintaina-bility zal de mogelijkheid om libraries te kunnen definiëren en te kunnen versioneren direct als groot voordeel ervaren worden. Zeker met de in-tegratie van de tool Pub (packagemanager) voelt de Dart editor direct prettig aan. Op gebied van testability van libraries levert Dart een standaard API voor unit-testen inclusief allerlei matchers en support voor mocking. Het is winst dat deze noodzakelijke voorzieningen in het platform ingebakken zijn.

dart Virtual MachineWaarom introduceert Google weer een virtual machine nadat gebleken is dat de VM’s Flash, Java en Silverlight het niet gaan worden op het web? Hiervoor zijn twee belangrijke redenen te noemen. In de eerste plaats kan Dart code daarmee zowel in de client (browser) als op de server ingezet worden (vergelijkbaar met Java). In de tweede plaats vanwege performance redenen. Het Dart platform is sterk gericht op performance. Een van de dingen die deze VM doet, is de geheugen toestand van een ap-plicatie na de eerste keer starten opslaan in een ‘snapshot’. De volgende keer wordt eenvoudig de snapshot ingeladen. Dit leidt volgens Google tot een 10x snellere opstarttijd, wat zeker bij grotere applicaties (denk aan Gmail die nu vaak een progressbar laat zien) tot een betere gebrui-kerservaring gaat leiden. Daarnaast kent deze VM allerlei optimalisaties zoals we die ook uit andere omgevingen kennen zoals: JIT compilatie en garbage collection (geen stop-the-world GC). Alles is erop gericht om een platform te kunnen bieden waarin de ‘grotere applicaties’ ook kun-nen draaien.

ConclusieWordt er over een aantal jaren volop in Dart geprogrammeerd? Het is zeker niet uit te sluiten. Met Dart is Google een veelbelovende

richting ingeslagen: het ontwikkelen van een taal, platform en IDE speciaal gericht op het maken van grote complexe webapplicaties die draaien in een willekeurige browser (gecompi-leerd naar JavaScript en HTML) of in een virtual machine. De uitvoering laat echter vooralsnog te wensen over. Om een paar voorbeelden te noemen: het is te onduidelijk hoe Dart server side gebruikt gaat worden. Tevens lijkt het niet eenvoudig om end-to-end testen te maken; iets wat in de context van complexe webapplicaties wel makkelijk zou moeten zijn. De adoptie van Google Dart bij andere leveranciers wordt steeds groter wat onder andere blijkt uit de beschikbare IDE ondersteuning in IntelliJ IDEA, Sublime en Eclipse. Daarnaast heeft Adobe een framework ter beschikking gesteld dat gebruikers moet helpen om Flash applicaties te migreren naar Dart. Google Dart bevindt zich nog in de status ‘Technology preview’ en het is de bedoeling dat in 2013 een 1.0 versie bereikt gaat worden.

library loglib;part “databaselogger.dart”; //voeg andere dartfile aan loglib toe

class _LoggerImpl implements Logger { }class Logger { void info(String msg) {}}void _internalLog(String msg) {...}

//Drie publieke – niet class gebonden functiesdebug(msg) => print(“DEBUG: $msg”);warn(msg) => print(“WARN: $msg”);info(msg) => print(“INFO: $msg”);

Voorbeeld 4: Voorbeeld van library in Dart

name: NlJugAppversion: 3.2.1description: A sample NLJUG Dart applicationdependencies: json_object: 1.0.0 browser: git: https://github.com/teunh/dart web_ui: anydev_dependencies: unittest: ‘>=0.6.0’

Voorbeeld 5: Pubspec.yaml

Wil je aan de slag met dart? ga naar dartlang.org, download de sdK en ide en go dart!

Ben jij ook eenChampions League speler?

Kijk voor onze vacatures op pagina 20/21 van dit magazine.

03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1 4/23/2013 5:24:44 PM

Advertentie

Google Dart.indd 19 09-07-13 12:20

Page 20: Java Magazine #2 - 2013

Bekijk dan de volgende vacatures• Junior en Senior Java Software Developer • Java Integratie Specialist• Java Solution Architect• Open Source Developer• Open Source Architect

Meer informatie kijk op www.werkenbijcapgemini.nl

of neem contact op met:Kees Heerschap Recruitment ManagerTel. 31 6 4609 3926 I E-mail: [email protected]

Ben jij ook eenChampions League speler?

03-021.13a_Advertisement_JavaMagazine_420x275_v1_220413.indd 1 4/24/2013 12:36:55 PMUntitled-1 2 29-4-2013 10:09:36

Page 21: Java Magazine #2 - 2013

Bekijk dan de volgende vacatures• Junior en Senior Java Software Developer • Java Integratie Specialist• Java Solution Architect• Open Source Developer• Open Source Architect

Meer informatie kijk op www.werkenbijcapgemini.nl

of neem contact op met:Kees Heerschap Recruitment ManagerTel. 31 6 4609 3926 I E-mail: [email protected]

Ben jij ook eenChampions League speler?

03-021.13a_Advertisement_JavaMagazine_420x275_v1_220413.indd 1 4/24/2013 12:36:55 PMUntitled-1 3 29-4-2013 10:09:36

Page 22: Java Magazine #2 - 2013

Bert Jan Schrijver is software architect bij Inter Access met een voorliefde voor Java en OpenSource. 

Frans van Buul is een hands-on software architect met een spe-cialisatie in Java EE en SOA, werkzaam bij Inter Access. Hij is erg geïnte-resseerd in innovatieve technologieën die de kwaliteit van software en het ontwikkelproces kunnen verbeteren. 

22

JAVA magazine

Effectief automatisch testen met CucumberAls ontwikkelaar wil en moet je je eigen software in redelijke mate testen voordat je die aan (acceptatie)testers overdraagt. Immers, doe je dat niet, dan is de kans groot dat de issues je om de oren gaan vliegen. Wanneer je iteratief ontwikkelt en vaak oplevert, moet je ook vaak testen. Dat lukt redelijkerwijs niet altijd meer handmatig. Automatische tests bieden dan hulp. Dit artikel kijkt kritisch naar de standaard Java-aanpak hiervoor en bespreekt een alternatief.

De standaard voor Java projecten is min of meer JUnit, en wordt ondersteund door buildtools als Maven en Ant, en IDE’s als Eclipse en NetBeans. Tot zover niets nieuws onder de zon. Unittests zijn echter niet geheel waterdicht. De auteurs zijn vooral actief met het bouwen van Java-gebaseerde webapplicaties. Onze ervaring is dat zelfs projecten met een redelijke goede JUnit test-coverage (meer dan 80%), waarbij veel project-tijd wordt besteed aan schrijven en onderhoud van tests, toch geplaagd kunnen worden door flinke aantallen bugs. Het vreemde is dat dit best normaal lijkt te worden gevonden in de Java-gemeenschap. Dat is het niet. Het doel van testen is om een redelijke mate van zekerheid te krijgen over het technisch én functioneel correct functi-oneren van een product. Als een testmetho-diek dat niet kan leveren, dan voldoet die niet. Het testen is dan niet effectief. In dit artikel bespreken we een alternatief voor de gebruikelijke JUnit-tests: Cucumber.

De unit in unittestenVoordat we inzoomen op Cucumber, is het goed eens wat dieper te kijken waarom de effectiviteit van JUnit-tests vaak teleur-stellend is. De kern van het probleem is de focus op ‘unit-tests’, gecombineerd met de overtuiging dat de geëigende ‘unit’ om te testen, een class of method is. Het unit-test paradigma schrijft voor dat je units zoveel mogelijk in isolatie test. De testcode zelf verzorgt het aanroepen van de class of method. Externe afhankelijkheden van

de class of method worden vaak vervangen door ‘mocks’, in de vorm van mock-classes, in-memory databases, webservice stubs, etc. Het idee is dat de tests daardoor onafhanke-lijk worden en minder breekbaar bij wijzigin-gen elders in de code. In de praktijk staat bij het bouwen van een Java (EE) webapplicatie het correct functioneren van een class nogal ver af van de concrete gebruikersfunctiona-liteit. De echte Java-programmacode is maar een klein deel van een complex, ‘polyglot’ geheel. Er is ook nog front-end/view code (bijvoorbeeld JSF views of JSP’s), de contai-ner doet van alles op basis van configuratie/annotaties bij de code (denk aan object-relational mapping, webservices, transactio-naliteit), en soms bevat een achterliggende database ook nog een deel van de logica. De front-end code bevat steeds meer en steeds complexere client side-logica (denk aan JavaScript en AJAX), die je redelijkerwijs alleen in een browser kunt testen. Dan zijn er nog omgeving-specifieke zaken: de ontwik-kelomgeving kan goed geconfigureerd zijn, terwijl de acceptatie-omgeving een fout be-vat. Daardoor testen Java-unittests maar een klein deel van het hele systeem. En dus is er een grote kans dat een webapplicatie wel goed door de unittests heen komt, maar veel fouten bevat. Een ander probleem met het unittesten van classes of methods, is dat het refactoring in de weg kan staan. Bij een iteratieve werkwijze is frequent refactoren belangrijk om de kwaliteit en architectuur van de code op peil te houden en zo de pro-ductiviteit op langere termijn op peil te hou-

Effectief testen.indd 22 09-07-13 12:20

Page 23: Java Magazine #2 - 2013

JAVA magazine | 02 2013

effectief automatisch testen

effectief automatisch testen met cucumber

en aansluit bij de Scrum manier van werken. Je kunt zo’n testscript daarom ook makkelijk bespreken met een projectmanager of func-tioneel ontwerper en daarmee je specifica-ties valideren. Maar hoe kan dit uitvoerbaar zijn? De magie zit in de door Cucumber ge-bruikte uitbreidbare ‘domain specific langu-age’ (DSL): Gherkin. De vocabulaire van deze taal is eigenlijk heel beperkt. Er zijn een stuk of 10 woorden, die je in een taal naar keuze kunt opgeven. Hieronder zien we opnieuw ons testscript, maar dan met de keywords gemarkeerd:

Het woord ‘scenario’ betekent voor Cucum-ber dat er een test gaat worden beschreven van één of meer stappen. Het scenario slaagt als alle stappen slagen. Als er een stap faalt in een scenario, stopt het scenario en gaat Cucumber door met een eventueel volgend scenario. Een ‘functionaliteit’ is een te realiseren deel of aspect van de applicatie dat wordt getest; vanuit Cucumber-perspec-tief is het een combinatie van een aantal scenario’s. De ‘achtergrond’ zijn stappen die worden uitgevoerd voorafgaand aan ieder scenario. Zo wordt duplicatie voorkomen. De andere woorden ‘gegeven’, ‘als’, ‘dan’, ‘en’ worden door Cucumber allemaal op dezelfde manier geïnterpreteerd. Ze geven een test-stap aan. Alhoewel het voor de tool niet

Functionaliteit: InloggenAls een geregistreerde gebruiker wil ik met mijn username en password kunnen inloggen op de applicatie.

Achtergrond:Gegeven een geregistreerde gebruiker ‘frans’ met password ‘geheim’

Scenario: Succesvol inloggenAls ik naar de startpagina gaDan zie ik het inlogschermAls ik username ‘frans’ invulEn ik password ‘geheim’ invulEn op ‘inloggen’ klikDan ben ik ingelogd als gebruiker ‘frans’

den. Geautomatiseerde tests zouden daarbij moeten helpen: na een refactoring-slag moet je de tests opnieuw kunnen draaien om te controleren dat er niets stuk gegaan is. Bij class of method-gebaseerde tests lukt dat maar in beperkte mate: je kunt weliswaar de implementatie van een class of method wijzigen en dan opnieuw testen, maar als je serieus refactort en hele classes verwijdert of toevoegt, moet je de tests herschrijven. Dat is precies wat je níet wilt bij refactoring. Tests moeten onderhoudbaarheid onder-steunen, terwijl unittests de kosten van on-derhoud juist kunnen verhogen. Betekent dit dat je integratietests moet gaan in doen in plaats van (of in aanvulling op) unittests? Ja en nee. Het hele onderscheid tussen unit- en integratietests is nogal contraproductief. De kern van de zaak is dat je als ontwikkelaar verantwoordelijk bent voor de realisatie van een product. Is dat product een class library? Test de classes. Is dat product een web-service? Test de webservice. Is dat product een webapplicatie? Test de webapplicatie. Beschouw je product als de unit, en test die op de meest effectieve manier voorhanden!

cucumber: een overzichtCucumber is een testtool uit de Ruby-we-reld. In de kern biedt Cucumber de mogelijk-heid om testscripts in natuurlijke taal op te schrijven, maar wel op zo’n manier dat ze automatisch uitvoerbaar zijn. Idealiter vallen je specificaties en je testscripts dan samen. Cucumber wordt sinds 2009 ontwikkeld door Aslak Hellesøy. Hij heeft op vele conferen-ties gesproken over Cucumber. In 2011 was de 1.0-versie gereed. Interessant voor ons is dat in mei 2012 ook de port naar Java beschikbaar kwam onder de naam Cucumber JVM (niet te verwarren met het draaien van Ruby-Cucumber op de JVM via JRuby; dat kan ook maar is nogal complex). Een Cucumber-testscript ziet er bijvoorbeeld als volgt uit: Het mooie is dat dit er heel natuurlijk uitziet

Functionaliteit: InloggenAls een geregistreerde gebruiker wil ik met mijn username en password kunnen inloggen op de applicatie.

Achtergrond:Gegeven een geregistreerde gebruiker ‘frans’ met password ‘geheim’

Scenario: Succesvol inloggenAls ik naar de startpagina gaDan zie ik het inlogschermAls ik username ‘frans’ invulEn ik password ‘geheim’ invulEn op ‘inloggen’ klikDan ben ik ingelogd als gebruiker ‘frans’

Effectief testen.indd 23 09-07-13 12:20

Page 24: Java Magazine #2 - 2013

24

JAVA magazine

uitmaakt, is het wel verstandig ze op een consistente manier te gebruiken: ‘als’ voor het aangeven van acties en ‘dan’ voor het aangeven van resultaatcontroles. Maar hoe kan Cucumber dan een zinnetje als ‘Als ik naar de startpagina ga’ uitvoeren? Hier komt het concept ‘glue’ om de hoek kijken: de spreekwoordelijke lijm waarmee je tekst aan daadwerkelijke test-stappen plakt. De glue bestaat uit Java methods (die eventueel ook in een andere JVM-taal kunnen zijn geschre-ven) met annotaties. In de implementatie moet je zelf iets schrijven wat de teststap implementeert. Voorbeeld:

Runtime zal Cucumber de value van de @Als annotatie gebruiken om dit stukje code te koppelen aan het testscript. Een belangrijk deel van de kracht van Cucumber schuilt erin dat dit ook werkt met regular expressions, waarbij de capturing groups (de concrete strings die matchen met variabele gedeelten van de regular expression) als argument aan de method worden meegegeven. Voorbeeld:

Met een vergelijkbare syntax is het ook mogelijk om hele lijsten en tabellen aan glue-methods mee te geven. Het uitvoeren van testcontroles kan op dezelfde manier als met JUnit, via assertions. Dit op zich-zelf eenvoudige concept is in de praktijk enorm krachtig. Na de investering in het bouwen van een aantal voldoende generieke teststappen, kun je eindeloos variëren bij het maken van testscripts. Het maken van nieuwe testscripts kan dan zelfs door niet-programmeurs worden uitgevoerd! Het eind-resultaat van een Cucumber-run is een tes-trapportage (zie hieronder). Het standaard testrapport lijkt sterk op de testscripts.

De stappen krijgen een achtergrondkleur: groen als het goed is, rood als het fout ge-gaan is, geel voor niet-geïmplementeerd en blauw voor overgeslagen. We zien natuurlijk het liefst een testrapport dat helemaal groen is, net als een komkommer. Daarnaast kun je ook screenshots of andere gegenereerde informatie laten opnemen in het testrap-port. Wellicht is je opgevallen dat een deel van de informatie in het testscript niet werd gebruikt bij testuitvoering, zoals de be-schrijving van de functionaliteit. Deze tekst wordt wel overgenomen in het testrapport en zorgt voor leesbaarheid van testscripts en –rapport. Je kunt op deze manier zelfs het testrapport als combinatie van specificaties, testscripts en testrapportage gebruiken.

Relatie met andere toolsCucumber is een tool die één ding goed doet, namelijk een structuur bieden voor het ma-ken van uitvoerbare specificaties. Daardoor gebruik je het eigenlijk nooit op zichzelf. Aan de ene kant is er een manier nodig om de Cucumber-tests als onderdeel van een (automatische) build te draaien. Het gemak-kelijkst is om de JUnit-runner voor Cucumber te gebruiken, dan kan vervolgens iedere om-geving die met JUnit overweg kan ook met Cucumber overweg. Bijvoorbeeld een Maven-build met de Surefire-plugin, die je dan weer kunt aansturen vanuit een continuous-inte-gration omgeving als Jenkins. Aan de andere kant moeten de teststappen geïmplemen-teerd worden. Hier kun je gebruiken wat je wilt. Wij gebruiken veel Selenium WebDriver voor browser-tests, Apache HttpCompo-nents Client voor tests van webservices, en gewone JDBC voor het implementeren van stappen die tot doel hebben het systeem in een gedefinieerde toestand te brengen voor het uitvoeren van een test, bijvoor-beeld ‘Gegeven een geregistreerde gebruiker ‘frans’ met password ‘geheim’’. Dit wordt ook wel een ‘fixture’ genoemd. Maar het zou

Het mAken VAn nieuwe testscRipts kAn dAn zelfs dooR niet-pRo-gRAmmeuRs woRden uitgeVoeRd!

@Als(“ik username ‘(.*)’ invul”)void ik_username_invul(String username) {WebDriver driver = new FirefoxDriver();WebElement element = driver.findElement(By.name(“username”));element.sendKeys(username);}

@Als(“ik naar de startpagina ga”)void ik_naar_de_startpagina_ga() {/* We gebruiken hier Selenium WebDriver om de stap te implemente-ren. */ WebDriver driver = new FirefoxDriver();driver.get(“http://localhost:8080”);}

Functionaliteit: InloggenAls een geregistreerde gebruiker wil ik met mijn username en password kunnen inloggen op de applicatie.

Achtergrond:Gegeven een geregistreerde gebruiker ‘frans’ met password ‘geheim’

Scenario: Succesvol inloggenAls ik naar de startpagina gaDan zie ik het inlogschermAls ik username ‘frans’ invulEn ik password ‘geheim’ invulDan ben ik ingelogd als gebruiker ‘frans’

Effectief testen.indd 24 09-07-13 12:20

Page 25: Java Magazine #2 - 2013

JAVA magazine | 02 2013

bijvoorbeeld ook prima mogelijk zijn om de Java-API van Sikuli (Java Magazine 2013-1) te gebruiken om browser-tests te implemen-teren. Een tool die een beetje in dezelfde hoek zit als Cucumber, is FitNesse. Deze tool is ook geschikt voor het maken van lees-

bare, executeerbare specificaties, waarbij programmeurs stukjes code maken om

teststappen uit te voeren. Het grote verschil is dat FitNesse hiervoor een centrale webserver gebruikt met een Wiki-achtige structuur. De Cucumber

testscripts zijn daarentegen gewoon plain-text files die je typisch via een

versiebeheertool als Git of Subversion zult beheren. Cucumber is een wat eenvoudi-ger concept.

Praktijkervaringen en conclusiesDankzij het geautomatiseerd doortesten van functionaliteit met Cucumber, kan het aantal bevindingen dat menselijke testers nog vinden drastisch worden teruggebracht. Het maken van Cucumber testscripts gaat snel, alhoewel er in het begin wel even een drempeltje moet worden genomen als je nog geen bestaande glue-methods hebt voor je project. Zo af en toe glipt er toch een bug tussendoor. De procedure om daarmee om te gaan is vrij eenvoudig. We maken een nieuw Cucumber-script dat het issue reproduceert. Dan lossen we het probleem op zodat de test slaagt. En dankzij de bestaande tests weten we dat er niets anders is omgeval-len. We maken in de praktijk niet meer mee dat een hertest door een menselijke tester faalt. Hiermee is een belangrijke bron van project-frustratie geëlimineerd. Wij gebruiken Cucumber vooral voor integratie-achtige tests met een browser tegen een draaiende omgeving. Dat doen we met een apart Maven test-project dat los staat van het webapplicatie-project. De test wordt dus ook niet automatisch gedraaid als onderdeel van de Maven-build. Dat werkt in de praktijk heel natuurlijk, omdat het ook niet zozeer de build is die je test, maar het hele systeem. Zo’n test draaien we ook niet alleen bij het maken van een nieuwe build, maar ook na het deployen van een build op een bepaalde omgeving, tegen die specifieke omgeving. Zo weten we zeker dat een omgeving die vrijgegeven is voor test, het ook echt doet. Dit geeft enorm veel vertrouwen. Doordat de tests zo effectief zijn, is de drempel om zaken te refactoren veel lager geworden. Dat doen we dan ook regelmatig. Er worden ook nauwelijks meer specifieke projectafspraken

RefeRentiesCucumber website: cukes.info Aslak Hellesøy’s blog (de maker van Cucumber): aslakhellesoy.com

effectief AutomAtisch testen

voor gemaakt. Refactoren is gewoon onder-deel van het dagelijks werk, zoals het hoort. De leesbaarheid van de Cucumber-test-scripts en –rapportages maakt dat ze ook relevant worden voor niet-programmeurs. Dat is een enorm verschil met standaard JUnit-tests. Onze ervaring is dat menselijke testers kunnen bekijken wat al automatisch getest is, en dan vervolgens risico-gericht kunnen bekijken wat zij nog aanvullend willen doen. Dit komt de efficiëntie van het handmatig testen dus ten goede. Maar het is niet zo dat handmatig testen overbodig wordt. Overigens zouden de Cucumber-rap-portages nog wel een stukje fraaier kunnen. Standaard is het recht-toe-recht-aan op basis van de testscripts, maar je krijgt geen mooie inhoudsopgave, overzichtstabellen of dat soort dingen. Cucumber biedt echter voldoende toegang tot de ruwe gegevens (als JSON) om zoiets zelf te scripten. Een ‘probleem’ bij het gebruiken van Cucumber is dat het maken van nieuwe testscripts zo gemakkelijk gaat, dat het uitvoeren van alle tests zo meerdere uren kan duren. Nu biedt Cucumber wel mogelijkheden om verschil-lende subsets van tests uit te voeren. De volgende werkwijze blijkt voor ons goed te werken: ontwikkelaars voeren lokaal alleen die tests uit die ze specifiek nodig achten. We gebruiken een subset van tests die ongeveer een kwartier duurt en die we kunnen gebruiken bij deploy-ments. De continuous integration server voert de hele dag door een volledige set tests uit die ongeveer 1,5 uur duurt. Zodra die tijd te lang wordt, gaan we kritisch door de tests heen en archiveren we een deel van de tests. Alles bij elkaar zijn onze ervaringen met Cucum-ber dus zeer positief. Geautomatiseerd testen levert nu eindelijk de voordelen op die altijd zijn beloofd.

Je moet wel gek zijn om als Java-specialist bij CGI te werken.Gek van je vak, door en door thuis in Java?Dan is het zeker niet gek om een kijkje te nemen op www.werkenbijcgi.nl of direct te solliciteren via [email protected]. Experience the commitment®

CGI Adv JavaSpec_105x37mm.indd 1 03-07-13 15:27

Advertentie

Effectief testen.indd 25 09-07-13 12:20

Page 26: Java Magazine #2 - 2013

26

JAVA magazine

Goede start Devoxx4Kids in NederlandNa de succesvolle eerste Devoxx4Kids in Brussel en Gent vorig jaar, vond op 8 juni de eerste Devoxx4Kids in Nederland plaats. JPoint en de Universiteit van Amsterdam organiseerden deze dag. Het idee achter de Devoxx4Kids is kinderen op een speelse manier kennis te laten maken met techniek en informatica.

Op deze zonnige dag meldden de jongens en meisjes tussen de tien en veertien jaar zich op het Science Park om kennis te maken met de wondere wereld van techniek. De dag begon met een korte introductie en een vliegende quadcop-ter door de collegezaal; dit tot groot vermaak van de kinderen. De groep werd opgedeeld in drie groepen die ieder drie opdrachten gedurende de dag deden.

Spelen met ArduinoDe eerste opdracht was het aansturen van componenten met een ‘Arduino’. Een Arduino is een microcontroller met een aantal I/O-com-ponenten. Je kan er een programma opzetten via een USB-kabel. De kinderen kregen eerst een korte uitleg over een stroomkring en weerstan-den. Daarna gingen ze snel aan de slag. De eerste stap was een LED aan te zetten via een Arduino. De LED ging aan zodra je de Arduino met de computer verbond. In de volgende stap zat meer muziek. Met behulp van een luidspreker en een aantal weerstanden kon je al een kleine melodie spelen. De luidspreker werd daarna gekoppeld aan een lichtgevoelige weerstand. Bij weinig licht kwam er een lage toon uit en bij veel licht een hoge toon. Deze hoge toon deed pijn aan je oren! Vooral als je de zelfgemaakte muziekdoos in het zonlicht zette. De laatste stap was het maken van een stoplicht. Je moest eerst de lampjes op het ‘breadboard’ plaatsen. Een breadboard is een bordje, vaak van wit of geel plastic of pertinax, dat wordt gebruikt om elektronische schakelin-gen tijdelijk op te bouwen. Daarna moest je de weerstanden erin prikken en draden verbinden aan de verschillende poorten van de Arduino. Een simpel programma stuurt de drie verschil-lende LED-jes aan, zodat de lampjes in de goede volgorde aan- en uitgaan. Tijdens het laden van

Eelco Meuterlid redactiecommis-sie Java Magazine.

Devoxx.indd 26 09-07-13 12:21

Page 27: Java Magazine #2 - 2013

JAVA magazine | 02 2013

Devoxx4kiDs

Goede start Devoxx4kids in Nederland

de programma’s op de Arduino kregen de kinde-ren uitleg wat er nu precies gebeurde.

Lego MindstormsNa een goed verzorgde lunch met veel lekkere broodjes was het tijd voor de tweede opdracht. Er stonden een aantal Lego NXT Mindstorms-ro-botjes klaar. Elke robot had een aantal sensoren zoals een druk-, kleur- en geluidsensor. De eerste opdracht was om de robot te laten rijden. Voor veel kinderen een moeilijke opdracht. Zeker als je nog nooit met Lego NXT hebt gespeeld. Met wat hulp en vooral veel proberen, kregen de meeste kinderen de robot toch aan het rijden. Je kon de robot zo programmeren dat hij bewoog of stopte als je met je handen klapte. De robot had voldoende sensoren om zelf rond te rijden

zonder dat hij ergens tegenaan botste. Sommige kinderen kregen het ook voor elkaar om de robot een zwarte lijn te laten volgen, al moest de lijn soms even verplaatst worden! Verder kregen de kinderen uitleg waarvoor robots tegenwoordig gebruikt worden.

scratchIn de laatste opdracht gingen de kinderen aan de slag met ‘Scratch’. Dit is een open source- ont-wikkelomgeving voor kinderen. In Scratch zijn de verschillende commando’s als bouwblokjes weergegeven. Door de verschillende blokken te stapelen, schrijf je een computerprogramma. Je kan met Scratch op een simpele manier ingewikkelde spelletjes bouwen. De kinderen kregen drie opdrachten. Mijn dochter legde ze

Devoxx.indd 27 09-07-13 12:21

Page 28: Java Magazine #2 - 2013

28

JAVA magazine

als volgt uit: “In de eerste opdracht moest je een kat laten dansen. Met deze opdracht leerde je de manier van programmeren kennen. Dat was best makkelijk. Bij de tweede opdracht moest je een doolhof bouwen. Een kleine blauwe olifant moest door een doolhof lopen. Zodra de olifant het eindpunt had bereikt, klonk een muziekje en zei hij: “ik ben er!” De laatste opdracht heette ‘bananen madness’. Je moet in dit spel zoveel mogelijk bananen verzamelen zonder gepakt te worden door het spook. Dit is een iets moeilij-ker spel om te bouwen.” Vol trots werden de gebouwde spelletjes aan de ouders getoond. Daarnaast werden er ook andere spelideeën toegevoegd die niet in de opdracht stonden.

Het was voor de aanwezige vaders en moeders best lastig zich er niet mee te bemoeien. De opdrachten inspireerden namelijk niet alleen de kinderen, maar ook de aanwezige ouders. Aan het eind van de dag kregen alle kinderen ook nog een borstelrobot mee naar huis. Toen mijn dochter en ik thuis kwamen, legde zij alles uit aan haar broers en zus. Het was ongelofelijk om te horen hoe ze de kennis had opgepikt en meteen doorgaf. De opdrachten hadden duidelijk een diepe indruk gemaakt. Het idee dat je iets kunt aansturen of dat je iets kunt maken met de computer fascineerde haar. De vraag en opmer-king die ik de dag later een paar keer kreeg was: “wanneer gaan we weer? Het was erg leuk! Ik wil later ook naar de universiteit.” Dan kan je als ou-der weinig anders dan glimlachen en concluderen dat de dag een groot succes was! Terugkijkend op deze dag werkt het enthousi-asme en de nieuwsgierigheid van de kinderen

aanstekend en inspirerend. Ik hoop dat dit soort initiatieven vaker gaan plaatsvinden. Informa-tica is namelijk niet meer weg te denken uit ons dagelijks leven, en de nieuwe generatie zal er waarschijnlijk nog meer mee te maken krijgen dan wij ons nu kunnen voorstellen. Of je als kind techniek of computers nu leuk of interessant vindt of juist saai en ingewikkeld, dat maakt niet uit. Het belangrijkste is dat je het een keer gezien hebt en ermee gespeeld hebt. JPoint en de Universiteit van Amsterdam hebben een goede start gemaakt met de eerste Devoxx4Kids en ik hoop op een grootschalig vervolg in de toekomst.

AAnvullende informAtie:twitter: #devoxx4kidsWebsite: devoxx.com/display/4KIDSNL/Home video: vimeo.com/67959779

Maak krachtig gebruik van de Oracle database!

Transfer Solutions, Specialist in Oracle- en Java EE advies, consulting en opleidingen.

www.transfer-solutions.com

T 0345 - 616 888E [email protected]

Advertentie

Devoxx.indd 28 09-07-13 12:21

Page 29: Java Magazine #2 - 2013

JAVA magazine | 02 2013

LogbackLogback is een logging-framework, dat naar eigen zeggen de opvolger van log4j is. Het is een implementatie van de handige slf4j API, die veelal in combinatie met log4j gebruikt wordt in projecten. Log4j en logback zijn conceptueel ongeveer gelijk, maar logback heeft een aantal handige features zoals het automatisch herladen van configuratiebestanden en een uitgebreide set van filter-mogelijkheden. Mocht je op zoek zijn naar een krachtig, snel, stabiel en eenvoudig logging-framework, dan is logback zeker het overwegen waard. Je kunt meer informatie over logback vinden op logback.qos.ch.

LibrAries uitgeLicht

Libraries uitgelicht

JacksonWanneer je een lichtgewicht gegevensformaat nodig hebt voor bijvoorbeeld de commu-nicatie tussen je HTML/JavaScript front-end en je Java back-end, is JSON vaak een goede keuze. Jackson is een snelle JSON-processor, die functionaliteit biedt voor het streaming lezen en schrijven van JSON. Een erg handige feature is de Object/JSON mapper, die bijvoorbeeld een Map of Javabean van en naar JSON kan omzetten. Combineer Jackson met JavaScript-functies toJSON() en evalJSON() van de jQuery-JSON plugin, en je hebt een complete oplossing om in zowel je front- als backend code op een heel eenvoudige ma-nier met JSON om te gaan. Jackson wordt onder andere gebruikt door REST frameworks Jersey en RESTeasy. Meer informatie kun je vinden op jackson.codehaus.org.

retrofitVoor het aanroepen van een REST API kun je eenvoudig gebruik maken van Retrofit voor het afhandelen van de low level code, zoals HTTP-requests en JSON mapping. Retrofit ont-sluit een REST API middels annotaties op een interface, waardoor je met deze interface de REST API als POJOs kunt gebruiken in je code. Retrofit handelt de vertaling en de aanroep af; deze kan zowel synchroon als asynchroon worden uitgevoerd. In het asynchrone geval vindt de afhandeling via een callback-mechanisme plaats. Retrofit zorgt ook voor de verta-ling van het resultaat van de aanroep. Standaard gebeurt dit middels Gson, maar je kunt ook andere convertors gebruiken of je eigen convertor toevoegen. Voor meer informatie, zie github.com/square/retrofit.

Ben jij ook eenChampions League speler?

Kijk voor onze vacatures op pagina 20/21 van dit magazine.

03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1 4/23/2013 5:24:44 PM

Advertentie

Libraries uitgelicht

LibrAries uitgeLicht

Libraries uitgelicht.indd 27 09-07-13 12:40

Page 30: Java Magazine #2 - 2013

30

JAVA MAGAZINE

Aan de slag met Android StudioVoor het ontwikkelen van Android-applicaties bestaan er diverse ontwikkelomgevingen, waarvan het Eclipse-platform de meest prominente is. Na 5 jaar Eclipse-dominantie vond Google het tijd voor een compleet nieuwe ontwikkelomgeving: Android Studio. Deze IDE werd op Google I/O 2013 gepresenteerd door het Android SDK team. Google wil met deze IDE het ontwikkelproces van Android-applicaties beter stroomlijnen en de gebruikersinterface centraal stellen. Dit artikel geeft een eerste indruk.

IntelliJ IDEAHet bedrijf Jetbrains produceert al geruime tijd verschillende ontwikkelomgevingen voor di-verse programmeertalen, waarvan IntelliJ IDEA het vlaggenschip is voor Java-ontwikkeling. De open source variant dient als basis voor Android Studio. Google heeft voor dit platform gekozen omdat het robuust en uitbreidbaar is. Standaard biedt IntelliJ IDEA al veel functio-naliteiten: Version Control via diverse plugins, Groovy en Java ondersteuning, refactoring en SmartType: intelligente code completion (zie afbeelding 1). Ook ondersteunt IntelliJ ‘langu-age injection’: de IDE is op de hoogte dat een String-representatie een andere taal voorstelt, bijvoorbeeld XML of een reguliere expres-sie (zie afbeelding 2). IntelliJ biedt dus een solide basis. We gaan nu kijken welke features Google hieraan heeft toegevoegd in Android Studio.

Overzicht featuresAndroid Studio heeft een aantal features die ik in de volgende secties nader onder de loep neem:< Gradle buildsysteem< Layout preview< AppEngine Cloud Endpoints-integratie< ADT TranslationManagerDe huidige versie van Android Studio is beschikbaar als ‘Early Access Preview’: je moet rekening houden met wat foutjes her en der en ontbrekende functionaliteit. Maar met bijna elke week een update, zal Android Studio snel volwassen worden.

Dennis Rutjes is Application Consultant bij Inter Access. Zijn interesse ligt voornamelijk op het gebied van Service Oriented Architecture in combinatie met mobiele platformen (Android/iOS).

Gradle buildsysteem Eén van de aspecten van het stroomlijnen van het ontwikkelproces uit zich door het inzetten van een uniform buildsysteem op basis van Gradle. Dit geeft de ontwikkelaar volledige controle op het compile/deploy proces: zowel in de IDE als op een continuous integration server, en met telkens hetzelfde resultaat. In combinatie met Maven voor dependency ma-nagement, is dit een krachtige tool die op den duur de losse Ant scripts en de Eclipse builders zal gaan vervangen. Voor oudere projecten kan Eclipse een build.gradle file genereren dat gebruikt kan worden door Android Studio. Een

Afbeelding 1: SmartType begrijpt welke klassen Random inherit.

Afbeelding 2: RegExp-injectie waarbij gelijk getoetst kan worden of het patroon voldoet.

Android Studio.indd 30 09-07-13 12:22

Page 31: Java Magazine #2 - 2013

JAVA MAGAZINE | 02 2013

Aan de slag met Android Studio

voorbeeld van deze flexibiliteit is het werken met ‘productFlavors’, die gebruikt worden in combinatie met ‘buildTypes’ om verschil-lende ‘build variants’ te definiëren. Standaard ‘buildTypes’ zijn ‘release’ en ‘debug’.

Opmerking: De huidige versie op moment van schrijven van dit artikel gaf pas een lijst met build-varianten na het opnieuw opstar-ten van de IDE. De melding rechts laat ons nog even weten dat de IDE nog niet helemaal compleet is.

Door de verregaande integratie met de IDE kan voor specifieke ‘build variants’ gekozen worden. Zo is het mogelijk om voor de alpha-versie extra permissies in te zetten die niet van toepassing zijn voor de overige varianten. De IDE markeert ter verduidelijking de bijbeho-rende (re)source folders. Naast een statische manier van configureren, biedt Gradle ook de mogelijkheid om logica in het script te definië-ren. Zo kan de configuratie worden uitgebreid met het volgend stukje Groovy-code, dat er voor zorgt dat elk ‘buildType’ een aparte pac-kage suffix krijgt:

Voor builden vanaf de commandline kun je in de project folder het commando ‘./gradlew tasks’ gebruiken. Dit levert een behoorlijke lijst met mogelijke taken op. De belangrijkste hiervan zijn :< Assemble: assembleert alle build varian-

ten. Dit kan ook specifieker: ‘assemble-FreeDebug’ (aFD) zorgt voor het packa-gen van de gratis debug-variant uit ons voorbeeld.

< Check: dit commando start bijvoorbeeld code quality tooling op (indien geconfigu-reerd).

< Build: combinatie van assemble en build.< Clean: schoont de build-directory op.Het uitweiden over alle mogelijkheden van het buildsysteem gaat te ver voor dit artikel; daarvoor verwijs ik naar de referenties.

Layout previewDit is de meest opmerkelijke feature van Android Studio. Tijdens het bewerken van de layout-XML, krijg je een dynamische preview te zien van het scherm in de geselecteerde

AAN DE SLAG MET ANDROID STUDIO

Aantal ‘productFlavors’ gecombineerd met het aantal build types geeft het aantal build varianten.

android.buildTypes.each { type -> type.packageNameSuffix = “.$type.name”}

DE PREVIEW RENDERER IS FOUTBESTENDIG; BIJ EEN TIKFOUT IN DE LAYOUT-XML WORDT ALLEEN DAT ONDERDEEL NIET GEVISUALISEERD EN GEEFT DE IDE DIRECT EEN HINT OM HET EUVEL TE VERHELPEN.

Android Studio.indd 31 09-07-13 12:22

Page 32: Java Magazine #2 - 2013

32

JAVA MAGAZINE

taal. Daarbij markeert de IDE het onderdeel dat je op dat moment bewerkt. Zo kan snel een potentieel probleem worden ontdekt als voor een bepaalde taal een label te lang blijkt te zijn. Ook is de preview renderer foutbe-stendig; bij een tikfout in de layout-XML zal alleen dat onderdeel niet gevisualiseerd worden en geeft de IDE direct een hint om het euvel te verhelpen.

Code editorTijdens het bewerken van je code zijn er een aantal extra features beschikbaar, waaronder ‘String Reference Folding’: in de editor is dan de waarde van een referentie zichtbaar, in plaats van de sleutel. Ook referenties naar icons worden getoond: deze zijn in de kantlijn zichtbaar.

AppEngine Cloud Endpoints integrationGoogle AppEngine is een platform voor het ontwikkelen en hosten van webapplicaties. Android Studio bevat ondersteuning voor het integreren met AppEngine, maar deze feature valt wat mij betreft een beetje uit de toon. Het lijkt een poging om het ontwik-kelen van Android-applicaties in combinatie met AppEngine te stimuleren. De feature kan met behulp van een wizard cliënt-code genereren voor het koppelen met een webap-plicatie die op AppEngine draait.

ADT Translation managerVoor het meertalig maken van apps kan deze plugin alle ‘Resource Strings’ uploaden via een Google Developer Account. Via de vertaalservice van Google kun je de resources

laten vertalen in bijna elke gewenste taal, uiteraard tegen een (geringe) vergoeding.

ConclusieNaast een nieuw splashscreen en kekke iconen heeft de preview-versie van Android Studio al aardig wat interessante features te bieden. De’ layout preview-feature’ is hierbij degene die het meest in het oog springt. Het uniforme buildsysteem lijkt een verstan-dige keuze maar vergt wat gewenning voor de fervente Maven gebruiker. Bij het testen van deze feature bleek de IDE dan ook nog niet helemaal compleet te zijn. De AppEngi-ne cloud endpoints integratie had Google wat mij betreft weg kunnen laten. In plaats hier-van had een generieke client/server oplos-sing niet misstaan. Alles bij elkaar genomen is de nieuwe IDE een welkome toevoeging aan het Android ontwikkel- ecosysteem.

Develop with pleasure, develop with Android Studio!

Layout preview met device frames.

Layout preview met een XML-fout.

String folding en icoon-presentatie.

REFERENTIESAndroid Studio: developer.android.com/sdk/installing/studio.htmlIntelliJ IDEA: Ten tijde van het schrijven van dit artikel blijkt ook Jetbrains zelf versie 13 EAP (codename Cardea) als download aan te bieden. Deze versie beschikt over alle features van Android Studio, met uitzondering van de AppEngine endpoint integration en Android wizards.GRADLE: Gradle is een ‘build system’ dat voortbouwt op de concepten van Apache Ant en Apache Maven. Configuratie vindt plaats via een Groovy-gebaseerd DSL configura-tiescript, in tegenstelling tot XML-configuratie van de meer traditionele systemen.http://gradle.orghttp://tools.android.com/tech-docs/new-build-system/user-guidehttp://developers.google.com/events/io/sessions/32523664

Android Studio.indd 32 09-07-13 12:22

Page 33: Java Magazine #2 - 2013

JAVA magazine | 02 2013

HigHligHts google i/o

Highlights google i/oWe’re just getting started

Larry Page, één van de oprichters van Google, eindigde dit jaar de keynote met de uitspraak: “We’re just getting started”. Google ziet enorme kansen in revolutionaire verbeteringen, en investeert stevig in nieuwe platforms en mogelijkheden. Google was in de begindagen ‘slechts’ een internet services bedrijf. Vooral uit onvrede over de snelheid van innovatie is Google echter ook in de platform-business gestapt: met Android en Chrome. Beide platforms zijn nu ruim 4 jaar op de markt, en zowel Android als Chrome zijn marktleiders, zowel in gebruiksstatistieken als in mogelijkheden.

Op de Google I/O conferentie werd de focus gelegd op de nieuwe mogelijkhe-den die wij als ontwikkelaars nu, of bin-nen enkele maanden, direct in kunnen zetten. Google hanteert het auto-update mechanisme van Chrome, of de Play Services strategie op Android, waarbij nieuwe services via auto-update aan An-droid 2.2 en hoger worden toegevoegd. Een stortvloed aan nieuwe API’s maken het mogelijk om tot nu toe geavan-ceerde functies als spraak, geo-fencing of soepele animaties eenvoudig toe te voegen. De meegeleverde ontwikkeltools zijn flink opgepoetst: er is goed gekeken naar de praktische uitdagingen die ko-men kijken bij het maken van de nieuwe generatie applicaties.Google past deze innovaties ook toe in hun eigen services: Search, Maps, GMail en Google+. De concurrentie, zoals Facebook of Micro-soft, zal naar alle waarschijnlijkheid meebewegen. Dat betekent, dat eind-gebruikers steeds hogere verwachtingen zullen krijgen over hoe een app hoort te werken. Soepele animaties, snelle performance, spraak, content-first UX en context- en locatie-bewust worden in rap tempo mainstream. Dit zal zeker ook een weerslag hebben op enterprise applicaties en de acceptatiegraad van de doorgaans beperktere mogelijkheden. De snelheid waarmee Google ontwikkelt valt niet te onderschatten. Een gemid-deld platform-team bij Google levert maandelijks nieuwe features op, soms nog sneller. Niet alles past zelfs meer in

I/O: voor Glass worden aparte developer-events georganiseerd, Android 4.3 wordt apart aangekondigd, en test-automation wordt op de Google Test Automation Conference (GTAC) behandeld.Die zucht naar snelheid maakt dat Google soms controversiële keuzes maakt, zoals de fork van Webkit naar Blink en de migra-tie van Eclipse naar IntelliJ. Een agressie-vere ontwikkeling van eigen standaarden doet, ook in het kamp van Google-fans, soms pijn. Niet alleen concurrenten, ook partners van Google zullen moeten meedoen op dezelfde hoge snelheid om interessant te blijven.

sfeerimpressieGoogle I/O mag met haar zesduizend bezoekers dan niet de grootste con-

ferentie zijn, maar het is wel degelijk een conferentie van formaat. Google pakt dan ook groots uit in het Moscone Center in down-town San Francisco. De bekende kleuren van Google zijn op veel plekken terug te vinden; Moscone is voor deze drie dagen volledig aangekleed voor Google I/O. Binnen zijn op drie verschil-lende verdiepingen allerlei activiteiten te vinden. Naast de ‘gewone’ workshops, zijn er zogenaamde ‘booths’, waar je op een laagdrempelige wijze in contact kunt komen met ontwikkelaars van allerlei verschillende Google producten, waaronder ook Google medewerkers zelf! Zo hebben we onder andere gesproken met de ontwikkelaars van AngularJS (Igor Minar en Miško Hevery). Extra leuk maakte het om allerlei technieken uit te

Highlight Google.indd 33 09-07-13 12:23

Page 34: Java Magazine #2 - 2013

34

JAVA magazine

kunnen proberen. Zo was er een stand voor Google Glass, en kon je bijvoorbeeld ook de Leap Motion in combinatie met Oculus Rift uitproberen. Eveneens stond er op de tweede verdieping een Mercedes SL-klasse met daarin de nieuwe Google Maps features. Hier was natuurlijk veel belangstelling voor, al was het alleen om maar eens in een SL-klasse te kunnen zitten! De keynote liet alle bijzondere kenmerken die we gedu-rende Google I/O zijn tegengekomen in drie uur zien. De laatste tien seconden voor de aftrap van de keynote werd er gezamenlijk uit volle borst afgeteld. Mensen hadden er duidelijk zin in en dit werd zeker niet minder toen met een subtiele hint duidelijk werd dat iedereen met een Chromebook Pixel naar huis zou gaan!

Android StudioAndroid heeft opnieuw een spectacu-laire groei gemaakt: van 400 miljoen naar 900 miljoen actieve devices in één jaar tijd. Google kondigde op I/O aan dat ze zich vooral inzetten voor nieuwe services, tools en ondersteuning die niet gekoppeld zijn aan een specifieke versie van Android. De grootste aankondiging was die van Android Studio: een nieuwe IDE voor Android development. Android Studio is een voortzetting op de IDE support die JetBrains tot nu toe had gemaakt in IntelliJ. Er is ook een nieuw

op Gradle gebaseerd Android SDK Build System gelanceerd. De ‘oude’ op Eclipse en Ant gebaseerde tools zullen voorlo-pig nog worden ondersteund, maar alle nieuwe ontwikkeling zal op Android Studio gericht worden. Een belangrijke basis voor Android Studio is de visie om de build en IDE te baseren op dezelfde Gradle configuratie. Hierdoor is het veel eenvoudiger en productiever voor ontwikkelaars om grotere applicaties te maken, ook wordt het voor de makers van andere tools eenvoudiger om aan te sluiten. Sommige diensten zijn via een Service Provider Interface (SPI) opzet geïntegreerd, zoals automatisch testen, wat het mogelijk maakt snel te wisselen van teststrategie. Deze diepe integratie en flexibiliteit is zeer krachtig en lost veel bestaande problemen op, hopelijk gaan andere Java tools dit voorbeeld vol-gen. Veel van de features die getoond zijn (multi-screen layout editing, An-droid Lint) waren ook al in Eclipse aan-wezig en werden vooral gedemonstreerd om te laten zien dat Android Studio al in een redelijk complete vorm beschik-baar is. Belangrijk om te beseffen is dat Android Studio en het nieuwe Build System nog slechts in een ‘early access preview’ worden aangeboden. Alhoewel het voor early adopters al zeker bruik-baar is en het in sommige opzichten al beter werkt, moet je voorlopig nog wel fouten en ruwe randjes accepteren.

Google Play ServicesVanuit Google Play Services is een flinke set nieuwe API’s beschikbaar gesteld, zoals single-sign-in met Google+, en Game Services. De nieuwe Location en Activity Services zijn extra interessant, omdat het voorheen in Android erg complex was om op een goede manier de locatie uit te lezen. De nieuwe API’s maken het mogelijk zonder veel gedoe en met minimaal energieverbruik de locatie uit te lezen, geo-fencing toe te passen, of te bepalen of je stil zit, loopt of auto rijdt.

Developer ConsoleDe Google Play Store Developer Console is ook flink uitgebreid. De grootste toevoeging is directe ondersteuning van test-versies en staged roll-outs. Dit maakt het mogelijk om de applicatie eerst te verspreiden onder testers, met eigen versies van analytics en crash reports, direct vanuit de console. Daarna kun je aan een klein gedeelte van de eindgebruikers gefaseerd een nieuwe versie van de applicatie aanbieden. Hier-mee kan met minder risico een nieuwe versie van de app in productie worden genomen.

WebontwikkelingWat betreft webontwikkeling zien we een grote vooruitgang over de volle breedte. Zo introduceert Google bin-

De GrootSte AAnkonDiGinG WAS Die vAn AnDroiD StuDio: een nieuWe iDe voor AnDroiD DeveloPment

Highlight Google.indd 34 09-07-13 12:23

Page 35: Java Magazine #2 - 2013

JAVA magazine | 02 2013JAVA magazine

nenkort de nieuwe Chrome DevTools met interessante nieuwe features. Denk hierbij bijvoorbeeld aan Workspaces, die het mogelijk gaan maken om je broncode live in de browser aan te passen terwijl de aanpassingen onderwater ook op het filesysteem worden doorgevoerd. Nog een andere nieuwe feature is onder-steuning voor SASS. Door middel van SourceMaps kun je in DevTools door je SASS stylesheet lopen met dezelfde functionaliteit als die je bij CSS hebt! En voor de performance-guru’s onder ons: het wordt binnenkort ook mogelijk om je webapplicatie gedetailleerder te profilen. Denk hierbij aan details over Layout Trashing, Object Allocation Tracking en GPU Memory Consumption. Kortom, de Chrome DevTools zijn goed op weg om een full-featured IDE te worden. Maar niet alleen de tooling krijgt grote updates. Met elke automatische update van Chrome worden nieuwe functio-naliteiten toegevoegd. Een belangrijke recente ontwikkeling is rondom de standaarden WebP en VP9. WebP is het nieuwe formaat van afbeeldingen dat een directe concurrent vormt voor de gangbare formaten. Google rapporteert dat ze met WebP meer dan 30% hogere compressie bereikt dan JPEG, zónder kwaliteitsverlies! Ongeveer hetzelfde geldt voor de VP9 video compressie, waarbij de bitrate meer dan 60% lager is vergeleken bij H.264. De adoptie van deze technieken neemt steeds meer toe. Zowel op Facebook als Google Plus zorgen deze technieken ervoor dat het dataverkeer flink afneemt. De tijd begint te komen voor andere organisaties om hier serieus naar te gaan kijken. Webap-plicaties worden steeds populairder. Vanuit organisaties als Google maar ook de andere browser bouwers wordt flink geïnvesteerd in het verbeteren en uitbreiden van de mogelijkheden op het web. Web Components is een dergelijke innovatie. Met Web Components wordt HTML geschikt gemaakt voor templa-ting. Daarvoor worden HTML Templates, HTML Imports, Custom Elements en Shadow DOM in Chrome geïntroduceerd. Deze technologieën brengen feitelijk het component-based dat we ken-nen van technologieën als JSF naar de browser. Nu is het nog afwachten hoe frameworks zoals AngularJS deze nieuwe mogelijkheden in gaan zetten. Ook CSS3

heeft veel verbeteringen ondergaan. In samenwerking met National Geographic heeft Google een webapplicatie gemaakt waarin de nieuwste CSS3 features tot in het uiterste worden gebruikt. Goed nieuws: de National Geographic Forest Giant Demo is online te vinden, het is aan te raden om hier eens een kijkje te nemen!

Chrome Packaged AppsChrome Packaged Apps werden aange-kondigd op Google I/O 2012 en ook dit jaar is er veel aandacht uitgegaan naar deze mogelijkheid om met webtechno-logieën desktop-applicaties te maken. Chrome is tegenwoordig niet zomaar meer een browser, het wordt steeds meer een platform. Vanuit JavaScript in de Chrome browser kun je in een Chrome Packaged App gebruik maken van API’s die in normale webapplicaties niet beschikbaar zijn. Denk aan toegang tot hardware als webcam, bluetooth of USB. Tevens biedt Chrome verschillende API’s aan voor zaken die door het besturings-systeem worden geregeld, zoals notifica-ties en het bestandssysteem. Bij een van de workshops tijdens I/O konden we zelf experimenteren met deze veelbelovende technologie. Wil je dit ook zelf proberen? Neem dan eens een kijkje op: goo.gl/UHCS8.

ConclusieAlles wat Google heeft laten zien op I/O was niet alleen vernieuwend, maar ook al direct of binnenkort beschikbaar. Natuurlijk zijn er meer ontwikkelingen, bijvoorbeeld in Cloud en rondom Google Maps. En met het hoge tempo waarmee Google verder gaat kunnen we de ko-mende jaren nog veel meer verwachten. Nog even aftellen tot I/O 2014!

Google kopstukken, zoals Sergey Brin, waren

regelmatig op de conferentievloer te vinden.

HigHligHts google i/o

Peter HendriksIT Architect bij Info Support

sander de grootJava Ontwikkelaar bij Info Support

Ben jij ook eenChampions League speler?

Kijk voor onze vacatures op pagina 20/21 van dit magazine.

03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1 4/23/2013 5:24:44 PM

Advertentie

Highlight Google.indd 35 09-07-13 12:23

Page 36: Java Magazine #2 - 2013

36

JAVA MAGAZINE

Community momentumIn het vorige Java Magazine schreef ik over de organisatorische veranderingen binnen de NLJUG en hoe die ten goede zouden komen aan de leden en de businesspartners. Niet in de laatste plaats vanwege een vernieuwde drive en commitment. Dat gevoel is door de businesspartners naadloos overgeno-men. De afgelopen maanden zijn jullie bijna gebombardeerd met mailings waarin allerlei inhoudelijke evenementen, veelal gratis, zijn aangeboden door onze businesspartners. Daarnaast zijn we ons als NLJUG ook aan het oriënteren op hoe we, naast J-Fall en het University format, nog andere events op de kalender kunnen krijgen. Wellicht betekent dit ook dat NLJUG klassiekers terug zullen keren, maar daarover een andere keer meer nieuws. Het goede nieuws is dat de Java community in Nederland een flinke opleving heeft en iedereen die interesse heeft, zijn hart kan ophalen aan allerlei (kennis)events.

Oplettende leden hebben het misschien al gezien, maar we hebben een vernieuwde website (nljug.org). En eerlijk gezegd was dat ook de hoogste tijd. De ronde, web 2.0, hoekjes hebben plaatsgemaakt voor een moderne, en strakkere, ‘bootstrap-achtige’ look. Een deel van de bestaande content is inmiddels overgezet. In de komende periode zal ook een nieuw eventsgedeelte worden uitgewerkt en zullen er nieuwe faciliteiten aan de site worden toegevoegd.

BestuursuitbreidingNa de businesspartner meeting en de oproep in de vorige bestuurscolumn in Java Maga-zine, hebben zich diverse kandidaten gemeld voor een functie in het nieuwe NLJUG stich-tingsbestuur. Na (op volgorde van aanmel-ding) met verschillende kandidaten gesprek-ken te hebben gevoerd, kan ik melden dat we

Van het bestuurEen update vanuit het NLJUG bestuur, met dit keer aandacht voor organisatieveranderingen en bestuursuitbreiding binnen de NLJUG, een vooruitblik op J-Fall 2013 en tenslotte een kort v erslag van de EOUC bijeenkomst in Gent.

twee nieuwe bestuursleden hebben gevon-den in de personen van Roy Wasse en Karen van Asten. Vanaf deze plek wil ik hen van harte welkom heten in het NLJUG bestuur! In het volgende Java Magazine zullen zij zich uitgebreider aan jullie voorstellen. Met het aantreden van Roy en Karen hebben we een vijfkoppig bestuur en zijn we statutair weer compleet.

J-Fall 2013Rond het verschijnen van dit Java Magazine zijn we de halfjaargrens inmiddels alweer gepasseerd, en dit betekent dat voor een aantal van ons de J-Fall koorts weer gaat uitbreken. Op woensdag 6 november gaat dit jaarlijkse evenement wederom plaatsvinden in Evenementencentrum Hart van Holland in Nijkerk. Het is inmiddels de vierde keer dat we Nijkerk aandoen, en voor velen van jullie is dit dan inmiddels ook een bekende plek geworden. Graag willen we het enthou-siasme van afgelopen jaar evenaren en mis-schien heeft het evenement dit keer wel een bijzonder tintje, gezien het feit dat 2013 voor de NLJUG een bijzonder jaar is (denk 10-jarig bestaan). Vlak voordat deze editie van Java Magazine op de deurmat valt, is de Call for Papers geopend en daarmee de mogelijkheid om presentatievoorstellen in te schieten voor J-Fall. Hierover verderop meer info.

Voor de businesspartners was er op donder-dagavond 20 juni de mogelijkheid om een uitgebreide briefing te krijgen over het eve-nement. Vervolgens was er een rondleiding door de locatie en konden er opties geplaatst worden. Kon u er als businesspartner niet bij zijn, dan zal binnenkort de brochure worden toegestuurd en kunt u contact opnemen met Richelle Bussenius ([email protected]) voor deelname en sponsoring van J-Fall.

Bert ErtmanBestuurslid NLJUG

Bestuurscolumn.indd 36 09-07-13 12:23

Page 37: Java Magazine #2 - 2013

JAVA magazine | 02 2013

VAn het bestuur

Van het bestuurCall for PapersVanaf begin juli is het mogelijk om voorstel-len in te schieten voor de Call for Papers van J-Fall en dit kan tot uiterlijk 30 augustus. De binnenkomende papers zullen worden beoordeeld door de programmacommissie, die bestaat uit een mooie doorsnede van de Nederlandse Java Community. De commis-sie kent een negental deelnemers die veel ervaring hebben met het samenstellen van conferentieprogramma’s, niet alleen voor NLJUG conferenties, maar een aantal deel-nemers hebben die ervaring ook opgedaan bij de selectie van andere internationale conferenties, waaronder bijvoorbeeld GOTO, Devoxx en JavaOne. De conferentie kent net als vorig jaar de volgende tracks:< Cloud – Java in the cloud, PaaS, NoSQL,

Big Data en aanverwante onderwerpen;< Languages on the JVM – onderwerpen

die te maken hebben met alternatieve programmeertalen die draaien op de Java Virtual Machine;

< Core – onderwerpen met betrekking tot Java SE en/of aanverwante frameworks, libraries, of API’s;

< Enterprise – onderwerpen die te maken hebben met Java EE, of enterprise schaal toepassingen van Java, waaronder web development, architectuur, integratie, en/of SOA/BPM;

< Methodology – onderwerpen die te maken hebben met het software ontwikkelpro-ces;

< Tools – onderwerpen op het gebied van tools die een rol spelen bij het vervaardi-gen van Java gebaseerde applicaties, of die tot doel hebben onderdelen van het software ontwikkelproces te automatise-ren of te optimaliseren;

< Mobile & Embedded – onderwerpen over Java op mobiele apparaten, embedded devices, of real-time gebruik;

< New & Cool – onderwerpen die nieuwe, hippe toepassingen van Java illustreren, waaronder nieuwe technologie, of opmer-kelijke toepassingen van Java.

Het overgrote deel (70-80%) van de be-schikbare sessiesloten op J-Fall is beschik-baar voor de Call for Papers en zal worden verdeeld onder de beste, meest interes-sante en meest waardevolle ingezonden

voorstellen. Het kenmerk en de charme van de NLJUG conferenties is en blijft dat er na-drukkelijk ruimte is voor lokale sprekers die aan hun vakbroeders kunnen presenteren. In het programma van J-Fall is ruimte voor technische sessies (keynotes, presentaties, shoot-outs, case-studies, etc), hands-on labs en unconference (of open space) sessies. Het indienen van sessievoorstellen voor de Call for Papers kan uitsluitend via de Call for Papers applicatie (nljugcfp.appspot.com). Een vriendelijk ver-zoek: wacht alsjeblieft niet tot het laatste moment met het inschieten van je paper(s)! Om de organisatie grijze haren en billenknij-pen te besparen, weten we liever iets eerder dan een paar uur voor de deadline dat we ruimschoots in de papers zitten ;-). Tweede week september hopen we het definitieve programma te kunnen presenteren en niet lang daarna zal ook de registratie voor de conferentie open gaan.

eOuG summit 2013De NLJUG is er voor iedereen die de Ne-derlands Java community een warm hart toedraagt, maar de Java community stopt niet bij de landsgrens; in de hele wereld zijn er Java User Groups. En daarom is het goed en noodzakelijk om met andere JUG Leaders ervaringen uit te wisselen en van elkaar te leren. Oracle organiseert daarvoor op EMEA niveau eenmaal per jaar de European Oracle User Groups (EOUG) Summit. Deze bijeenkomst kent een mengeling van zowel Oracle (product georiënteerde) User Groups, als ook MySQL en Java User Groups. Dit jaar was de bijeenkomst georganiseerd in Gent (België), en heeft Bert Breeman namens het NLJUG bestuur deelgenomen. Gedurende het tweedaagse event zijn de voornaamste doelstellingen netwerken en kennis en erva-ring uitwisselen met de andere deelnemers. Oracle heeft vooral een faciliterende rol en de deelnemers bepalen vooral de inhoud. Daarnaast is er ruimte voor ‘quality time’ als JUG Leaders onder elkaar. Volgens Bert waren het intensieve, maar belangrijke dagen en heeft hij diverse ideeën opgedaan om mee terug te nemen naar de Nederland-se Java community.

het GOedenieuws is dAt de JAVA COmmunity in nederlAnd een flinke OPleVinG heeft

Bestuurscolumn.indd 37 09-07-13 12:24

Page 38: Java Magazine #2 - 2013

38

JAVA MAGAZINE

COLUMN

Meer met Maven In elke editie van het Java Magazine zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Maven, om meer inzicht te geven in Maven zelf en de vele beschikbare plugins.

Bestaat toeval? Ik had me voor deze editie voorgenomen om iets te vertellen over Java Compatibility en prompt wordt mijn collega geconfronteerd met het probleem dat ik wil beschrijven. Mijn collega heeft bovenstaand stukje code geschreven. De code compi-leert, alle unittesten en integratietesten slagen, dus wil hij het deployen op één van de WAS6 servers. Daar krijgt hij al snel een foutmelding: java.lang.NoSuchMethodE-xception: String.isEmpty(). Wat is er fout gegaan? In de pom wordt gebruik gemaakt van de meest recente maven-compiler-plu-gin, oftewel met de waarde 1.5 voor zowel <source> als <target>. Daarnaast heeft mijn collega JDK6 op zijn werkstation geïn-stalleerd, terwijl WAS6 nog met JDK5 werkt. Nu blijkt dat de String.isEmpty()-methode pas beschikbaar is sinds JDK6. De source/target parameters zijn dus erg misleidend: ze controleren weliswaar de syntax van de desbetreffende JDK-versie, maar niet de API signatures! De meest eenvoudige manier om dit te voorkomen, is door ervoor te zorgen dat er altijd gecompileerd wordt tegen de juiste JDK-versie. Daar zijn een aantal mogelijkheden voor:< Laat de JAVA_HOME omgevingsvariabele

verwijzen naar de vereiste JDK instal-

latie. Deze variabele gebruikt Maven om te draaien, maar wordt ook gebruikt als default voor de maven-compiler-plugin.

< Maak gebruik van de <executable>-pa-rameter van de maven-compiler-plugin. Hiermee kun je compileren tegen een andere JDK-versie dan waaronder Maven draait.

< Maak gebruik van Maven toolchains. In het kort komt het erop neer, dat je in je pom.xml de maven-toolchains-plugin opneemt, waarin je een tool met bijbe-horende versie configureert. In een apart bestand in je home-directory kun je voor verschillende tools en versies refereren naar een installatie directory op jouw systeem.

Het nadeel van elke bovenstaande oplos-sing is dat het extra handelingen vereist van de ontwikkelaar (installatie van de juiste JDK en het goed zetten van verwijzingen), terwijl Maven juist een soort ‘plug-and-play’-principe nastreeft. Vandaar dat mijn voorkeur uitgaat naar een project genaamd ‘Animal Sniffer’ van Codehaus Mojo. Dit project biedt de mogelijkheid om te contro-leren of de sources van jouw Java-project compatible zijn met een specifieke Java versie. ‘Animal’ verwijst naar de codenamen die Sun gebruikt voor de verschillende Java versies, welke vaak verwijzen naar dierenna-men. Denk bijvoorbeeld aan ‘Tiger’, ‘Mus-tang’ of ‘Dolphin’ . Voor Maven projecten biedt Animal Sniffer twee oplossingen: con-trole via de animal-sniffer-maven-plugin of via een enforcer-rule, die je kunt opnemen in de maven-enforcer-plugin. In beide geval-len komt het erop neer, dat je een keuze maakt uit 1 van ruim 20 beschikbare API-signatures. De signatures zijn onderverdeeld in JDK-versie en ‘vendor’, want ook daartus-sen kunnen nog verschillen zijn.

Met de Animal Sniffer heb ik ervoor gezorgd dat mijn code geen gebruik meer kan maken van nieuwere API signatures. Maar hoe zit dat met de dependencies? Ook daar-langs kunnen nog te nieuwe classes binnen glippen. Wederom biedt Codehaus Mojo een oplossing: de enforce-bytecode-version, één van de extra-enforcer-rules. Voor wie de melding ‘Bad version number in .class file’ herkent: de enforce-bytecode-version maakt gebruik van dezelfde techniek voor het bepalen van de Java compatibility.

Door gebruik te maken van zowel Animal Sniffer als de Enforce Bytecode Version Enforcer-rule kun je in ieder geval garan-deren dat elke build compatible is met de vastgestelde JDK-versie. <

public class Laffer{ public void check( String breathSpray ){ if ( breathSpray.isEmpty() ) { System.out.println( “Go to Quiki Mart” ); } }}

Robert ScholteIT Consultant voor CGI, teamlid van Apache Maven.

<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>animal-sniffer-maven-plugin</artifactId> <version>1.9</version>

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.2</version> <configuration> <rules> <enforceBytecodeVersion> <maxJdkVersion>1.5</maxJdkVer-sion> </enforceBytecodeVersion> </rules> </configuration> <dependencies> <dependency> <groupId>org.codehaus.mojo</grou-pId> <artifactId>extra-enforcer-rules</artifactId> <version>1.0-alpha-5</version> </dependency> </dependencies></plugin>

<configuration> <signature> <groupId>org.codehaus.mojo.signature</groupId> <artifactId>java15</artifac-tId> <version>1.0</version> </signature> </configuration> </plugin>

Column Maven.indd 38 09-07-13 12:24

Page 39: Java Magazine #2 - 2013

Bedankt!NLJUG bedankt haar business partners voor de samenwerking

Bedankpagina.indd 10 09-07-13 15:10

Page 40: Java Magazine #2 - 2013

DOE JIJ MEE? ORDINA RASPBERRY JAM

Bert van den Belt en Huub Jansen, directeuren Java Ordina

Techniek en innovatie spelen een steeds belangrijkere rol in het dagelijks leven vinden we bij Ordina. Om je te laten ervaren wat techniek kan betekenen, organiseren we regelmatig workshops, trainingen en presentaties. Zo ook weer binnenkort.

Ordina Raspberry Jam: 26 september 2013, Nieuwegein

Op 26 september organiseert Ordina de eerste Raspberry Jam in Nederland. Dit in navolging van succesvolle initiatieven wereld-wijd. Tijdens deze innovatieve, leerzame en vooral leuke dag leer je alles over de Raspberry Pi. Er zijn o.a. workshops, lezingen en demonstraties. Schrijf je in op www.ordina.nl/jam. Hier vind je ook meer informatie over het programma. Zien we je dan?

ordina.nl

ICT. MAAR DAN VOOR MENSEN

Untitled-3 1 4-7-2013 11:47:15