Automatiserings- en ontwikkeltools behoren tot de belangrijkste onderdelen van elk project. In deze blog bespreken we Maven: een krachtige automatiseringstool voor Java-projecten. Maven vereenvoudigt het buildproces en zorgt voor een uniforme projectstructuur, waardoor projecten makkelijker te beheren en te begrijpen zijn. Deze blog behandelt vrijwel alles over Maven: van veelgebruikte commando's en opties tot technieken die je ontwikkelworkflow versnellen. We gaan in op Server- en containerbeheer, Source Control Management (SCM), en GPG voor het ondertekenen van artefacten. Daarnaast bekijken we gespecialiseerde commando's voor pluginbeheer, assembly en distributie, en het genereren van projectsites en rapporten. Aan het einde van deze gids heb je een goed begrip van Maven-commando's en -opties.
- Overzicht van Maven: projectlevenscyclus
- Afhankelijkheidsbeheer
- Uitvoering
- Server- en containerbeheer
- SCM (Bronbeheer)
- GPG (GNU Privacy Guard)
- Releasebeheer
- Archetype
- Plugin Beheer
- Samenstelling & Distributie
- Commando's voor sitegeneratie
- WAR- en JAR-commando's
- Rapportage
- Maak aanpassingen
- Conclusie
- Veelgestelde vragen
Overzicht van Maven: projectlevenscyclus
In het Jiddisch betekent het woord Maven 'verzamelaar van kennis'. Die betekenis verklaart treffend de kracht van Maven als automatiseringstool voor Java-projecten. Maven maakt het buildproces en projectbeheer eenvoudig door allerlei taken te automatiseren en een uniforme buildstructuur te bieden.
Om goed te begrijpen hoe Maven werkt, is het handig om het concept van een Project Object Model (POM)nader te bekijken. POM is een XML-bestand met informatie over het project en de bijbehorende configuratie. Maven gebruikt de POM als basis voor zijn werking. Hieruit haalt Maven de afhankelijkheden, builddirectory, brondirectory, testbrondirectory en doelen van het project.
Nadat je het project en zijn afhankelijkheden hebt gedefinieerd in de pom.xmlleest Maven bij elk commando dat je uitvoert het pom-bestand uit om de bijbehorende buildfase uit te voeren. Vanaf het moment dat je een project aanmaakt tot het moment van deployment doorloopt het een volledige levenscyclus. Die levenscyclus bepaalt de volgorde van fasen die je project doorloopt. Elke fase staat voor een stap in die cyclus en voert specifieke taken uit, zoals het compileren van broncode, het uitvoeren van tests en het verpakken van de code in een distribueerbaar formaat. Dit alles maakt de projectlevenscyclus van Maven een belangrijk concept om te begrijpen. Laten we de fasen van die levenscyclus nader bekijken:
- Valideren: In deze fase wordt gecontroleerd of het project correct is en alle benodigde informatie beschikbaar is.
- Compileren: In deze fase wordt de broncode van het project gecompileerd.
- Toets: In deze fase wordt de gecompileerde broncode getest met een geschikt unit-testframework.
- Verpakking: In deze fase wordt de gecompileerde code verpakt in het distribueerbare formaat (bijv. JAR, WAR).
- Installatie: In de installatiefase wordt het pakket geïnstalleerd in de lokale repository, zodat het beschikbaar is voor andere projecten op dezelfde machine.
- Implementeren: In deze fase wordt het definitieve pakket naar de externe repository gekopieerd, zodat andere ontwikkelaars en projecten er gebruik van kunnen maken.
Elke fase heeft een bijbehorend mvn-commando dat we in de volgende secties van onze Maven-cheatsheet behandelen. Dit zijn de belangrijkste commando's voor het beheren van het buildproces van je project.
Afhankelijkheidsbeheer
Een van de kernfuncties van Maven is afhankelijkheidsbeheer. Deze functie is zo belangrijk voor de werking van Maven omdat het eenvoudiger wordt om projectafhankelijkheden te beheren.
Hoe Maven afhankelijkheden beheert
Maven gebruikt een centrale repository, bekend als de Maven Centrale Opslagplaats, waar een groot aantal bibliotheken en plugins wordt gehost. Wanneer een project een afhankelijkheid nodig heeft, downloadt Maven automatisch de benodigde bibliotheken uit de centrale repository en slaat ze op in de lokale repository. Deze lokale repository is een cache op je lokale machine die downloadtijden voor toekomstige builds verkort.
Afhankelijkheden in Maven worden opgegeven in het pom.xml bestand, onder de sectie <dependencies> . Elke afhankelijkheid wordt gedefinieerd door een set coördinaten: groupId, artifactId, en version.
Afhankelijkheidsbereiken
Bij het werken met Maven kun je het bereik van afhankelijkheden opgeven. Dit bepaalt de zichtbaarheid op het classpath en de lifecycle-fase van de afhankelijkheid. Zo kun je zien in welke fase een bepaalde afhankelijkheid nodig is. De veelgebruikte bereiken zijn:
- Compileren: Dit is het standaardbereik en wordt gebruikt wanneer er geen bereik is opgegeven. Afhankelijkheden met dit bereik zijn beschikbaar in alle bouwfasen en worden opgenomen in het uiteindelijke pakket.
- Mits: Van afhankelijkheden met dit bereik wordt verwacht dat ze beschikbaar worden gesteld door de runtime-omgeving. Ze worden gebruikt tijdens compilatie, maar worden niet opgenomen in het uiteindelijke pakket.
- Uitvoeringstijd: Deze afhankelijkheden zijn niet nodig voor compilatie, maar zijn wel vereist tijdens uitvoering. Ze worden opgenomen in het runtime classpath.
- Toets: Deze afhankelijkheden zijn alleen nodig voor het compileren en uitvoeren van tests. Ze worden niet opgenomen in het runtime-omgeving of het uiteindelijke pakket.
- Systeem: Het system-bereik lijkt op het provided-bereik, maar je moet zelf de JAR aanleveren die Maven gebruikt. Die JAR moet aanwezig zijn in het systeempad.
Transitieve afhankelijkheden
Een van de sterke punten van Maven is dat het transitieve afhankelijkheden afhandelt. Wanneer een project een afhankelijkheid declareert, neemt Maven automatisch niet alleen die afhankelijkheid op, maar ook de afhankelijkheden daarvan, de afhankelijkheden van die afhankelijkheden, enzovoort. Deze keten van afhankelijkheden staat bekend als transitieve afhankelijkheden. Ter verduidelijking: stel dat je project afhankelijk is van spring-boot-starter-web, dan neemt Maven ook automatisch alle bibliotheken op waarvan spring-boot-starter-web afhankelijk is, zoals Spring Core, Spring MVC en Jackson.
Nu je de theorie kent van hoe Maven afhankelijkheden beheert, kijken we hoe je dit in de praktijk toepast:
mvn dependency:resolve
Dit commando lost alle afhankelijkheden van je project op en toont ze. Gebruik het om te zien van welke bibliotheken je project gebruikmaakt en om te controleren of alles klopt.
mvn dependency:tree
Met dit commando krijg je een boomstructuur van de afhankelijkheden van je project. Het toont hoe afhankelijkheden zich tot elkaar verhouden en helpt bij het opsporen van mogelijke conflicten.
mvn dependency:analyze
Dit commando analyseert de afhankelijkheden van je project om ongebruikte artefacten te vinden. Het helpt je project op te schonen en onnodige rommel te vermijden.
De functies voor afhankelijkheidsbeheer in Maven maken je ontwikkelproces eenvoudiger. Ze helpen je ook veelvoorkomende valkuilen te vermijden en een overzichtelijke, gestructureerde projectopzet te bewaren.
Uitvoering
Uitvoering in Maven houdt in dat specifieke taken of doelen binnen het project worden uitgevoerd. Die taken kunnen variëren van het uitvoeren van Java-programma's tot het aanroepen van externe scripts of commando's. Maven biedt krachtige plugins om deze uitvoeringen eenvoudig te maken. Dit is een andere eigenschap van Maven die het tot een uitstekend hulpmiddel maakt voor het automatiseren van verschillende onderdelen van je projectworkflow. Laten we de belangrijkste Maven-uitvoeringscommando's bekijken:
mvn exec:java
Dit commando wordt gebruikt om een Java-klasse in je project uit te voeren. Het is handig voor het starten van main-klassen of het testen van zelfstandige Java-programma's zonder ze eerst te pakketteren.
mvn exec:exec
Met dit commando kun je een extern programma of script vanuit de Maven-omgeving uitvoeren. Je kunt het gebruiken voor het starten van shellscripts, externe tools of andere programma's die deel uitmaken van je buildproces.
De uitvoeringscommando's in Maven helpen je bij het automatiseren van terugkerende taken. Je kunt ze ook gebruiken om externe tools en scripts te integreren in de Maven build lifecycle. Al met al helpen ze je taken veel efficiënter te beheren.
Server- en containerbeheer
Het beheren van servers en containers is een belangrijke fase in het ontwikkelen en uitrollen van webapplicaties. Maven vereenvoudigt dit proces met plugins waarmee je webapplicaties kunt starten, uitrollen en beheren op verschillende servers en containers, rechtstreeks vanuit je buildproces. Hier zijn enkele essentiële Maven-commando's voor het beheren van servers en containers:
mvn tomcat7:run
Dit commando start je webapplicatie met behulp van Apache Tomcat. Het is handig voor lokale ontwikkeling en het testen van je webapplicatie, zodat je snel kunt deployen zonder een volledige serveromgeving op te zetten.
mvn jetty:run
Dit commando start je webapplicatie via een veelgebruikte webserver: Jetty. Net als Tomcat is Jetty ideaal voor ontwikkeling en testen, dankzij de lichte opzet en snelle deployment.
Hoe server- en containerbeheer werkt
Maven gebruikt plugins zoals tomcat7-maven-plugin en jetty-maven-plugin om serverbeheer te automatiseren. Met deze plugins kun je servers starten, stoppen en configureren als onderdeel van je build lifecycle. Dit maakt het eenvoudiger om webapplicaties te ontwikkelen en te testen in een consistente omgeving. Door Maven-profielen te gebruiken voor serverinstellingen per omgeving, beheer je eenvoudig de configuraties voor ontwikkeling, testen en productie. Daarnaast kun je via serverplugins logging en monitoring instellen, zodat je serveractiviteit kunt bijhouden en problemen snel kunt oplossen.
SCM (Bronbeheer)
Versiebeheer via Source Control Management (SCM) is een essentieel onderdeel van elk ontwikkelproject. Ontwikkelteams gebruiken SCM om wijzigingen in de broncode bij te houden. Maven biedt een reeks commando's om te werken met SCM-systemen zoals Git, Subversion en anderen. Met deze commando's kun je taken automatiseren zoals code inchecken, uitchecken en projectversies bijwerken. Hieronder staan enkele belangrijke Maven SCM-commando's met hun opties:
mvn scm:checkin
Gebruik dit mvn-commando om projectwijzigingen in te checken in het SCM. Het automatiseert het commitproces, zodat de laatste wijzigingen worden opgeslagen en gedeeld met het team.
mvn scm:checkout
Dit Maven-commando checkt de projectcode uit het SCM-repository uit en geeft je een lokale kopie van het project. Zo werk je altijd met de meest recente versie van de broncode.
mvn scm:update
Dit mvn-commando synchroniseert je lokale werkkopie met de laatste wijzigingen uit het SCM-repository. Het zorgt ervoor dat je lokale codebase up-to-date is en alle nieuwe wijzigingen van andere teamleden bevat.
mvn scm:status
Dit mvn-commando toont de status van je lokale werkkopie ten opzichte van het SCM-repository. Het geeft een overzicht van alle lokale wijzigingen die nog niet zijn gecommit.
mvn scm:tag
Dit commando maakt een tag aan in het SCM-repository. Tags markeren specifieke punten in de projectgeschiedenis, zoals releases of belangrijke mijlpalen.
Maven SCM-commando's vereenvoudigen het beheer van je broncode aanzienlijk. Door deze commando's goed te gebruiken, werk je efficiënter en werk je beter samen binnen je ontwikkelteam.
GPG (GNU Privacy Guard)
GNU Privacy Guard (GPG) is cryptografische software waarmee gebruikers gegevens en communicatie kunnen versleutelen en ondertekenen. Binnen Maven wordt GPG gebruikt om artifacts te ondertekenen, zodat hun authenticiteit en integriteit gewaarborgd zijn. Dit is belangrijk bij het deployen van artifacts naar publieke repositories, omdat gebruikers hiermee kunnen controleren of de artifacts niet zijn gewijzigd. Maven biedt meerdere commando's voor GPG, waarmee je artifacts eenvoudig kunt ondertekenen en deployen. Enkele voorbeelden:
mvn gpg:sign
Gebruik dit Maven-commando om de artifacts van je project te ondertekenen met GPG. Ondertekende artifacts kunnen door anderen worden geverifieerd, wat een extra laag van beveiliging en vertrouwen biedt. Dit commando wordt vaak gebruikt tijdens het buildproces om JARs, WARs en andere artifacts te ondertekenen voor deployment.
mvn gpg:sign-and-deploy-file
Dit mvn-commando combineert het ondertekenen en deployen van een bestand in één stap. Gebruik het wanneer je een artifact direct wilt ondertekenen en deployen naar een repository, zonder tussenliggende stappen.
GPG-ondertekening integreren in je Maven-buildproces verhoogt de beveiliging en betrouwbaarheid van je software, zodat gebruikers je artifacts eenvoudiger kunnen vertrouwen en verifiëren.
Releasebeheer
Releasebeheer is een cruciaal onderdeel van softwareontwikkeling. Met een goede aanpak zorg je ervoor dat softwareversies correct worden beheerd, verpakt en gedeployed. Maven biedt een reeks commando's om het releaseproces te automatiseren en te stroomlijnen. Hieronder staan enkele voorbeelden van Maven-opties en commando's voor releasebeheer:
mvn release:prepare
Dit mvn-commando bereidt een project voor op een release. Het controleert of er geen ongecommitte wijzigingen zijn, werkt de versienummers bij in de pom.xml bestanden, maakt een tag aan in het SCM-systeem en werkt de pom.xml bestanden bij naar de volgende ontwikkelversie. Zo zorg je ervoor dat het project stabiel en klaar is voor release.
mvn release:perform
Dit commando voert het daadwerkelijke releaseproces uit. Het checkt het project uit het SCM op de tag die is aangemaakt door het release:prepare commando, bouwt het project en deployt de artifacts naar het opgegeven repository. Hierdoor worden de artifacts gebouwd vanuit de exacte staat van de code op het moment van de releasevoorbereidng.
mvn release:clean
Dit mvn-commando verwijdert alle back-upbestanden van release-descriptors die zijn aangemaakt tijdens het release:prepare proces. Het ruimt de omgeving op en zorgt ervoor dat er geen resterende bestanden zijn van eerdere releasepogingen, zodat je met een schone werkruimte verder kunt en problemen bij volgende releases worden voorkomen.
Release management-commando's stroomlijnen het releaseproces, verbeteren de softwarekwaliteit en zorgen voor een gestructureerde aanpak van elke release.
Archetype
Als je als ontwikkelaar projectstructuren wilt opzetten op basis van vooraf gedefinieerde sjablonen, is de Maven Archetype-plugin iets om te overwegen. Hieronder bespreken we de belangrijkste Maven-commando's voor archetypes.
mvn archetype:generate
Met dit mvn-commando maak je een nieuw project aan op basis van een bestaand sjabloon, ook wel een 'archetype' genoemd. Het commando begeleidt je bij het kiezen van een archetype en het configureren van het nieuwe project, zodat je direct een goed gestructureerd project hebt.
mvn archetype:catalog
Dit commando toont een overzicht van beschikbare archetypes waarmee je nieuwe projecten kunt genereren. Handig als je wilt verkennen welke sjablonen de Maven-community biedt en wilt bepalen welk archetype het beste bij jouw project past.
Met deze twee Maven-commando's zet je snel een nieuw project op. Of je nu een eenvoudige Java-applicatie of een complex enterprise-project start, Maven-archetypes bieden een solide vertrekpunt.
Plugin Beheer
Maven-plugins stellen ontwikkelaars in staat de functionaliteit van Maven uit te breiden en diverse taken binnen de build-lifecycle te automatiseren. Goed pluginbeheer zorgt ervoor dat je project onderhoudbaar blijft en builds reproduceerbaar zijn. In dit gedeelte behandelen we de belangrijkste Maven-commando's voor pluginbeheer.
mvn plugin:download
Dit commando downloadt een specifieke Maven-plugin uit de repository. Gebruik het wanneer je zeker wilt zijn dat een bepaalde plugin beschikbaar is in je lokale repository voordat je andere Maven-commando's uitvoert die ervan afhankelijk zijn.
mvn plugin:help
Dit Maven-commando toont uitgebreide informatie en documentatie over een specifieke Maven-plugin. Gebruik het wanneer je meer wilt weten over de beschikbare doelen, parameters en configuratieopties van een plugin.
Deze Maven-commando's voor pluginbeheer verbeteren het buildproces, automatiseren workflows en houden de kwaliteit en consistentie van je project op peil.
Samenstelling & Distributie
Met de assembly- en distributiefunctionaliteit van Maven kun je projecten verpakken in verschillende formaten voor verspreiding. Denk aan uitvoerbare JARs, gebundelde applicaties of aangepaste distributies inclusief afhankelijkheden en andere bronnen. Hieronder behandelen we de belangrijkste Maven-commando's voor assembly en distributie.
mvn assembly:assembly
Dit commando maakt een assembly aan voor het project. Een assembly is een distribueerbaar pakket dat binaries, broncode, afhankelijkheden en andere bronnen kan bevatten. Het commando gebruikt de Assembly Plugin om deze pakketten te genereren op basis van de opgegeven assembly-descriptor.
mvn assembly:directory
Dit mvn-commando bouwt de directorystructuur van de assembly op zonder het archiefbestand daadwerkelijk aan te maken. Dit is handig om de inhoud en structuur van de assembly te testen en te controleren voordat je het pakket aanmaakt.
Leren werken met de assembly- en distributiecommando's van Maven is een grote stap vooruit bij het verpakken en verspreiden van je applicaties.
Commando's voor sitegeneratie
De site-commando's van Maven zijn een uitstekende manier om projecten te documenteren. Ze genereren uitgebreide documentatiewebsites voor je projecten. Hieronder behandelen we de belangrijkste site-commando's en hun functies:
mvn site
Het commando mvn site genereert de sitedocumentatie van het project en bevat informatie zoals een projectsamenvatting, afhankelijkheidsrapporten, plugingebruik en meer.
mvn site:deploy
Met dit commando publiceer je de gegenereerde site naar een externe server. Handig als je de documentatie beschikbaar wilt maken voor een breder publiek, zoals teamleden of de buitenwereld.
mvn site:stage
Dit commando plaatst de site tijdelijk in een lokale map. Gebruik het om de site lokaal te bekijken voordat je hem naar de externe server publiceert.
Overzichtelijke en goed georganiseerde documentatie is onmisbaar bij de ontwikkeling van een project. Met het Maven site-commando heb je alles op één plek en verbeter je de communicatie binnen het ontwikkelteam.
WAR- en JAR-commando's
Als ontwikkelaar weet je maar al te goed hoe belangrijk het is om applicaties in verschillende formaten te kunnen verpakken. Maven stelt je in staat Java-applicaties te verpakken in diverse formaten, waaronder WAR (Web Application Archive) en JAR (Java Archive). Het belang van deze verpakkingsformaten wordt duidelijk wanneer je applicaties wilt deployen naar servers of bibliotheken wilt verspreiden. Hieronder behandelen we de belangrijkste mvn-commando's voor het genereren van WAR- en JAR-bestanden:
mvn war:war
Dit commando compileert je project en verpakt het als WAR-bestand. Wanneer je dit commando uitvoert, genereert Maven een WAR-bestand in de target-map van je project.
mvn jar:jar
Dit commando compileert je project en verpakt het als JAR-bestand in de target-map van je project.
Deze twee commando's ondersteunen je bij deployment en distributie. Gebruik ze om je Java-applicaties efficiënt te beheren en te verspreiden.
Rapportage
Elk softwareproject heeft gedetailleerde rapportages nodig om de voortgang bij te houden. Maven biedt krachtige plugins en mvn-commando's voor het genereren van uiteenlopende rapporten. In dit gedeelte behandelen we twee Maven-plugins die je kunt gebruiken voor rapportage: Surefire en JaCoCo.
Surefire Plugin
Deze plugin gebruik je voor het uitvoeren van unit tests in een Maven-project. Hij genereert gedetailleerde rapporten over de uitgevoerde tests, zodat je kunt verifiëren dat de code zich gedraagt zoals verwacht.
mvn surefire-report:report
Dit commando genereert een unit test-rapport in een formaat dat gemakkelijk te lezen en te analyseren is. Maven maakt hiermee een HTML-rapport aan in de target/site map van je project. Dit rapport bevat informatie over het aantal uitgevoerde, geslaagde en mislukte tests, inclusief gedetailleerde stack traces bij eventuele fouten.
JaCoCo-plugin
Je kunt deze plugin gebruiken om de codedekking door unit tests te meten en te rapporteren. Zo zorg je ervoor dat je tests de gehele codebase afdekken.
mvn jacoco:report
Als je wilt zien welke delen van de code wel en niet getest zijn, geeft dit commando je een codedekkinsgrapport. Het rapport dat dit commando aanmaakt is een HTML-rapport in de target/site/jacoco map, met gedetailleerde dekkingsstatistieken voor klassen, methoden en regels code.
Deze twee plugins helpen je testresultaten en codedekking bij te houden en geven je nuttige inzichten in de kwaliteit en gezondheid van je codebase.
Maak aanpassingen
Maven laat je de build aanpassen aan de specifieke eisen van je project. In dit gedeelte bespreken we hoe je Maven-profielen en eigenschapsdefinities gebruikt voor het aanpassen van de build.
Maven-profielen
Met Maven-profielen kun je verschillende configuraties voor je project definiëren, die geactiveerd kunnen worden op basis van factoren zoals systeemeigenschappen, omgevingsvariabelen of aangepaste voorwaarden. Zo kun je het buildproces aanpassen voor verschillende omgevingen, zoals ontwikkeling, testen en productie. Je kunt profielen definiëren in je pom.xml bestand, onder de sectie <profiles> sectie. De -p optie gevolgd door de profiel-ID activeert het profiel voor je.
Eigenschapdefinities
Maven-eigenschappen stellen je in staat waarden te definiëren die je door je hele pom.xml bestand kunt hergebruiken. Deze eigenschappen kunnen worden opgegeven in de pom.xml, via de opdrachtregel, of in externe eigenschapsbestanden. Je kunt eigenschappen definiëren in de <properties> gedeelte van uw pom.xml. Nadat je ze hebt gedefinieerd, kun je deze eigenschappen door het hele pom.xml bestand.
Het aanpassen van het buildproces in Maven helpt je je project af te stemmen op verschillende omgevingen en vereisten. Met profielen schakel je tussen verschillende buildconfiguraties, en met eigenschappen hergebruik en beheer je waarden efficiënt.
Conclusie
Deze blog gaf een uitgebreide introductie op Maven en leidde je stap voor stap door het ontwikkelen van een Java-applicatie. Als krachtig automatiseringsgereedschap voor Java-projecten beschikt Maven over diverse commando's en mogelijkheden voor elke fase van de ontwikkeling. Weten hoe je met deze commando's werkt en ze goed beheerst, maakt je ontwikkelproces aanzienlijk beter.
Veelgestelde vragen
Waarvoor wordt Maven gebruikt?
Maven is een build-automatiserings- en projectbeheertool voor Java-projecten. Het vereenvoudigt het buildproces, beheert projectafhankelijkheden en biedt een gestandaardiseerde projectstructuur. Maven ondersteunt ook projectdocumentatie, rapportage en distributie.
Wat is POM in Maven?
Maven is een tool die het buildproces en afhankelijkheidsbeheer voor Java-projecten automatiseert. POM (Project Object Model) is een XML-bestand in Maven dat informatie over het project en configuratiegegevens bevat die Maven gebruikt om het project te bouwen. Het POM-bestand definieert projectafhankelijkheden, plugins, doelen en andere buildconfiguraties.