Vad är Maven? Bygg- och beroendeshantering för Java

Apache Maven är en hörnsten i Java-utvecklingen och det mest använda verktyget för bygghantering för Java. Mavens strömlinjeformade, XML-baserade konfigurationsmodell gör det möjligt för utvecklare att snabbt beskriva eller förstå konturerna i alla Java-baserade projekt, vilket gör det enkelt att starta och dela nya projekt. Maven stöder också testdriven utveckling, långsiktigt projektunderhåll och dess deklarativa konfiguration och ett brett utbud av plugins gör det till ett populärt alternativ för CI / CD. Den här artikeln är en snabb introduktion till Maven, inklusive Maven POM och katalogstruktur, och kommandon för att bygga ditt första Maven-projekt.

Observera att den senaste Maven-versionen i skrivande stund är Maven 3.6.3.

Maven vs Ant och Gradle

Maven är inte det enda byggverktyget i Java-ekosystemet, även om det är det mest populära. Ant, en tidigare generation av XML-baserat konfigurationsverktyg, saknar Mavens standardiserade, konventionbaserade metoder och beroendeshantering, men erbjuder flexibilitet som du inte hittar med Maven. Gradle är ett nyare verktyg som körs ovanpå Mavens ekosystem (med Mavens arkiv), men stöder användning av en Groovy- eller Kotlin-baserad DSL för konfiguration. Alla tre är bra byggverktyg i sig och alla kan integreras i en CI / CD-process. Det som är viktigt är att välja rätt för dina behov och veta hur man använder den på rätt sätt.

Hur Maven fungerar

Liksom många bra verktyg tar Maven det som en gång var för komplicerat (konfigurationshelvete) och förenklar det till smältbara delar. Maven består av tre komponenter:

  • POM: Filen som beskriver ett Maven-projekt och dess beroenden.
  • Katalogen: Det standardiserade formatet för beskrivning av ett Maven-projekt i POM.
  • Förråd: Där programvara från tredje part lagras och upptäcks.

Maven POM : Varje Java-projekt som använder Maven har en POM-fil (projektobjektmodell) i sin rotkatalog. Det pom.xmlbeskriver projektets beroenden och berättar hur man bygger det. ( Beroenden är programvara från tredje part som krävs av projektet. Några vanliga exempel är JUnit och JDBC. Se Maven Central Repository för en lista över alla tillgängliga verktyg och populära beroenden.)

Maven-katalogen : Maven-katalogen implementerar det som kallas konvention över konfiguration , en elegant lösning på konfigurationshelvet. I stället för att kräva att utvecklare definierar layouten och handkonfigurerar komponenter för varje nytt projekt (som var fallet med makefileoch Ant), skapar Maven en gemensam projektstruktur och erbjuder ett standardfilformat för att beskriva hur det fungerar. Du kopplar bara in dina krav och Maven anropar beroenden och konfigurerar projektet åt dig.

Centraliserade arkiv : Slutligen använder Maven centraliserade arkiv för att både upptäcka och publicera projektpaket som beroenden. När du refererar till ett beroende i ditt projekt kommer Maven att upptäcka det i det centraliserade arkivet, ladda ner det till ett lokalt arkiv och installera det i ditt projekt. För det mesta är allt detta osynligt för dig som utvecklare.

Åtkomst till Maven-beroenden

Som standard löser Maven beroenden från Maven Central Repository. Ett vanligt alternativ är JCenter, som har en bredare uppsättning tillgängliga paket. Organisationer publicerar och är värd för interna förvar, som kan vara offentliga eller privata. För att få åtkomst till ett arkiv anger du dess URL i Maven POM, eller så kan du be Maven att leta i andra arkiv.

Installerar Maven

Maven är ett Java-projekt, så innan du installerar det måste du ha JDK installerat i din utvecklingsmiljö. (Se "Vad är JDK? Introduktion till Java Development Kit" för mer om nedladdning och installation av JDK.)

När du har konfigurerat din Java-utvecklingsmiljö kan du installera Maven i bara några steg:

  1. Ladda ner den senaste Maven-versionen (Maven 3.6.3 när detta skrivs).
  2. Packa upp apache.mavenzip-filen till en lämplig plats.
  3. Placera filen på din väg. Till exempel på ett Unix- eller Linux-system: export PATH=$PATH:/home/maven/.

Du bör nu ha tillgång till mvnkommandot. Skriv för mvn -vatt se till att du har installerat Maven.

The Maven POM

Roten till varje Maven-projekt är pom.xmlfilen. Trots sitt rykte för att vara tråkigt fungerar XML faktiskt ganska bra för detta användningsfall. Mavens POM är lätt att läsa och avslöjar mycket av vad som händer i ett projekt. (Om du har arbetat med JavaScript pom.xmlliknar den i syfte Node NPM- package.jsonfilen.)

Listning 1 visar en mycket enkel Maven pom.xml.

Listing 1. Simple Maven POM

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

Förstå Maven POM

När du väl har fattat det är POM inte mystisk. Till att börja med kan du skumma över XML-inledningen, som bara refererar till det officiella POM-schemat. Lägg dock märke till att XML börjar med modelVersion. Det berättar för Maven vilken version av POM som ska användas, i det här fallet Maven POM 4.0.0.

Därefter har du groupId, artifactIdoch version. Tillsammans identifierar dessa tre attribut varje Maven-hanterad resurs i förvaret unikt. Dessa attribut överst i filen beskriver ditt Maven-projekt.

Titta nu på dependenciesavsnittet i POM, där vi beskriver projektets beroenden. I det här fallet har vi hittills bara dragit in ett beroende, JUnit. Lägg märke till att JUnit också beskrivas i termer av dess groupId, artifactIdoch version.

Oavsett om du beskriver ditt eget projekt eller ett projektberoende berättar dessa värden Maven konsekvent var du hittar ett projekt i Maven-förvaret och vilken version som är tillgänglig för användning.

Värdar ditt projekt i ett Maven-arkiv

Tänk på att POM definierar allt ditt projekt behöver för att köra, men det beskriver också ditt projekt som ett potentiellt beroende. Om du bygger ett projekt som kommer att vara beroende - säg skapa ett bibliotek för andra projekt att använda - måste du göra det tillgängligt på ett av fyra sätt:

  1. Gör det tillgängligt lokalt.
  2. Publicera till ett privat förvaltat fjärrförvar.
  3. Publicera till ett molnbaserat privat arkiv.
  4. Publicera till ett offentligt arkiv som Maven Central.

I det första fallet använder du inte alls ett fjärranslutet. Istället kommer andra utvecklare att ladda ner och installera ditt projekt lokalt till sin Maven repo med mvn installkommandot.

I det andra fallet använder du ett Maven-arkiv som är värd och använder en privat kontrollerad server för att publicera och ladda ner beroenden. För detta behöver du en förvarshanterare, som Apache Archiva.

Ett nyare alternativ är att använda en privat fjärranslutning, men förlita sig på en molnbaserad tjänst för att hantera den, till exempel Cloudsmith. Detta ger fördelen med fjärrvärd beroenden utan arbete med att stå upp en reposerver. Den tjänsten kostar naturligtvis.

Slutligen kommer en liten andel av projekten att hamna i Central Maven Repository eller JCenter, som är avsedda för allmänt använda, offentliga paket. Om du skapar ett öppen källkodsberoende som ska användas av andra behöver du ett av dessa centraliserade arkiv för att göra ditt arbete tillgängligt för världen.

  • Lär dig mer om att vara värd för ditt projekt i ett Maven-arkiv och få en lista över tillgängliga arkiv.
  • Se den officiella Maven-dokumentationen om Maven Release Plugin, som används för att förbereda och hantera programvara som publiceras i ett Maven-arkiv.

Bygg Maven-paketet

Om du skapar pom.xmlfrån Listing 1 och placerar den i en katalog kan du köra Maven-kommandon mot den. Maven har en mängd kommandon, och fler finns tillgängliga via plugin, men du behöver bara veta en handfull för att starta.

För ditt första kommando, försök att utföra mvn package. Även om du inte har någon källkod ännu, kör kommandot Maven att ladda ner JUnit-beroendet. Du kan kontrollera Mavens loggningsutdata för att se att beroendet har laddats ..

Beroendets omfattning

Du kanske har märkt att JUnit-beroendet i exemplet POM är markerat som scope test. Omfattning är ett viktigt begrepp inom beroendestyrning, vilket i huvudsak låter dig definiera och begränsa hur varje beroendet ska anropas och användas i ditt projekt. Den testomfattning säkerställer beroendet är tillgänglig när du kör tester, men inte när appen är förpackad för utplacering.

Ett annat vanligt omfång är provided, som berättar ramverket att beroendet tillhandahålls av runtime-miljön. Detta ses ofta med Servlet JARS när det distribueras till en servletbehållare, eftersom behållaren kommer att ge dessa JARS. Se Apache Maven-dokumentationen för en fullständig lista över Maven-beroendets omfattning.

Mavens katalogstruktur

När kommandot är klart, märker du att Maven har skapat en /targetkatalog. Det är standardplatsen för ditt projekts produktion. Beroenden som du har laddat ner finns i /targetkatalogen tillsammans med dina kompilerade applikationsartefakter.

Därefter vill du lägga till en Java-fil som du placerar i Maven- src/katalogen. Skapa en /src/main/java/com/javaworld/Hello.javafil med innehållet i Listing 2.

Listing 2. Hello.java

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

Den /srcvägen är standard plats för din projektets källfiler. De flesta projekt lägger in sina huvudfiler /src/main/, med Java-filer som går in i klassvägen under /java. Dessutom kan du använda om du vill inkludera tillgångar som inte är kod, som konfigurationsfiler eller bilder /src/main/resources. Tillgångar i den här sökvägen läggs till i huvudklassvägen. Testfiler går in i /src/test/java.

För att granska, här är några viktiga delar av en Maven-projektstruktur (som definieras av Maven Standard Directory Structure):

Viktiga delar av Maven Standard Directory Structure

pom.xml Projektbeskrivningsfilen
/ src / main / java Plats för källfiler
/ src / main / resurser Plats för tillgångar som inte är källor
/ src / test / java Plats för testkällfiler
/mål Byggoutputens plats

Hantera ditt Maven-projekt

Det mvn packagekommando instruerar Maven att bunta ihop projektet. Utfärda det här kommandot när du är redo att samla alla dina projektfiler på ett ställe. Kom ihåg att i POM-filen för detta projekt ställer vi in ​​förpackningstypen jarså att det här kommandot säger till Maven att paketera applikationsfilerna till en JAR.

Maven erbjuder en mängd olika alternativ för att kontrollera hur JAR hanteras, oavsett om det är en fet eller tunn JAR, och specificera en körbar mainclass. Se Maven-dokumenten för att lära dig mer om filhantering i Maven.

När du har buntat ett projekt kommer du sannolikt att vilja ge ut ett mvn install. Detta kommando skjuter projektet till det lokala Maven-arkivet. När det väl finns i det lokala förvaret är det tillgängligt för andra Maven-projekt i ditt lokala system. Detta är användbart för utvecklingsscenarier där du och / eller ditt team skapar beroende JAR som ännu inte har publicerats i ett centralt arkiv.

Ytterligare Maven-kommandon

Ange mvn testnär du är redo att köra enhetstester som du har definierat i /src/java/testkatalogen.

Ange mvn compilenär du är redo att kompilera projektets klassfiler. Om du kör en hot-deploy-inställning utlöser det här kommandot hot-deploying class loader. (Hot-deploy-verktyget - som Spring Boot- mvn spring-boot:runkommandot - kommer att titta på klassfilerna för ändringar, och kompileringen kommer att göra att dina källfiler kompileras, och det körande programmet kommer att återspegla dessa ändringar.)

Startar ett nytt projekt: Arketyper i Maven och Spring

En Maven-arketyp är en mall för att starta nya projekt baserat på en mängd fördefinierade inställningar. Varje arketyp erbjuder förpackade beroenden, till exempel för ett Java EE- eller Java-webbapplikationsprojekt. Du kan också skapa en ny arketyp från ett befintligt projekt och sedan använda den för att snabbt skapa nya projekt baserat på de fördefinierade layouterna. Se Maven-dokumenten för att lära dig mer om Apache Maven-arketyper.

Spring-ramverket, som fungerar bra med Maven, erbjuder ytterligare, sofistikerade möjligheter för att stubb ut nya projekt. Som ett exempel är Spring Initializr ett verktyg som låter dig mycket snabbt definiera de element du vill ha i en ny app. Initializr är inte en Maven-arketyp i sig, men den tjänar samma syfte att generera en projektlayout baserat på specifikationer. Från Initializr kan du skriva mvn archetype:generateoch skanna igenom alternativen för att hitta en arketyp som är lämplig för det du bygger.

Lägg till beroenden