Wat is Maven? Bouw- en afhankelijkheidsbeheer voor Java

Apache Maven is een hoeksteen van Java-ontwikkeling en de meest gebruikte tool voor buildbeheer voor Java. Maven's gestroomlijnde, op XML gebaseerde configuratiemodel stelt ontwikkelaars in staat om snel de contouren van elk op Java gebaseerd project te beschrijven of te begrijpen, waardoor het starten en delen van nieuwe projecten in een handomdraai is. Maven ondersteunt ook testgestuurde ontwikkeling, projectonderhoud op lange termijn, en de declaratieve configuratie en het brede scala aan plug-ins maken het een populaire optie voor CI / CD. Dit artikel is een korte inleiding tot Maven, inclusief de Maven POM en directorystructuur, en opdrachten voor het bouwen van je eerste Maven-project.

Merk op dat de meest recente uitgave van Maven op het moment van schrijven Maven 3.6.3 is.

Maven vs Ant en Gradle

Maven is niet de enige build-tool in het Java-ecosysteem, hoewel het de meest populaire is. Ant, een eerdere generatie van XML-gebaseerde configuratietool, mist Maven's gestandaardiseerde, op conventies gebaseerde praktijken en afhankelijkheidsbeheer, maar biedt wel flexibiliteit die je niet zult vinden met Maven. Gradle is een nieuwere tool die bovenop het Maven-ecosysteem draait (met behulp van Maven's repositories), maar ondersteunt het gebruik van een Groovy- of Kotlin-gebaseerde DSL voor configuratie. Alle drie zijn op zichzelf goede build-tools en elk kan worden geïntegreerd in een CI / CD-proces. Het gaat erom de juiste te kiezen voor uw behoeften en te weten hoe u deze op de juiste manier kunt gebruiken.

Hoe Maven werkt

Zoals veel geweldige tools, neemt Maven wat ooit te gecompliceerd was (configuratie-hel) en vereenvoudigt het tot verteerbare delen. Maven bestaat uit drie componenten:

  • De POM: het bestand dat een Maven-project en zijn afhankelijkheden beschrijft.
  • De directory: het gestandaardiseerde formaat voor het beschrijven van een Maven-project in de POM.
  • Repositories: waar software van derden wordt opgeslagen en ontdekt.

De Maven POM : elk Java-project dat Maven gebruikt, heeft een POM-bestand (projectobjectmodel) in de hoofdmap. Het pom.xmlbeschrijft de afhankelijkheden van het project en vertelt u hoe u het moet bouwen. ( Afhankelijkheden zijn software van derden die vereist is voor het project. Enkele veelvoorkomende voorbeelden zijn JUnit en JDBC. Zie de Maven Central Repository voor een lijst van alle beschikbare tools en populaire afhankelijkheden.)

De Maven-directory : de Maven-directory implementeert wat bekend staat als conventie over configuratie , een elegante oplossing voor de hel van de configuratie. In plaats van van ontwikkelaars te eisen dat ze de lay-out definiëren en componenten met de hand configureren voor elk nieuw project (zoals het geval was met makefileen Ant), stelt Maven een gemeenschappelijke projectstructuur in en biedt het een standaard bestandsformaat om te beschrijven hoe het werkt. U sluit gewoon uw vereisten aan en Maven roept afhankelijkheden op en configureert het project voor u.

Gecentraliseerde repositories : Ten slotte gebruikt Maven gecentraliseerde repositories om projectpakketten als afhankelijkheden te ontdekken en te publiceren. Wanneer u naar een afhankelijkheid in uw project verwijst, zal Maven deze in de gecentraliseerde repository ontdekken, deze naar een lokale repository downloaden en in uw project installeren. Dit alles is meestal onzichtbaar voor jou als ontwikkelaar.

Toegang krijgen tot Maven-afhankelijkheden

Standaard lost Maven afhankelijkheden op vanuit de Maven Central Repository. Een veelgebruikt alternatief is JCenter, dat een bredere set beschikbare pakketten heeft. Organisaties publiceren en hosten ook interne repositories, die openbaar of privé kunnen zijn. Om toegang te krijgen tot een repository, specificeert u de URL ervan in de Maven POM, of u kunt Maven instrueren om in andere repositories te zoeken.

Maven installeren

Maven is een Java-project, dus voordat u het installeert, moet u de JDK in uw ontwikkelomgeving hebben geïnstalleerd. (Zie "Wat is de JDK? Inleiding tot de Java Development Kit" voor meer informatie over het downloaden en installeren van de JDK.)

Zodra u uw Java-ontwikkelomgeving heeft ingesteld, kunt u Maven in slechts een paar stappen installeren:

  1. Download de nieuwste Maven-release (Maven 3.6.3 op het moment van schrijven).
  2. Pak het apache.maven.zip-bestand uit naar een geschikte plaats.
  3. Plaats dat bestand op uw pad. Bijvoorbeeld op een Unix- of Linux-systeem: export PATH=$PATH:/home/maven/.

U zou nu toegang moeten hebben tot de mvnopdracht. Typ mvn -vom er zeker van te zijn dat je Maven met succes hebt geïnstalleerd.

De Maven POM

De root van elk Maven-project is het pom.xmlbestand. Ondanks zijn reputatie als vervelend, werkt XML eigenlijk best goed voor dit gebruik. Maven's POM is gemakkelijk te lezen en onthult veel van wat er in een project gebeurt. (Als u met JavaScript hebt gewerkt, pom.xmlis het doel vergelijkbaar met het package.jsonbestand van Node NPM .)

Listing 1 toont een heel eenvoudige Maven pom.xml.

Lijst 1. Eenvoudige Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Inzicht in de Maven POM

Als je het eenmaal onder de knie hebt, is de POM niet mysterieus. Om te beginnen kunt u de XML-preambule doorlopen, die alleen verwijst naar het officiële POM-schema. Let echter op de XML die begint met modelVersion. Dat vertelt Maven welke versie van de POM moet worden gebruikt, in dit geval Maven POM 4.0.0.

Vervolgens moet je groupId, artifactIden version. Samen identificeren deze drie attributen op unieke wijze elke door Maven beheerde resource in de repository. Deze attributen bovenaan het bestand beschrijven uw Maven-project.

Bekijk nu het dependenciesgedeelte van de POM, waar we de afhankelijkheden van het project beschrijven. In dit geval hebben we tot nu toe slechts één afhankelijkheid ingetrokken, JUnit. Merk op dat JUnit ook beschreven in termen van groupId, artifactIden version.

Of u nu uw eigen project of een projectafhankelijkheid beschrijft, deze waarden vertellen Maven consequent waar een project in de Maven-repository te vinden is en welke versie beschikbaar is voor gebruik.

Uw project hosten in een Maven-repository

Houd er rekening mee dat de POM alles definieert wat uw project nodig heeft om uit te voeren, maar het beschrijft uw project ook als een mogelijke afhankelijkheid. Als u een project bouwt dat een afhankelijkheid zal zijn, bijvoorbeeld door een bibliotheek te maken die door andere projecten kan worden gebruikt, moet u deze op een van de vier manieren beschikbaar maken:

  1. Maak het lokaal beschikbaar.
  2. Publiceer naar een privé beheerde externe repository.
  3. Publiceer naar een cloudgebaseerde privérepository.
  4. Publiceer naar een openbare repository zoals Maven Central.

In het eerste geval gebruikt u helemaal geen externe repository. In plaats daarvan zullen andere ontwikkelaars uw project lokaal downloaden en installeren in hun Maven-opslagplaats met behulp van de mvn installopdracht.

In het tweede geval gebruikt u een gehoste Maven-repository, waarbij u een privé beheerde server gebruikt om afhankelijkheden te publiceren en te downloaden. Hiervoor heb je een repository manager nodig, zoals Apache Archiva.

Een nieuwer alternatief is om een ​​privéopslagplaats op afstand te gebruiken, maar voor het beheer ervan te vertrouwen op een cloudservice, bijvoorbeeld Cloudsmith. Dit geeft het voordeel van op afstand gehoste afhankelijkheden zonder het werk van een reposerver. Die service is natuurlijk tegen betaling.

Ten slotte komt een klein percentage van de projecten terecht in de Central Maven Repository of JCenter, die bedoeld zijn voor veelgebruikte, publieke pakketten. Als u een open-source afhankelijkheid creëert die door anderen kan worden gebruikt, heeft u een van deze gecentraliseerde opslagplaatsen nodig om uw werk beschikbaar te maken voor de wereld.

  • Lees meer over het hosten van uw project in een Maven-repository en ontvang een lijst met beschikbare repositories.
  • Zie de officiële Maven-documentatie over de Maven Release-plug-in, die wordt gebruikt om software voor te bereiden en te beheren die is gepubliceerd naar een Maven-repository.

Bouw het Maven-pakket

Als u de pom.xmluit lijst 1 maakt en deze in een map plaatst, kunt u er Maven-opdrachten tegen uitvoeren. Maven heeft een veelvoud aan commando's, en er zijn er meer beschikbaar via plug-in, maar je hoeft er maar een handvol te kennen om te beginnen.

Probeer voor uw eerste opdracht uit te voeren mvn package. Ook al heb je nog geen broncode, het uitvoeren van deze opdracht vertelt Maven om de JUnit-afhankelijkheid te downloaden. U kunt de logboekuitvoer van Maven controleren om te zien dat de afhankelijkheid is geladen.

Afhankelijkheidsbereik

Het is je misschien opgevallen dat de JUnit-afhankelijkheid in het voorbeeld POM is gemarkeerd als scope test. Scope is een belangrijk concept in afhankelijkheidsbeheer, waardoor u in wezen kunt definiëren en beperken hoe elke afhankelijkheid wordt aangeroepen en gebruikt in uw project. Het testbereik zorgt ervoor dat de afhankelijkheid beschikbaar is bij het uitvoeren van tests, maar niet wanneer de app is verpakt voor implementatie.

Een andere veel voorkomende scope is provided, die het raamwerk vertelt dat de afhankelijkheid wordt geleverd door de runtime-omgeving. Dit wordt vaak gezien bij de Servlet JARS bij implementatie in een servletcontainer, omdat de container die JARS zal leveren. Zie de Apache Maven-documentatie voor een volledige lijst met Maven-afhankelijkheidsbereiken.

Maven's directory-structuur

Merk op dat Maven een /targetdirectory heeft aangemaakt als de opdracht is voltooid . Dat is de standaardlocatie voor de output van uw project. Afhankelijkheden die u heeft gedownload, bevinden zich in de /targetdirectory, samen met uw gecompileerde toepassingsartefacten.

Vervolgens wil je een Java-bestand toevoegen, dat je in de Maven- src/directory plaatst . Maak een /src/main/java/com/javaworld/Hello.javabestand met de inhoud van listing 2.

Lijst 2. Hallo.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

Het /srcpad is de standaardlocatie voor de bronbestanden van uw project. De meeste projecten plaatsen hun hoofdbestanden in /src/main/, met Java-bestanden in het klassenpad onder /java. Als u items wilt opnemen die geen code zijn, zoals configuratiebestanden of afbeeldingen, kunt u /src/main/resources. Activa in dit pad worden toegevoegd aan het hoofdklassepad. Testbestanden gaan naar /src/test/java.

Hier zijn enkele belangrijke onderdelen van een Maven-projectstructuur (zoals gedefinieerd door de Maven Standard Directory Structure):

Belangrijkste onderdelen van de Maven Standard Directory Structure

pom.xml Het projectdescriptorbestand
/ src / main / java Locatie van bronbestanden
/ src / main / resources Locatie van niet-bronactiva
/ src / test / java Locatie van testbronbestanden
/doelwit Locatie van de build-uitvoer

Beheer van uw Maven-project

De mvn packageopdracht geeft Maven de opdracht om het project te bundelen. Geef deze opdracht uit wanneer u klaar bent om al uw projectbestanden op één plek te verzamelen. Bedenk dat we in het POM-bestand voor dit project het verpakkingstype hebben ingesteld op zijn jar, dus dit commando vertelt Maven om de toepassingsbestanden in een JAR te verpakken.

Maven biedt een verscheidenheid aan extra opties om te bepalen hoe de JAR wordt beheerd, of het nu een dikke of dunne JAR is, en om een ​​uitvoerbaar bestand te specificeren mainclass. Zie de Maven-documenten voor meer informatie over bestandsbeheer in Maven.

Nadat u een project heeft gebundeld, wilt u waarschijnlijk een mvn install. Deze opdracht pusht het project naar de lokale Maven-repository. Als het eenmaal in de lokale repository staat, is het beschikbaar voor andere Maven-projecten in uw lokale systeem. Dit is handig voor ontwikkelscenario's waarin u en / of uw team afhankelijkheids-JAR's maken die nog niet naar een centrale opslagplaats zijn gepubliceerd.

Aanvullende Maven-opdrachten

Voer in mvn testwanneer u klaar bent om unit-tests uit te voeren die u in de /src/java/testdirectory hebt gedefinieerd .

Voer in mvn compilewanneer u klaar bent om de klassebestanden van het project te compileren. Als u een hot-deploy-setup uitvoert, activeert deze opdracht de hot-deployment class-lader. (De hot-deploy-tool zal - net als het mvn spring-boot:runcommando van Spring Boot - de classfiles in de gaten houden op wijzigingen, en compileren zorgt ervoor dat je bronbestanden worden gecompileerd, en de actieve applicatie zal die wijzigingen weergeven.)

Een nieuw project starten: Archetypes in Maven en Spring

Een Maven-archetype is een sjabloon voor het opstarten van nieuwe projecten op basis van een verscheidenheid aan vooraf gedefinieerde instellingen. Elk archetype biedt voorverpakte afhankelijkheden, zoals voor een Java EE- of Java-webapplicatieproject. U kunt ook een nieuw archetype maken van een bestaand project en dit vervolgens gebruiken om snel nieuwe projecten te maken op basis van die vooraf gedefinieerde lay-outs. Zie de Maven-documenten voor meer informatie over Apache Maven-archetypen.

Het Spring-framework, dat goed samenwerkt met Maven, biedt extra, geavanceerde mogelijkheden om nieuwe projecten uit te schakelen. Spring Initializr is bijvoorbeeld een tool waarmee je heel snel de elementen kunt definiëren die je in een nieuwe app wilt. Initializr is niet per se een Maven-archetype, maar het dient hetzelfde doel als het genereren van een projectlay-out op basis van vooraf ingestelde specificaties. Vanuit Initializr kun je typen mvn archetype:generateen door de opties bladeren om een ​​archetype te vinden dat geschikt is voor wat je aan het bouwen bent.

Afhankelijkheden toevoegen