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.xml
beskriver 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 makefile
och 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:
- Ladda ner den senaste Maven-versionen (Maven 3.6.3 när detta skrivs).
- Packa upp
apache.maven
zip-filen till en lämplig plats. - 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 mvn
kommandot. Skriv för mvn -v
att se till att du har installerat Maven.
The Maven POM
Roten till varje Maven-projekt är pom.xml
filen. 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.xml
liknar den i syfte Node NPM- package.json
filen.)
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
, artifactId
och 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å dependencies
avsnittet 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
, artifactId
och 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:
- Gör det tillgängligt lokalt.
- Publicera till ett privat förvaltat fjärrförvar.
- Publicera till ett molnbaserat privat arkiv.
- 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 install
kommandot.
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.xml
frå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 test
omfattning 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 /target
katalog. Det är standardplatsen för ditt projekts produktion. Beroenden som du har laddat ner finns i /target
katalogen 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.java
fil 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 /src
vä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 package
kommando 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 jar
så 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 test
när du är redo att köra enhetstester som du har definierat i /src/java/test
katalogen.
Ange mvn compile
nä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:run
kommandot - 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:generate
och skanna igenom alternativen för att hitta en arketyp som är lämplig för det du bygger.