Apache Maven er en hjørnestein i Java-utvikling, og det mest brukte verktøyet for byggeadministrasjon for Java. Mavens strømlinjeformede, XML-baserte konfigurasjonsmodell gjør det mulig for utviklere å raskt beskrive eller forstå konturene til ethvert Java-basert prosjekt, noe som gjør det enkelt å starte og dele nye prosjekter. Maven støtter også testdrevet utvikling, langsiktig prosjektvedlikehold, og dens deklarative konfigurasjon og et bredt utvalg av plugins gjør det til et populært alternativ for CI / CD. Denne artikkelen er en rask introduksjon til Maven, inkludert Maven POM og katalogstruktur, og kommandoer for å bygge ditt første Maven-prosjekt.
Merk at den siste Maven-utgivelsen i skrivende stund er Maven 3.6.3.
Maven vs Ant og Gradle
Maven er ikke det eneste byggeverktøyet i Java-økosystemet, selv om det er det mest populære. Ant, en tidligere generasjon av XML-basert konfigurasjonsverktøy, mangler Mavens standardiserte, konvensjonsbaserte fremgangsmåter og avhengighetsadministrasjon, men tilbyr fleksibilitet du ikke finner med Maven. Gradle er et nyere verktøy som kjører på toppen av Maven-økosystemet (ved hjelp av Mavens repositories), men støtter bruk av en Groovy- eller Kotlin-basert DSL for konfigurasjon. Alle tre er gode byggeverktøy i seg selv, og hver kan integreres i en CI / CD-prosess. Det som betyr noe er å velge den rette for dine behov og vite hvordan du bruker den riktig.
Hvordan Maven fungerer
Som mange gode verktøy tar Maven det som en gang var overkomplisert (konfigurasjonshelvete) og forenkler det til fordøyelige deler. Maven består av tre komponenter:
- POM: Filen som beskriver et Maven-prosjekt og dets avhengighet.
- Katalogen: Det standardiserte formatet for beskrivelse av et Maven-prosjekt i POM.
- Repositories: Hvor tredjeparts programvare lagres og oppdages.
Maven POM: Hvert Java-prosjekt som bruker Maven har en POM-fil (prosjektobjektmodell) i rotkatalogen. De pom.xml
beskriver prosjektets avhengigheter og forteller deg hvordan du bygger det. (Avhengigheter er tredjeparts programvare som kreves av prosjektet. Noen vanlige eksempler er JUnit og JDBC. Se Maven Central Repository for en liste over alle tilgjengelige verktøy og populære avhengigheter.)
Maven-katalogen: Maven-katalogen implementerer det som kalles konvensjon over konfigurasjon, en elegant løsning på konfigurasjonshelvete. Snarere enn å kreve at utviklere definerer layout og håndkonfigurerer komponenter for hvert nye prosjekt (som det var tilfellet med makefile
og Ant), Maven innfører en felles prosjektstruktur og tilbyr et standard filformat for å beskrive hvordan det fungerer. Du kobler bare inn dine krav, og Maven kaller inn avhengigheter og konfigurerer prosjektet for deg.
Sentraliserte arkiver: Til slutt bruker Maven sentraliserte arkiver for både å oppdage og publisere prosjektpakker som avhengigheter. Når du refererer til en avhengighet i prosjektet ditt, vil Maven oppdage det i det sentraliserte depotet, laste det ned til et lokalt depot og installere det i prosjektet ditt. Mesteparten av tiden er alt dette usynlig for deg som utvikler.
Få tilgang til Maven-avhengigheter
Som standard løser Maven avhengigheter fra Maven Central Repository. Et vanlig alternativ er JCenter, som har et bredere sett med tilgjengelige pakker. Organisasjoner publiserer og vert også interne arkiver, som kan være offentlige eller private. For å få tilgang til et depot, spesifiserer du URL-en i Maven POM, eller du kan be Maven om å se i andre arkiver.
Installerer Maven
Maven er et Java-prosjekt, så før du installerer det, må du ha JDK installert i utviklingsmiljøet ditt. (Se "Hva er JDK? Introduksjon til Java Development Kit" for mer om nedlasting og installering av JDK.)
Når du har konfigurert Java-utviklingsmiljøet, kan du installere Maven i bare noen få trinn:
- Last ned den siste Maven-utgivelsen (Maven 3.6.3 når dette skrives).
- Pakk ut
apache.maven
.zip-fil til et praktisk sted. - Plasser filen på din vei. For eksempel på et Unix- eller Linux-system: eksport
PATH = $ PATH: / hjem / maven /
.
Du bør nå ha tilgang til mvn
kommando. Type mvn -v
for å sikre at du har installert Maven.
Maven POM
Roten til hvert Maven-prosjekt er pom.xml
fil. Til tross for sitt rykte for å være kjedelig, fungerer XML faktisk ganske bra for denne brukssaken. Mavens POM er lett å lese og avslører mye av det som skjer i et prosjekt. (Hvis du har jobbet med JavaScript, vil pom.xml
har samme formål som Node NPM pakke.json
fil.)
Oppføring 1 viser en veldig enkel Maven pom.xml
.
Oppføring 1. Simple Maven POM
4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar junit junit 4.12 test
Forstå Maven POM
Når du først har fått tak i det, er ikke POM mystisk. For å starte kan du skimme over XML-innledningen, som bare refererer til det offisielle POM-skjemaet. Legg merke til XML som begynner med modellversjon
, derimot. Det forteller Maven hvilken versjon av POM som skal brukes, i dette tilfellet Maven POM 4.0.0.
Neste, du har groupId
, artefaktId
, og versjon
. Til sammen identifiserer disse tre attributtene hver Maven-administrerte ressurs i depotet unikt. Disse attributtene øverst i filen beskriver Maven-prosjektet ditt.
Ta en titt på avhengigheter
delen av POM, hvor vi beskriver prosjektets avhengighet. I dette tilfellet har vi trukket inn bare en avhengighet så langt, JUnit. Legg merke til at JUnit også er beskrevet i form av dens groupId
, artefaktId
, og versjon
.
Enten du beskriver ditt eget prosjekt eller en prosjektavhengighet, forteller disse verdiene Maven konsekvent hvor du skal finne et prosjekt i Maven-arkivet, og hvilken versjon som er tilgjengelig for bruk.
Hosting prosjektet ditt i et Maven-depot
Husk at POM definerer alt prosjektet ditt trenger å kjøre, men det beskriver også prosjektet ditt som en potensiell avhengighet. Hvis du bygger et prosjekt som vil være en avhengighet - for eksempel å lage et bibliotek for andre prosjekter som skal brukes - må du gjøre det tilgjengelig på en av fire måter:
- Gjør den tilgjengelig lokalt.
- Publiser til et privat administrert eksternt arkiv.
- Publiser til et skybasert privat arkiv.
- Publiser til et offentlig arkiv som Maven Central.
I det første tilfellet bruker du ikke et eksternt lager i det hele tatt. I stedet vil andre utviklere laste ned og installere prosjektet lokalt til deres Maven repo, ved hjelp av mvn installere
kommando.
I det andre tilfellet bruker du et hostet Maven-arkiv, og bruker privat kontrollert server for å publisere og laste ned avhengigheter. For dette trenger du en depotleder, som Apache Archiva.
Et nyere alternativ er å bruke en privat ekstern repo, men stole på en skybasert tjeneste for å administrere den, for eksempel Cloudsmith. Dette gir fordelen med ekstern avhengighet uten arbeid med å stå opp en reposerver. Den tjenesten er selvfølgelig mot et gebyr.
Til slutt vil en liten prosentandel av prosjektene havne i Central Maven Repository eller JCenter, som er ment for mye brukte, offentlige pakker. Hvis du lager en avhengighet med åpen kildekode som skal brukes av andre, trenger du et av disse sentraliserte arkivene for å gjøre arbeidet ditt tilgjengelig for verden.
- Lær mer om å være vert for prosjektet ditt i et Maven-arkiv og få en liste over tilgjengelige arkiver.
- Se den offisielle Maven-dokumentasjonen om Maven Release Plugin, som brukes til å forberede og administrere programvare som er publisert i et Maven-arkiv.
Bygg Maven-pakken
Hvis du oppretter pom.xml
fra oppføring 1 og legg den i en katalog, vil du kunne kjøre Maven-kommandoer mot den. Maven har mange kommandoer, og flere er tilgjengelige via plugin, men du trenger bare å vite en håndfull for å starte.
Prøv å utføre for din første kommando mvn-pakke
. Selv om du ikke har noen kildekode ennå, utfører denne kommandoen Maven å laste ned JUnit-avhengigheten. Du kan sjekke Mavens loggoutput for å se at avhengigheten er lastet ..
Avhengighetsomfang
Du har kanskje lagt merke til at JUnit-avhengigheten i eksemplet POM er merket som omfangstest
. omfang er et viktig konsept i avhengighetsstyring, som i hovedsak lar deg definere og begrense hvordan hver avhengighet skal kalles og brukes i prosjektet ditt. De test
omfang sikrer at avhengigheten er tilgjengelig når du kjører tester, men ikke når appen er pakket for distribusjon.
Et annet vanlig omfang er sørget for
, som forteller rammeverket at avhengigheten er gitt av kjøretidsmiljøet. Dette sees ofte med Servlet JARS når du distribuerer til en servletcontainer, da containeren vil gi disse JARS. Se Apache Maven-dokumentasjonen for en komplett liste over Maven-avhengighetsomfang.
Mavens katalogstruktur
Når kommandoen er ferdig, legg merke til at Maven har opprettet en /mål
katalog. Det er standardplasseringen for prosjektets produksjon. Avhengigheter du har lastet ned ligger i /mål
katalog, sammen med dine kompilerte applikasjonsgjenstander.
Deretter vil du legge til en Java-fil som du vil plassere i Maven src /
katalog. Lage en /src/main/java/com/javaworld/Hello.java
fil, med innholdet i oppføring 2.
Oppføring 2. Hello.java
com.javaworld public class Hello {public static void main (String [] args) {System.out.println ("Hello, JavaWorld"); }}
De / src
banen er standard stedet for prosjektets kildefiler. De fleste prosjekter legger inn hovedfilene sine / src / main /
, med Java-filer som går inn på klassestien under / java
. I tillegg, hvis du vil inkludere eiendeler som er ikke kode, som konfigurasjonsfiler eller bilder, kan du bruke / src / main / resources
. Eiendeler i denne banen vil bli lagt til i hovedklassen. Testfiler går inn på / src / test / java
.
Her er noen viktige deler av en Maven-prosjektstruktur (som definert av Maven Standard Directory Structure):
Viktige deler av Maven Standard Directory Structure
pom.xml | Prosjektbeskrivelsesfilen |
/ src / main / java | Plassering av kildefiler |
/ src / main / resources | Plassering av ikke-kilde eiendeler |
/ src / test / java | Plassering av testkildefiler |
/mål | Plassering av byggeutgangen |
Administrere Maven-prosjektet ditt
De mvn-pakke
kommandoen instruerer Maven om å pakke sammen prosjektet. Gi ut denne kommandoen når du er klar til å samle alle prosjektfilene dine på ett sted. Husk at i POM-filen for dette prosjektet setter vi innpakningstypen til å være krukke
, så denne kommandoen forteller Maven å pakke applikasjonsfilene i en JAR.
Maven tilbyr en rekke tilleggsalternativer for å kontrollere hvordan JAR administreres, enten det er en tykk eller tynn JAR, og spesifisere en kjørbar hovedklasse
. Se Maven-dokumentene for å lære mer om filbehandling i Maven.
Etter at du har samlet et prosjekt, vil du sannsynligvis ønske å utstede et mvn installere
. Denne kommandoen skyver prosjektet inn i det lokale Maven-depotet. Når det er i det lokale depotet, er det tilgjengelig for andre Maven-prosjekter i ditt lokale system. Dette er nyttig for utviklingsscenarioer der du og / eller teamet ditt lager avhengighets-JARer som ennå ikke er publisert i et sentralt depot.
Flere Maven-kommandoer
Tast inn mvn test
når du er klar til å kjøre enhetstester du har definert i / src / java / test
katalog.
Tast inn mvn kompilere
når du er klar til å kompilere prosjektets klassefiler. Hvis du kjører et hot-deploy-oppsett, utløser denne kommandoen hot-deploying class loader. (Hot-deploy-verktøyet - som Spring Boot's mvn spring-boot: run
kommando - vil se på klassefilene for endringer, og kompilering vil føre til at kildefilene dine blir kompilert, og det kjørende programmet vil gjenspeile disse endringene.)
Starter et nytt prosjekt: Arketyper i Maven og Spring
EN Maven arketype er en mal for å starte nye prosjekter basert på en rekke forhåndsdefinerte innstillinger. Hver arketype tilbyr forhåndspakkede avhengigheter, for eksempel for et Java EE- eller Java-webapplikasjonsprosjekt. Du kan også opprette en ny arketype fra et eksisterende prosjekt, og deretter bruke den til å raskt opprette nye prosjekter basert på de forhåndsdefinerte oppsettene. Se Maven-dokumentene for å lære mer om Apache Maven-arketyper.
Spring-rammeverket, som fungerer bra med Maven, tilbyr ytterligere, sofistikerte muligheter for å stanse nye prosjekter. Som et eksempel er Spring Initializr et verktøy som lar deg raskt definere elementene du vil ha i en ny app. Initializr er ikke en Maven-arketype, i seg selv, men den tjener det samme formålet med å generere et prosjektoppsett basert på forhåndsspesifikasjoner. Fra Initializr kan du skrive mvn arketype: generer
og skann gjennom alternativene for å finne en arketype som passer for det du bygger.