In elke editie zal Robert Scholte een probleem voorleggen en deze oplossen met behulp van Apache Maven om meer inzicht te geven in Maven zelf en de vele beschikbare plugins.
Recentelijk mocht ik deelnemen aan een hands-on lab, waarbij Apache Maven als buildtool werd gebruikt. Echter verliep dit niet helemaal volgens wens, omdat bij de meeste deelnemers de local repository nog leeg was. Het gevolg was dat alle deelnemers via de WiFi alle benodigde artifacts probeerden binnen te halen van Maven Central. Je kunt je vast voorstellen, dat dit traag en onwerkbaar was en dat daardoor de meeste projecten niet gebouwd konden worden. Als alternatief werd bedacht om de local repository van de docent te verspreiden via een usb-stick. Toen echter bleek dat dit richting de 10GB ging, bleek ook deze optie onhaalbaar.
Voor alle workshops en hands-on labs geldt dat het beter is om van tevoren een artifact repository manager in te richten en bij voorkeur alvast te vullen met de te gebruiken artifacts. Als de sessie echter al begonnen is, is het vaak al te laat om dit nog op te zetten.
Als er geen tijd meer is voor een solide oplossing, dan kun je altijd nog gebruik maken van de mock-repository-manager, ontwikkeld door het Codehaus Mojo-team. Deze wordt voornamelijk gebruikt voor het testen van maven-plugins, maar kan tevens deze situatie redden. Deze plugin zal een Jetty webcontainer opstarten met een kleine webapp, die alle requests voor bestanden opvangt en deze onder andere vertaalt naar bestanden in zijn eigen local repository.
De plugin wordt als volgt gestart:
org.codehaus.mojo:mrm-maven-plugin:1.0-beta-2:run -Dmrm.port=8080
Listing 1
Als je het argument met de poort niet opgeeft, zal de plugin zelf zoeken naar een vrije poort. Tijdens het opstarten zal de plugin ook een URL tonen, waarvan een settings-mrm.xml gedownload kan worden. Dit kunnen alle deelnemers dan op hun eigen systeem plaatsen. De plugin geeft ook aan, hoe je gebruik kunt maken van deze settings.xml zonder je eigen systeem aan te passen:
mvn --settings settings-mrm.xml [phase|goal]
Listing 2
Tot op zekere hoogte kun je dit zelf testen. We kunnen proberen om een willekeurig project te bouwen met een schone, tijdelijke local repository. We starten de mock-repository-manager zoals hierboven aangegeven en voeren dan het volgende uit op een het project:
mvn --settings settings-mrm.xml verify -Dmaven.local.repo=/tmp-local-repo
Listing 3
Je zult zien dat Maven direct gaat downloaden en dat de tijdelijke local repository gevuld wordt. Hiermee heb je ook automatisch alle benodigde artifacts om dit project te kunnen bouwen (dit is een vraag, die ik regelmatig voorbij zie komen).
Wat je nog steeds zult moeten testen is of deze repository manager vanaf een andere machine te benaderen is. Met name firewalls, aan zowel de client- als de serverkant, kunnen ervoor zorgen dat de connectie geblokkeerd wordt. Dit blijft altijd een kwestie van goed configureren. Maar als dat probleem is verholpen, heb je toch vrij eenvoudig een lightweight repository manager in de lucht gebracht en kan de hands-on lab alsnog slagen.