Maven – een eerste indruk

13 September 2006 22:14 Bas Piepers Java, Software beheer

Dit artikel wordt geschreven door een developer die slechts zeer beperkte ervaring heeft met tools zoals maven, tools die het leven van een programmeur makkelijk maken. Een uitdaging voor het schrijven van dit artikel ligt daarin toch iets zinnigs te schrijven over maven, zonder de broodnodige ervaring in de praktijk. Doel van dit artikel is een eerste indruk te geven in Maven.

Voor het uitschrijven van een advies of een tool als Maven wel of niet van belang is voor Finalist zou mijns inziens de beste aanpak zijn om Maven in een project te gebruiken. Voor mij is dat nog niet van toepassing geweest en dus blijft het bij een kleine ontdekkingreis aan de hand van een tutorial op http://maven.apache.org en documentatie over Maven.

Met maven structureer je een build proces van een project waarbij eigenlijk alle processen in een ontwikkeltraject kunnen worden meegenomen.

Vanuit een archtype, een template, wordt een project initieel aangemaakt, één en ander aan de hand van wat de gebruiker ingeeft. De directory structuur wordt aangemaakt waarin de root dir een pom.xml bestand staat. Dit bestand bevat alle belangrijke onderdelen van het project en van daaruit worden door maven taken uitgevoerd. Deze taken bestaan onder andere uit het compileren van source code, het testen van deze source code, het inpakken van bestanden in een jar, war of ear bestand en het deployen van de bestanden op een bepaalde locatie (lokaal of remote). In pom.xml staat ook de naam van het project, de url van de site van het project, versienummer, afhankelijkheden etc.

Met behulp van deze instellingen kunnen met een paar eenvoudige commando’s de diverse taken worden uitgevoerd. Met mvn compile wordt bijvoorbeeld de source gecompileerd. Indien nodig download maven dependencies van een locatie op het web en voert de taken uit. Dit kunnen bijvoorbeeld libraries zijn om tests te runnen met behulp van Junit. Commando’s kunnen onafhankelijk van elkaar worden uitgevoerd maar kunnen ook in combinatie worden uitgevoerd, zodat meerdere taken in één keer worden uitgevoerd. De meeste commando’s voeren op zichzelf overigens ook meerdere taken ineens uit. Met het commando mvn test wordt bijvoorbeeld eerst gekeken of er veranderingen hebben plaatsgevonden in het project; sourcecode die veranderd is wordt vervolgens eerst gecompileerd en daarna getest.

Verschillende pom.xml bestanden kunnen worden gecombineerd, waardoor meerdere projecten kunnen worden gebouwd, getest en gedeployed in één commando. Er is dan sprake van een parent pom.xml die uit een aantal modules bestaat. Acties worden vervolgens op alle deelprojecten uitgevoerd en op het parent project.

In eerste oog opslag vind ik Maven vooral bruikbaar voor niet te grote projecten. Bij xml bestanden, die je bij andere tools en frameworks ook veel tegenkomt (zoals Ant) verlies je mijns inziens al gauw het overzicht. Ook is een fout snel gemaakt bij de grote diversiteit aan tags die kunnen worden gebruikt in de pom.xml bestanden. Wanneer je Ant en Maven met elkaar vergelijkt zijn er overeenkomsten en één van de voorbeelden in de documentatie laat zien dat voor bepaalde build acties, je bij Maven veel minder regels xml nodig hebt dan bij Ant. Toch vereist het discipline de xml bestanden overzichtelijk te houden en vooral niet te lang te maken. Het mooie van Maven vind ik dat je meerdere tools kunt combineren in het build proces. Maven gaat uit van bepaalde conventies en afspraken. Zo wordt source code verwacht in ${basedir}/src/main/java, unit tests worden verwacht in ${basedir}/src/test/java. Door deze regels wordt structuur in een project aangebracht, iets wat ik ook een sterk punt vind van Maven. Concluderend vind ik Maven een goeie tool, project framework, die in mijn ogen zeer geschikt is voor kleine en middelgrote projecten. Bij grote projecten wordt het in mijn ogen foutgevoelig en onoverzichtelijk.

—————————————————————————————
Meer weten over Software beheer-specialist Finalist IT Group?

4 reacties »

  1. Voor grotere projecten vind ik een sterk punt van maven dat je je project in verschillende modules kunt opdelen die overerven van de een overkoepelend project model. Tevens vind ik de mogelijkheid om vanuit je pom een project voor bijvoorbeeld IntelliJ of Eclipse te kunnen genereren erg sterk.

    Het gebruik van een centrale repository zorgt er vaak ook voor dat je projecten wat kleiner kunt houden, zodat je ze als op zichzelf staande onderdelen in je dependencies kunt meenemen.

    Eigenlijk vind ik maven dus erg geschikt voor grotere project, ware het niet dat de laatste keer dat ik het persoonlijk gebruikte (REWA project) we tegen een aantal problemen aanliepen:

    - In sommige gevallen conflicteren de (transtieve) dependencies, kan lastig zijn
    - Veel plugins zijn ‘incomplete’ ports van ant taken, met minimale documentatie.
    - Buiten de pre-defined lifecycles werken kan lastig zijn
    - Het werken met verschillende JVM’s binnen een enkel project kan lastig zijn (dit komt natuurlijk niet voor, tot het toch inneens voor komt ;-) )

    De archetypes zijn overigens ook best cool. Het maken ervan kan veel tijd schelen, je kunt templates voor hele source bomen met files waarin onderdelen kunt parametriseren (denk aan de generators van rails). Het kost wat werk om dit uit te spitten maar dan heb je ook wat.

    peter maas September 14, 2006 10:29

  2. Ik kom nu in een project voor het eerst in de praktijk in aanraking met Maven. Nog niet echt actief, want de meeste zaken die Maven doet wordt door een script automatisch gedaan. Nog steeds zie ik het echte voordeel er niet van maar dat komt waarschijnlijk omdat ik eigenlijk alleen met de sourcecode bezig ben van het project. Ik hoop in de toekomst echt de functionaliteiten van Maven te mogen gebruiken in een project.

    Bas October 5, 2006 21:41

  3. Ik heb een paar dagen geleden een project omgeschakkeld naar Maven2. Dit koste me 3dagen (ik had niets van maven kennis, dus stap 1 was: google zoeken “wat is maven”).

    Pluspunten maven:
    - Standaard directory structuur
    - Gestructureerd build process
    - Site generatie met rapporten (een absolute MUST)
    - Oude ANT scripts kunnen hergebruikt worden
    - Eenvoudiger in gebruik dan ANT, maar wel moeilijker aan te leren
    - Artifact Dependancies, bv. Project a maakt gebruik van framework 1.2.7, project B maakt gebruik van framework 1.3.0

    Negatieve punten maven:
    - Plugin eclipse is bugy
    - Maven structuur wijkt af de standaard web application structuur, zodat de reloadable eigenschap van Tomcat niet gebruikt kan worden
    - Rapporten zijn nog niet volledige aangepast voor JDK1.5

    Pieter Pareit October 11, 2006 15:46

  4. Ik werk sinds kort in een project waar we min of meer gedwongen zijn Ant te gebruiken, maar ik dacht: Maven is goed in het ophalen van al je dependencies, dus dat wil ik het liefst niet met Ant doen (laat staan dat we alle dependencies in Subversion of CVS gaan zetten). Hiervoor bestaat een handig Maven project: Antlib for Maven 2.0 (http://maven.apache.org/ant-tasks).

    Ik ben helaas een beetje terug gekomen van mijn oorspronkelijke enthousiasme. Ik heb uiteindelijk alle dependencies een voor een toegevoegd aan mijn pom.xml, gecontroleerd welke transitieve dependencies er waren en voor sommige dependencies een hele lijst exclusions moeten definieren. Heeft me veel tijd gekost en nog steeds klopt niet alles. Zo zit ik met twee versies van log4j (1.2.12 en 1.2.13) en als ik spring-mock aan mijn pom.xml toevoeg, wordt de halve open-source wereld aan mijn project toegevoegd.

    Andere features van Maven heb ik nog nooit gebruikt, dus daar kan ik moeilijk een mening over hebben, maar transitieve dependencies vind ik niet optimaal.

    Ronald Wildenberg October 11, 2006 21:56

Reageer

RSS feed for comments on this post · TrackBack URI