Page 1

juli/augustus 2013 nr. 2

MAGAZINE Onafhankelijk tijdschrift voor de Java-professional

Google en Java

hand in hand Features Gradle is klaar voor de enterprise cover.indd 1

Aan de slag met Android Studio

Highlights Google I/O 09-07-13 13:01


Je moet wel gek zijn om als Java-specialist bij CGI te werken. 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 recruitment.nl@cgi.com.

Experience the commitment ®

CGI Adv JavaSpec_210x275mm.indd Untitled-1 1 1

8-7-2013 04-07-13 11:59:07 11:08


voorwoord

Google is taking over 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 Wieleman Content manager Java Magazine ramon.wieleman@nljug.org

Colofon Java Magazine 02-2013 Content manager: Ramon Wieleman E-mail: ramon.wieleman@nljug.org Eindredactie: Lilian Krijt Auteurs: Jos Dirksen, Hans Riezebos, Joop Lanting, Hubert Klein Ikkink, Frans van Buul, Bert Jan Schrijver, 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: richelle.bussenius@nljug.org 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 NLJUG workshops en het JFALL congres. Het NLJUG is lid van het wereldwijde netwerk van JAVA user groups. Voor meer informatie of wilt u lid worden, zie www.nljug.org. Een nieuw lidmaatschap 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 telefoonnummer 023–5364401. Verhuisberichten of bezorgklachten kunt u doorgeven via www.hubstore.nl (Klantenservice). Abonnementenadministratie Ingrid van der Aar, Tanja Ekel, Brigitte Hetem

JAVA magazine | 02 2013

Voorwoord.indd 3

09-07-13 12:17


De voordelen van lidmaatschap • Gratis toegang tot J-Fall 2013 • Gratis toegang tot NLJUG University sessions • Gratis 4 maal per jaar het Java Magazine

SLECH,T5S0 39

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)

» Ga naar: www.nljug.org Java werf A4.indd 4

09-07-13 13:34


INHOUDSOPGAVE

Gradle is klaar voor de ‘enterprise’

14

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.

Google Dart De 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.

16

28 Devoxx4Kids Na 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 informatica. 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.

06

ANGULAR.JS De javascript library van Google

10

BOEKREVIEW Agile ALM

11

COLUMN Ziekenhuisbezoek

14

GRADLE is klaar voor de ‘enterprise’

16

GOOGLE DART The next web app platform?

22

CUCUMBER Effectief automatisch testen

28

DEVOXX4KIDS Techniek en informatica voor kinderen

29

LIBRARIES Libraries uitgelicht

30

AAN DE SLAG MET Android 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 info@nljug.org en wij nemen zo spoedig mogelijk contact met je op.

JAVA MAGAZINE | 02 2013

Inhoudsopgave.indd 3

09-07-13 12:17


06

Angular.js Een 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.

AngularJS is een javascript library, ontwikkeld door Google, waarmee je op een eenvoudige, 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 documents, 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 environment is extraordinarily expressive, readable, and quick to develop. Other frameworks deal with HTML’s shortcomings by either abstracting away HTML, CSS, and/or JavaScript or by providing an imperative way for manipulating the DOM. Neither of these address the root problem that HTML was not designed for dynamic views.” Om bovenstaande te bereiken biedt AngularJS 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 geschreven, applicatie logica. Dit klinkt allemaal erg abstract, maar als je kijkt naar het volgende voorbeeld zal het snel duidelijk worden hoe

AngularJS dit voor elkaar krijgt.

Jos Dirksen is enterpise architect bij Malmberg, een educatieve uitgever.   Jos heeft verschillende projecten met Angular uitgevoerd en schrijft hier ook regelmatig over op zijn website: www.smartjava.org.

Minimale AngularJS applicatie Dit voorbeeld bestaat uit drie bestanden: < i ndex.html: de web pagina die de verschillende scripts laadt <a  pp.js: bevat de javascript code die nodig is om de applicatie te ‘bootstrappen’ < c ontrollers.js: bevat de controllers die je vanuit de web pagina benadert Laten we beginnen met de index.html: 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>

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

JAVA magazine

Angular_2koloms.indd 6

09-07-13 12:26


ANGULAR.JS

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

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

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 komen 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 koppelen aan je pagina. AngularJS zal eerst bepalen welke controller hij moet raadplegen. In dit geval is dit

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 benaderen). 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-Seed Angular-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: jos@Joss-MacBook-Pro.local:~/git$ git clone https://github.com/angular/ angular-seed Cloning 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), done. jos@Joss-MacBook-Pro.local:~/ git$

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

Screenshot 1

Voor een compleet overzicht van de directives die beschikbaar zijn kun je kijken op de docs.angularjs.org/ api pagina. Het maken van eigen directives is ook eenvoudig. Voor meer informatie hierover; kijk op docs. angularjs.org/guide/directive. ng-repeat Het 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: 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” }]; ...

Directives

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

AngularJS komt met een groot aantal directives 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.

ng-show en ng-hide Met deze twee directives kun je conditioneel een gedeelte van je pagina verbergen of tonen:

JAVA MAGAZINE | 02 2013

Angular_2koloms.indd 7

09-07-13 12:26


08

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

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

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. Index.html: ... <p>Count: {{count}}</p> <input type=”button” ngclick=”increaseCount($event)” value=”click”/> ...

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

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 ngmouse* directives die AngularJS aanbiedt.

Services Met directives definieer je op een declaratieve 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 herbruikbare functionaliteit via dependcy injection beschikbaar stellen binnen je controller. De business logica die je binnen je web applicatie 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 service Als eerste heb je een service nodig: services.js: var DummyService = function() { this.doSomething = function() { console.log(‘doing something’) } }

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 hebben, zal deze ook bij de module geregistreerd moeten worden:

AngularJS biedt een erg flexibel MVC model, dat goed testbaar en eenvoudig te gebruiken is

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

Via de factory function op de module die je in het begin van dit artikel gemaakt hebt, kun je services registreren. In dit geval registreren 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 DummyService geïnstantieerd, en teruggegeven. Je kunt services op meerdere plekken gebruiken. Meestal zal je dit gebruiken vanuit een controller, een andere service of mogelijk een filter (die je verder in het artikel nog tegenkomt). In ons voorbeeld hebben we al een controller. Om de service vanuit die controller te gebruiken doe je het volgende:

JAVA magazine

Angular_2koloms.indd 8

09-07-13 12:27


ANGULAR.JS

controllers.js myApp.controller(‘JavaMagazi neController’, [‘$scope’,’dummy’, function (scope, dummy) { ... scope.callService = function() { dummy.doSomething(); } }]);

In de controller functie van onze module, die je gebruikt om een controller aan te maken, geef je de naam van een controller aan (JavaMagazineController) 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 controller function ‘function (scope, dummy)’ en AngularJS zorgt ervoor dat de juiste service wordt geïnjecteerd. Inject een service in een andere service Het kan ook zijn dat je in je eigen service gebruik wil maken van andere services. 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: app.js myApp.factory(‘dummy’, [‘$log’,function(log) { var dummy = new DummyService(log); return dummy; }]);

Hier geef je, op dezelfde manier als je eerder voor de controller hebt gedaan, de dependencies aan die je service verwacht. In dit geval willen we graag dat $log, een standaard AngularJS service, in de factory functie voor onze service geïnjecteerd wordt. De service implementatie verandert nu natuurlijk ook: services.js var DummyService = function(log) { this.doSomething =

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

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 logging, voor routering en vele andere. Op de AngularJS API site staat daar uitleg over: docs.angularjs.org/api/

Screenshot 2

Filters Het 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: app.js //src: http://docs.angularjs. org/guide/dev_guide.templates. filters.creating_filters myApp.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; } });

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: index.html ...

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

En het resultaat hiervan is te zien in screenshot 3.

Conclusie AngularJS 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 dependency injection model.In dit artikel heb ik slechts een heel klein gedeelte laten zien van wat er allemaal mogelijk 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 ontwikkelen. 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.

JAVA MAGAZINE | 02 2013

Angular_2koloms.indd 9

09-07-13 12:27


10

Boekbespreking

Boekbespreking Agile ALM, lightweight tools and agile strategies Michael 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. Hans Riezebos is software developer bij Luminis.

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

Indeling en samenvatting Het boek is opgezet in vier delen. Het eerste deel introduceert Agile ALM door uit te werken hoe software engineering geëvolueerd is naar Agile ALM, door het noemen van de bouwblokken zoals stakeholder focus, service oriëntatie, taakgebaseerde aanpak en configureerbare en pluggable systemen, door uit te leggen waarom het belangrijk is Agile strategieën te vormen binnen de ALM context: strategieë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 functionele aspecten van Agile ALM uit: hoe Scrum te gebruiken voor Release Management, in combinatie met het implementeren van task-based development met de hiervoor beschikbare toolchain alternatieven. Het derde deel van het boek gaat over

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

nuttige ‘example toolchains’ behandelt. 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!

Wordt de doelgroep bereikt Veel 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 achtergronden, 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

Referentie

Titel: Agile ALM, lightweight tools and agile strategies Auteur: Michael Hüttermann ISBN: 9781935182634 Uitgever: Manning

JAVA magazine

Boekreview.indd 10

09-07-13 12:18


Column

Ziekenhuisbezoek In 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. 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 ‘genezerikken’ sprak mij geruststellend toe: “zo knul, je krijgt een kapje over je gezicht en je zult niets voelen”. “Hoeveel is 7 maal 13?” Zzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzz ...“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 ‘resultaten’ 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 ziekenhuis, 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 Oosterpark. 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.

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.

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

Ben jij ook een Champions League speler

?

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

JAVA magazine | 02 2013 03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1

Column.indd 11

4/23/2013 5:24:44 PM

09-07-13 12:19


12

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 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.

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 Gradle Een 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 duidelijke 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 multiproject builds, waarbij het mogelijk is om afhankelijkheden 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

bevatten, maar bijvoorbeeld ook configuratie of nieuwe elementen toevoegen aan een build. Ook heeft Gradle ondersteuning voor dependency management en het gebruik van Maven/ Ivy repositories. Als laatste is er de Gradle wrapper, waarmee het mogelijk is om een eigen 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 uitvoeren 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 onderhoudbaarheid te krijgen van onze build scripts.

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.

Configuratie standaarden Als je binnen je organisatie bepaalde standaarden wilt doorvoeren voor de builds of de

JAVA magazine

Enterprise.indd 12

09-07-13 12:19


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 bijvoorbeeld mogelijk om te signaleren welke dependencies 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 dependencies er zijn en daarop ingrijpen. configurations { compile.incoming.afterResolve = { final jclDependencies = compile.resolvedConfiguration. resolvedArtifacts.findAll { it.moduleVersion.id.group == ‘commons-logging’ if (jclDependencies) { throw new Exception(“Found JCL dependencies ${jclDependencies*.moduleVersion*.id}”) } }

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 bepaalde dependencies voor elk project toevoegen. 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. package gradle.jdriven

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 laten voeren, door ze parallel uit te voeren. Een andere feature van Gradle die ervoor zorgt dat builds ook snel zijn. tasks.withType(Test) { // Ook nieuwe taken van type Test krijgen deze property maxParallelForks = project. numberOfForks } ext { numberOfForks = Math.max(2, (int) (Runtime.runtime.availableProcessors() / 2)) }

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

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’ } } }

}

Je kunt de plugin deployen naar de eigen dependency repository. Andere projecten kunnen dan de plugin gebruiken. Stel, het volgende Java project wil de plugin gebruiken, dan kunnen 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,

JAVA magazine | 02 2013

Enterprise.indd 13

09-07-13 12:19


14

welke later nog besproken wordt.

class JDrivenDependencies { private final Project project

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

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

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

DSL extensies Je 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 JDrivenDependencies, 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 support Gradle 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 compileert, 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 gebruiken om te bepalen of een taak up-to-date is of niet. In het volgende voorbeeld hebben we

}

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() }

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. version = ‘1.0’ task genVersionFile { ext { outputFile = new File(“$projectDir/VERSION”) } inputs.property ‘version’, project.version outputs.files outputFile doFirst { outputFile.text = project.version } }

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. $ gradle genVersionFile :genVersionFile BUILD SUCCESSFUL Total time: 4.069 secs $ gradle genVersionFile :genVersionFile UP-TO-DATE BUILD SUCCESSFUL Total time: 2.345 secs

JAVA magazine

Enterprise.indd 14

09-07-13 12:19


Gradle is klaar voor de enterprise

Multi-project builds In 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 afhankelijkheid 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 bouwen met de taak buildNeeded. Ook hier geldt weer de incremental build feature van Gradle, dus als er geen veranderingen zijn dan worden die projecten ook niet opnieuw gebouwd. 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. allprojects { apply plugin: ‘java’ } project(‘:impl’) { apply plugin: ‘groovy’ }

In de laatste versie van Gradle is ook de mogelijkheid 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 wrapper De 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 waaraan 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.

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.

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

Conclusie Gradle 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 multiproject builds. En uiteindelijk is het ook mogelijk 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 op gradle.org/downloads

JAVA magazine | 02 2013

Enterprise.indd 15

09-07-13 12:19


16

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 omstandigheden Google Dart (nog in beta status) een betere oplossing gaat worden.

JavaScript applicaties bouwen Om 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, mogelijkheden en browsers. Een technologie die

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 gebleven. JavaScript is duidelijk niet ontworpen om als basisplatform te dienen voor grote webapplicaties. Vanuit ‘maintainability-‘ en ‘testability-‘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

Teun Hakvoort is trainer bij Info Support en geeft training in Java technologie en ‘browser’ technologie zoals GWT, JavaScript en AngularJS. Figuur 1 Evolutie van het web (bron: evolutionoftheweb.com)

JAVA magazine

Google Dart.indd 16

09-07-13 12:19


Google dart

Figuur 2 Schematische weergave van het Dart 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 ontwikkeld worden met bijvoorbeeld Google Web Toolkit die Java-code compileert naar JavaScript (zodat alleen de ‘binaries’ JavaScript opleveren)? 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 programmeertaal: 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 ontwikkeltools: ‘the batteries are included’.

Dart platform Het Dart platform, weergegeven in figuur 2, bestaat uit verschillende onderdelen. Elk onderdeel wordt kort beschreven. De taal Dart is een op web-ontwikkeling gerichte taal die zowel clientals server side te gebruiken is. Dart code wordt geschreven in de ‘DartEditor’, een sterk vereenvoudigde 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 omgeving 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 JavaScript al klaar staat. 2. De code draait in een Dart virtual machine (VM), die zowel standalone kan draaien (server-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 filesysteem of een database te benaderen. De VM in

JAVA magazine | 02 2013

Google Dart.indd 17

09-07-13 12:19


18

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 Dart De 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 gemaakt 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 overerven 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 alleen middels String-based messages met elkaar kunnen communiceren. Dart heeft standaard ondersteuning om asynchroon te programmeren, kent generics, closures en operator overloading. 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-componenten 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 merken 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 Dartcode gecompileerd moet kunnen worden naar JavaScript. Anderzijds is het de vraag hoe deze hybride taal dan server-side gebruikt gaat worden. 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.

De problematische aspecten die JavaScript kent, zijn niet aanwezig in Dart

Libraries in Dart Voor 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 var language = “Dart”; print(“Current language: $language - ${language.toUpperCase()}”); var x = “<div>” //multiline string “hello world” “</div>”;

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

Voorbeeld 3 Gebruik van de cascade operator

JAVA magazine

Google Dart.indd 18

09-07-13 12:19


Google dart

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 Logger) 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 afhankelijkheden 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 maintainability zal de mogelijkheid om libraries te kunnen definiëren en te kunnen versioneren direct als groot voordeel ervaren worden. Zeker met de integratie 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 Machine Waarom 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 applicatie 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 gebruikerservaring 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 kunnen draaien.

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

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 functies debug(msg) => print(“DEBUG: $msg”); warn(msg) => print(“WARN: $msg”); info(msg) => print(“INFO: $msg”);

Voorbeeld 4: Voorbeeld van library in Dart name: NlJugApp version: 3.2.1 description: A sample NLJUG Dart application dependencies: json_object: 1.0.0 browser: git: https://github.com/teunh/dart web_ui: any dev_dependencies: unittest: ‘>=0.6.0’

Voorbeeld 5: Pubspec.yaml

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 (gecompileerd 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.

Wil je aan de slag met Dart?

Ga naar dartlang.org, download de SDK en IDE en go Dart!

Advertentie

Ben jij ook een Champions League speler

?

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

JAVA magazine | 02 2013 03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1

Google Dart.indd 19

4/23/2013 5:24:44 PM

09-07-13 12:20


Ben jij ook een

Champions League s

Bekijk dan de volgende vacatures • • • • •

Junior en Senior Java Software Developer Java Integratie Specialist Java Solution Architect Open Source Developer Open Source Architect

03-021.13a_Advertisement_JavaMagazine_420x275_v1_220413.indd Untitled-1 2 1

29-4-2013 10:09:36


?

e speler

Meer informatie kijk op www.werkenbijcapgemini.nl of neem contact op met: Kees Heerschap Recruitment Manager Tel. 31 6 4609 3926 I E-mail: kees.heerschap@capgemini.com

Untitled-1 3

4/24/2013 29-4-201312:36:55 10:09:36PM


22

Effectief automatisch testen met Cucumber Als 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 functioneren van een product. Als een testmethodiek 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 unittesten Voordat we inzoomen op Cucumber, is het goed eens wat dieper te kijken waarom de effectiviteit van JUnit-tests vaak teleurstellend 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 unittest 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 onafhankelijk worden en minder breekbaar bij wijzigingen 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 gebruikersfunctionaliteit. 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 container doet van alles op basis van configuratie/ annotaties bij de code (denk aan objectrelational mapping, webservices, transactionaliteit), 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 ontwikkelomgeving kan goed geconfigureerd zijn, terwijl de acceptatie-omgeving een fout bevat. 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 productiviteit op langere termijn op peil te hou-

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

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

JAVA magazine

Effectief testen.indd 22

09-07-13 12:20


effectief automatisch testen

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 ondersteunen, terwijl unittests de kosten van onderhoud 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 webservice? 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!

en aansluit bij de Scrum manier van werken. Je kunt zo’n testscript daarom ook makkelijk bespreken met een projectmanager of functioneel ontwerper en daarmee je specificaties valideren. Maar hoe kan dit uitvoerbaar zijn? De magie zit in de door Cucumber gebruikte uitbreidbare ‘domain specific language’ (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: Functionaliteit: Inloggen Als 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 inloggen Als ik naar de startpagina ga Dan zie ik het inlogscherm Als ik username ‘frans’ invul En ik password ‘geheim’ invul En op ‘inloggen’ klik Dan ben ik ingelogd als gebruiker ‘frans’

Cucumber: een overzicht Cucumber is een testtool uit de Ruby-wereld. In de kern biedt Cucumber de mogelijkheid 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 conferenties 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 Cucumbertestscript ziet er bijvoorbeeld als volgt uit: Het mooie is dat dit er heel natuurlijk uitziet

Het woord ‘scenario’ betekent voor Cucumber 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-perspectief 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: Inloggen Als 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 inloggen Als ik naar de startpagina ga Dan zie ik het inlogscherm Als ik username ‘frans’ invul En ik password ‘geheim’ invul En op ‘inloggen’ klik Dan ben ik ingelogd als gebruiker ‘frans’

JAVA magazine | 02 2013

Effectief testen.indd 23

09-07-13 12:20


24

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 geschreven) met annotaties. In de implementatie moet je zelf iets schrijven wat de teststap implementeert. Voorbeeld: @Als(“ik naar de startpagina ga”) void ik_naar_de_startpagina_ga() { /* We gebruiken hier Selenium WebDriver om de stap te implementeren. */ WebDriver driver = new FirefoxDriver(); driver.get(“http://localhost:8080”);

}

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: @Als(“ik username ‘(.*)’ invul”) void ik_username_invul(String username) { WebDriver driver = new FirefoxDriver(); WebElement element = driver. findElement(By.name(“username”)); element.sendKeys(username); }

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 zichzelf 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 nietprogrammeurs worden uitgevoerd! Het eindresultaat van een Cucumber-run is een testrapportage (zie hieronder). Het standaard testrapport lijkt sterk op de testscripts.

De stappen krijgen een achtergrondkleur: groen als het goed is, rood als het fout gegaan 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 testrapport. Wellicht is je opgevallen dat een deel van de informatie in het testscript niet werd gebruikt bij testuitvoering, zoals de beschrijving 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. Functionaliteit: Inloggen Als 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 inloggen Als ik naar de startpagina ga Dan zie ik het inlogscherm Als ik username ‘frans’ invul En ik password ‘geheim’ invul Dan ben ik ingelogd als gebruiker ‘frans’

Relatie met andere tools Cucumber is een tool die één ding goed doet, namelijk een structuur bieden voor het maken 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 gemakkelijkst is om de JUnit-runner voor Cucumber te gebruiken, dan kan vervolgens iedere omgeving die met JUnit overweg kan ook met Cucumber overweg. Bijvoorbeeld een Mavenbuild met de Surefire-plugin, die je dan weer kunt aansturen vanuit een continuous-integration omgeving als Jenkins. Aan de andere kant moeten de teststappen geïmplementeerd worden. Hier kun je gebruiken wat je wilt. Wij gebruiken veel Selenium WebDriver voor browser-tests, Apache HttpComponents 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, bijvoorbeeld ‘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-programmeurs worden uitgevoerd!

JAVA magazine

Effectief testen.indd 24

09-07-13 12:20


effectief automatisch testen

bijvoorbeeld ook prima mogelijk zijn om de Java-API van Sikuli (Java Magazine 2013-1) te gebruiken om browser-tests te implementeren. Een tool die een beetje in dezelfde hoek zit als Cucumber, is FitNesse. Deze tool is ook geschikt voor het maken van leesbare, 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 eenvoudiger concept.

Praktijkervaringen en conclusies Dankzij 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 omgevallen. 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 integratieachtige 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

voor gemaakt. Refactoren is gewoon onderdeel van het dagelijks werk, zoals het hoort. De leesbaarheid van de Cucumber-testscripts 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-rapportages 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 verschillende 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 deployments. 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 Cucumber dus zeer positief. Geautomatiseerd testen levert nu eindelijk de voordelen op die altijd zijn beloofd.

Referenties

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

Advertentie

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 recruitment.nl@cgi.com.

Experience the commitment ®

JAVA magazine | 02 2013 CGI Adv JavaSpec_105x37mm.indd 1

Effectief testen.indd 25

03-07-13 15:27

09-07-13 12:20


26

Goede start Devoxx4Kids in Nederland Na 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.

Eelco Meuter lid redactiecommissie Java Magazine.

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 quadcopter 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 Arduino De eerste opdracht was het aansturen van componenten met een ‘Arduino’. Een Arduino is een microcontroller met een aantal I/O-componenten. Je kan er een programma opzetten via een USB-kabel. De kinderen kregen eerst een korte uitleg over een stroomkring en weerstanden. 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 schakelingen 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 verschillende LED-jes aan, zodat de lampjes in de goede volgorde aan- en uitgaan. Tijdens het laden van

JAVA magazine

Devoxx.indd 26

09-07-13 12:21


Devoxx4kids

de programma’s op de Arduino kregen de kinderen uitleg wat er nu precies gebeurde.

Lego Mindstorms Na een goed verzorgde lunch met veel lekkere broodjes was het tijd voor de tweede opdracht. Er stonden een aantal Lego NXT Mindstorms-robotjes 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.

Scratch In de laatste opdracht gingen de kinderen aan de slag met ‘Scratch’. Dit is een open source- ontwikkelomgeving 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

JAVA magazine | 02 2013

Devoxx.indd 27

09-07-13 12:21


28

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 moeilijker 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 opmerking 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 ouder weinig anders dan glimlachen en concluderen dat de dag een groot succes was! Terugkijkend op deze dag werkt het enthousiasme en de nieuwsgierigheid van de kinderen

aanstekend en inspirerend. Ik hoop dat dit soort initiatieven vaker gaan plaatsvinden. Informatica 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: #devoxx4kids Website: devoxx.com/ display/4KIDSNL/Home Video: vimeo. com/67959779

Advertentie

Maak krachtig gebruik van de Oracle database! Transfer Solutions, Specialist in Oracle- en Java EE advies, consulting en opleidingen. T 0345 - 616 888 E info@transfer-solutions.com

www.transfer-solutions.com

JAVA magazine

Devoxx.indd 28

09-07-13 12:21


Libraries uitgelicht

Libraries uitgelicht Logback Logback 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.

Jackson Wanneer je een lichtgewicht gegevensformaat nodig hebt voor bijvoorbeeld de communicatie 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 manier 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.

Retrofit Voor 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 ontsluit 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 vertaling 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. Advertentie

Ben jij ook een Champions League speler

?

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

JAVA magazine | 02 2013 03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1

Libraries uitgelicht.indd 27

4/23/2013 5:24:44 PM

09-07-13 12:40


30

Aan de slag met Android Studio Voor 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 IDEA

Gradle buildsysteem

Het bedrijf Jetbrains produceert al geruime tijd verschillende ontwikkelomgevingen voor diverse 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 functionaliteiten: Version Control via diverse plugins, Groovy en Java ondersteuning, refactoring en SmartType: intelligente code completion (zie afbeelding 1). Ook ondersteunt IntelliJ ‘language injection’: de IDE is op de hoogte dat een String-representatie een andere taal voorstelt, bijvoorbeeld XML of een reguliere expressie (zie afbeelding 2). IntelliJ biedt dus een solide basis. We gaan nu kijken welke features Google hieraan heeft toegevoegd in Android Studio.

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 management, 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

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).

Overzicht features Android 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 TranslationManager De 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.

Afbeelding 1: SmartType begrijpt welke klassen Random inherit.

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

JAVA MAGAZINE

Android Studio.indd 30

09-07-13 12:22


AAN DE SLAG MET ANDROID STUDIO

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

voorbeeld van deze flexibiliteit is het werken met ‘productFlavors’, die gebruikt worden in combinatie met ‘buildTypes’ om verschillende ‘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 opstarten 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 alphaversie extra permissies in te zetten die niet van toepassing zijn voor de overige varianten. De IDE markeert ter verduidelijking de bijbehorende (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 package suffix krijgt: android.buildTypes.each { type -> type.packageNameSuffix = “.$type.name” }

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 varianten. Dit kan ook specifieker: ‘assembleFreeDebug’ (aFD) zorgt voor het packagen van de gratis debug-variant uit ons voorbeeld. < Check: dit commando start bijvoorbeeld code quality tooling op (indien geconfigureerd). < 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 preview

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

Dit 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

JAVA MAGAZINE | 02 2013

Android Studio.indd 31

09-07-13 12:22


32

Layout preview met een XML-fout.

Layout preview met device frames.

String folding en icoon-presentatie.

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 foutbestendig; 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.

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

Code editor Tijdens 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 integration Google 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 ontwikkelen 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 webapplicatie die op AppEngine draait.

ADT Translation manager Voor 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

Conclusie Naast 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 verstandige 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 AppEngine cloud endpoints integratie had Google wat mij betreft weg kunnen laten. In plaats hiervan had een generieke client/server oplossing 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!

REFERENTIES

Android Studio: developer.android.com/sdk/installing/studio.html IntelliJ 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 configuratiescript, in tegenstelling tot XML-configuratie van de meer traditionele systemen. http://gradle.org http://tools.android.com/tech-docs/new-build-system/user-guide http://developers.google.com/events/io/sessions/32523664

JAVA MAGAZINE

Android Studio.indd 32

09-07-13 12:22


Highlights Google I/O

Highlights Google I/O We’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 mogelijkheden die wij als ontwikkelaars nu, of binnen 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 Android 2.2 en hoger worden toegevoegd. Een stortvloed aan nieuwe API’s maken het mogelijk om tot nu toe geavanceerde 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 komen 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 Microsoft, zal naar alle waarschijnlijkheid meebewegen. Dat betekent, dat eindgebruikers 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 gemiddeld platform-team bij Google levert maandelijks nieuwe features op, soms nog sneller. Niet alles past zelfs meer in

I/O: voor Glass worden aparte developerevents 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 migratie van Eclipse naar IntelliJ. Een agressievere 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.

Sfeerimpressie Google 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 verschillende 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

JAVA magazine | 02 2013

Highlight Google.indd 33

09-07-13 12:23


34

De grootste aankondiging was die van Android Studio: een nieuwe IDE voor Android development

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 SLklasse te kunnen zitten! De keynote liet alle bijzondere kenmerken die we gedurende 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 Studio Android heeft opnieuw een spectaculaire 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 voorlopig 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 volgen. Veel van de features die getoond zijn (multi-screen layout editing, Android Lint) waren ook al in Eclipse aanwezig en werden vooral gedemonstreerd om te laten zien dat Android Studio al in een redelijk complete vorm beschikbaar 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 bruikbaar is en het in sommige opzichten al beter werkt, moet je voorlopig nog wel fouten en ruwe randjes accepteren.

Google Play Services Vanuit 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 Console De 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. Hiermee kan met minder risico een nieuwe versie van de app in productie worden genomen. 

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

JAVA magazine

Highlight Google.indd 34

09-07-13 12:23


Highlights Google I/O

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 ondersteuning 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 functionaliteiten 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. Webapplicaties 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 templating. 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 kennen 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 Apps Chrome Packaged Apps werden aangekondigd op Google I/O 2012 en ook dit jaar is er veel aandacht uitgegaan naar deze mogelijkheid om met webtechnologieë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 besturingssysteem worden geregeld, zoals notificaties 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.

Google kopstukken, zoals Sergey Brin, waren regelmatig op de conferentievloer te vinden.

Sander de Groot Java Ontwikkelaar bij Info Support

Conclusie Alles 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 komende jaren nog veel meer verwachten. Nog even aftellen tot I/O 2014!

Peter Hendriks IT Architect bij Info Support Advertentie

Ben jij ook een Champions League speler

?

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

JAVA magazine

JAVA magazine | 02 2013 03-021.13b_Advertisement_JavaMagazine_105x37_v1_220413.indd 1

Highlight Google.indd 35

4/23/2013 5:24:44 PM

09-07-13 12:23


36

Van het bestuur Een 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 verslag van de EOUC bijeenkomst in Gent.

Community momentum In 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 overgenomen. 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.

Bestuursuitbreiding Na de businesspartner meeting en de oproep in de vorige bestuurscolumn in Java Magazine, hebben zich diverse kandidaten gemeld voor een functie in het nieuwe NLJUG stichtingsbestuur. Na (op volgorde van aanmelding) met verschillende kandidaten gesprekken te hebben gevoerd, kan ik melden dat we

twee nieuwe bestuursleden hebben gevonden 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.

Bert Ertman Bestuurslid NLJUG

J-Fall 2013 Rond 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 enthousiasme van afgelopen jaar evenaren en misschien 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 donderdagavond 20 juni de mogelijkheid om een uitgebreide briefing te krijgen over het evenement. 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 (richelle.bussenius@nljug.org) voor deelname en sponsoring van J-Fall.

JAVA MAGAZINE

Bestuurscolumn.indd 36

09-07-13 12:23


Van het bestuur

Call for Papers Vanaf begin juli is het mogelijk om voorstellen 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 commissie kent een negental deelnemers die veel ervaring hebben met het samenstellen van conferentieprogramma’s, niet alleen voor NLJUG conferenties, maar een aantal deelnemers 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: <C  loud – Java in the cloud, PaaS, NoSQL, Big Data en aanverwante onderwerpen; <L  anguages on the JVM – onderwerpen die te maken hebben met alternatieve programmeertalen die draaien op de Java Virtual Machine; <C  ore – onderwerpen met betrekking tot Java SE en/of aanverwante frameworks, libraries, of API’s; <E  nterprise – onderwerpen die te maken hebben met Java EE, of enterprise schaal toepassingen van Java, waaronder web development, architectuur, integratie, en/ of SOA/BPM; <M  ethodology – onderwerpen die te maken hebben met het software ontwikkelproces; <T  ools – onderwerpen op het gebied van tools die een rol spelen bij het vervaardigen van Java gebaseerde applicaties, of die tot doel hebben onderdelen van het software ontwikkelproces te automatiseren of te optimaliseren; <M  obile & Embedded – onderwerpen over Java op mobiele apparaten, embedded devices, of real-time gebruik; <N  ew & Cool – onderwerpen die nieuwe, hippe toepassingen van Java illustreren, waaronder nieuwe technologie, of opmerkelijke toepassingen van Java. Het overgrote deel (70-80%) van de beschikbare sessiesloten op J-Fall is beschikbaar voor de Call for Papers en zal worden verdeeld onder de beste, meest interessante en meest waardevolle ingezonden

voorstellen. Het kenmerk en de charme van de NLJUG conferenties is en blijft dat er nadrukkelijk 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 verzoek: wacht alsjeblieft niet tot het laatste moment met het inschieten van je paper(s)! Om de organisatie grijze haren en billenknijpen 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.

Het goede nieuws is dat de Java community in Nederland een flinke opleving heeft

EOUG Summit 2013 De NLJUG is er voor iedereen die de Nederlands 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 ervaring 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 Nederlandse Java community.

JAVA magazine | 02 2013

Bestuurscolumn.indd 37

09-07-13 12:24


38

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. Robert Scholte IT Consultant voor CGI, teamlid van Apache Maven.

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

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 compileert, 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.NoSuchMethodException: String.isEmpty(). Wat is er fout gegaan? In de pom wordt gebruik gemaakt van de meest recente maven-compiler-plugin, oftewel met de waarde 1.5 voor zowel <source> als <target>. Daarnaast heeft mijn collega JDK6 op zijn werkstation geïnstalleerd, 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>-parameter 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 bijbehorende 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 oplossing 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-andplay’-principe nastreeft. Vandaar dat mijn voorkeur uitgaat naar een project genaamd ‘Animal Sniffer’ van Codehaus Mojo. Dit project biedt de mogelijkheid om te controleren 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 dierennamen. Denk bijvoorbeeld aan ‘Tiger’, ‘Mustang’ of ‘Dolphin’ . Voor Maven projecten biedt Animal Sniffer twee oplossingen: controle via de animal-sniffer-maven-plugin of via een enforcer-rule, die je kunt opnemen in de maven-enforcer-plugin. In beide gevallen komt het erop neer, dat je een keuze maakt uit 1 van ruim 20 beschikbare APIsignatures. De signatures zijn onderverdeeld in JDK-versie en ‘vendor’, want ook daartussen kunnen nog verschillen zijn. <plugin> <groupId>org.codehaus.mojo</ groupId> <artifactId>animal-sniffermaven-plugin</artifactId> <version>1.9</version>

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

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 daarlangs 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. <plugin> <groupId>org.apache.maven.plugins</ groupId> <artifactId>maven-enforcer-plugin</ artifactId> <version>1.2</version> <configuration> <rules> <enforceBytecodeVersion> <maxJdkVersion>1.5</maxJdkVersion> </enforceBytecodeVersion> </rules> </configuration> <dependencies> <dependency> <groupId>org.codehaus.mojo</groupId> <artifactId>extra-enforcer-rules</ artifactId> <version>1.0-alpha-5</version> </dependency> </dependencies> </plugin>

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

JAVA MAGAZINE

Column Maven.indd 38

09-07-13 12:24


Bedankt!

NLJUG bedankt haar business partners voor de samenwerking

Bedankpagina.indd 10

09-07-13 15:10


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 wereldwijd. 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?

ICT. MAAR DAN VOOR MENSEN ordina.nl

Untitled-3 1

4-7-2013 11:47:15

Java Magazine #2 - 2013  

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

Advertisement