Vodič za Apache Maven

1. Uvod

Izgradnja softverskog projekta obično se sastoji od zadataka kao što su preuzimanje ovisnosti, stavljanje dodatnih staklenki na put predavanja, sastavljanje izvornog koda u binarni kôd, izvođenje testova, pakiranje prevedenog koda u raspoložive artefakte kao što su JAR, WAR i ZIP datoteke i postavljanje tih artefakata na poslužitelj aplikacija ili spremište.

Apache Maven automatizira ove zadatke, umanjujući rizik od pogrešaka ljudi prilikom ručne izrade softvera i odvajajući rad na prikupljanju i pakiranju našeg koda od rada na izradi koda.

U ovom uputstvu istražit ćemo ovaj moćan alat za opisivanje, izgradnju i upravljanje Java softverskim projektima koristeći središnju informaciju - Projektni objektni model (POM) - to je napisano u XML-u.

2. Zašto koristiti Maven?

Ključne značajke Mavena su:

  • jednostavno postavljanje projekta koje slijedi najbolje prakse: Maven pokušava izbjeći što je više moguće konfiguracije, isporučujući predloške projekata (imenovanih arhetipovi)
  • upravljanje ovisnostima: uključuje automatsko ažuriranje, preuzimanje i provjeru kompatibilnosti, kao i izvještavanje o zatvaranju ovisnosti (poznato i kao prijelazne ovisnosti)
  • izolacija između ovisnosti o projektu i dodataka: s Mavenom, ovisnosti o projektu se preuzimaju iz spremišta ovisnosti dok se ovisnosti bilo kojeg dodatka dohvaćaju iz spremišta dodataka, što rezultira manjim brojem sukoba kada dodaci počnu preuzimati dodatne ovisnosti
  • središnji sustav spremišta: ovisnosti o projektu mogu se učitati iz lokalnog datotečnog sustava ili javnih spremišta, kao što je Maven Central
Da biste saznali kako instalirati Maven na vaš sustav, pogledajte ovaj vodič na Baeldungu.

3. Projektni objektni model

Konfiguracija projekta Maven vrši se putem a Projektni objektni model (POM), koju predstavlja a pom.xml datoteka. The POM opisuje projekt, upravlja ovisnostima i konfigurira dodatke za izgradnju softvera.

The POM također definira odnose među modulima višemoduljskih projekata. Pogledajmo osnovnu strukturu tipičnog POM datoteka:

 4.0.0 org.baeldung org.baeldung jar 1.0-SNAPSHOT org.baeldung //maven.apache.org junit junit 4.12 test // ... 

Pogledajmo pobliže ove konstrukcije.

3.1. Identifikatori projekta

Maven koristi skup identifikatora, koji se nazivaju i koordinatama, kako bi jedinstveno identificirao projekt i odredio kako treba spakirati artefakt projekta:

  • groupId - jedinstveno osnovno ime tvrtke ili grupe koja je kreirala projekt
  • artefaktId - jedinstveni naziv projekta
  • verzija - inačica projekta
  • ambalaža - način pakiranja (npr. RAT/JAR/ZIP)

Prva tri od njih (groupId: artefaktId: verzija) kombiniraju se kako bi oblikovali jedinstveni identifikator i mehanizam su kojim određujete koje će verzije vanjskih knjižnica (npr. JAR-ove) koristiti vaš projekt.

3.2. Ovisnosti

Te vanjske knjižnice koje projekt koristi nazivaju se ovisnostima. Značajka upravljanja ovisnostima u Mavenu osigurava automatsko preuzimanje tih knjižnica iz središnjeg spremišta, tako da ih ne morate pohraniti lokalno.

Ovo je ključna značajka Mavena i pruža sljedeće prednosti:

  • koristi manje prostora za pohranu značajnim smanjenjem broja preuzimanja s udaljenih spremišta
  • ubrzava provjeru projekta
  • pruža učinkovitu platformu za razmjenu binarnih artefakata unutar vaše organizacije i izvan nje, bez potrebe za gradnjom artefakta svaki put

Da biste proglasili ovisnost o vanjskoj knjižnici, morate navesti groupId, artefaktId, i verzija knjižnice. Pogledajmo primjer:

 org.springframework opruga-jezgra 4.3.5.OSLOBOĐENJE 

Kako Maven obrađuje ovisnosti, preuzet će knjižnicu Spring Core u vaše lokalno spremište Maven.

3.3. Spremišta

Spremište u Mavenu koristi se za čuvanje artefakata gradnje i ovisnosti različitih vrsta. Zadani lokalni repozitorij nalazi se u .m2 / spremište mapu ispod početnog direktorija korisnika.

Ako su artefakt ili dodatak dostupni u lokalnom spremištu, Maven ih koristi. Inače se preuzima iz središnjeg spremišta i pohranjuje u lokalno spremište. Zadani središnji repozitorij je Maven Central.

Neke knjižnice, poput JBoss poslužitelja, nisu dostupne u središnjem spremištu, ali su dostupne u zamjenskom spremištu. Za te knjižnice trebate navesti URL alternativnog spremišta unutar pom.xml datoteka:

  Spremište JBoss //repository.jboss.org/nexus/content/groups/public/ 

Imajte na umu da u svojim projektima možete koristiti više spremišta.

3.4. Svojstva

Prilagođena svojstva mogu vam pomoći da napravite svoj pom.xml datoteka lakša za čitanje i održavanje. U klasičnom slučaju korištenja koristili biste prilagođena svojstva za definiranje verzija ovisnosti vašeg projekta.

Svojstva Maven rezerviraju vrijednost i dostupna su bilo gdje u a pom.xml uporabom notacije $ {name}, gdje Ime je vlasništvo.

Pogledajmo primjer:

 4.3.5.OBLAŽENJE org.springframework spring-core $ {spring.version} org.springframework spring-context $ {spring.version} 

Sada ako želite nadograditi Spring na noviju verziju, morate samo promijeniti vrijednost unutaroznaka svojstva i sve ovisnosti koje koriste to svojstvo u svom oznake će se ažurirati.

Svojstva se također često koriste za definiranje varijabli puta gradnje:

 $ {project.build.directory} / tmp / // ... $ {project.resources.build.folder} // ... 

3.5. Izgraditi

The izgraditi odjeljak je također vrlo važan dio Mavena POM. Pruža informacije o zadanom Mavenu cilj, direktorij za sastavljeni projekt i konačno ime aplikacije. Zadana vrijednost izgraditi odjeljak izgleda ovako:

 instalirati $ {basedir} / target $ {artifactId} - $ {version} filters / filter1.properties // ... 

Zadana je izlazna mapa za prevedene artefakte cilj, a konačni naziv pakiranog artefakta sastoji se od artefaktId i verzija, ali možete ga promijeniti u bilo kojem trenutku.

3.6. Koristeći Profili

Još jedna važna značajka Mavena je podrška za profili. A profil je u osnovi skup vrijednosti konfiguracije. Pomoću profili, možete prilagoditi izradu za različita okruženja kao što su Proizvodnja / Test / Razvoj:

  proizvodnja // ... razvoj istina // ... 

Kao što možete vidjeti u gornjem primjeru, zadani profil postavljen je na razvoj. Ako želite pokrenuti proizvodnja profil, možete koristiti sljedeću Mavenovu naredbu:

mvn čista instalacija -Produkcija

4. Maven gradi životne cikluse

Svaka Mavenova izrada slijedi određeno životni ciklus. Možete izvršiti nekoliko gradnji životni ciklusciljevi, uključujući one do sastaviti kod projekta, stvorite a paket, i instalirati arhivsku datoteku u lokalnom spremištu ovisnosti Maven.

4.1. Faze životnog ciklusa

Sljedeći popis prikazuje najvažnijeg Mavena životni ciklus faze:

  • potvrditi - provjerava ispravnost projekta
  • sastaviti - kompilira ponuđeni izvorni kod u binarne artefakte
  • test - izvršava jedinične testove
  • paket - pakira prevedeni kod u arhivsku datoteku
  • integracija-test - provodi dodatna ispitivanja koja zahtijevaju pakiranje
  • provjeriti - provjerava je li paket valjan
  • instalirati - instalira datoteku paketa u lokalno spremište Maven
  • rasporediti - raspoređuje datoteku paketa na udaljeni poslužitelj ili spremište

4.2. Dodaci i Ciljevi

Maven uključiti je zbirka jednog ili više njih ciljevi. Ciljevi se izvršavaju u fazama, što pomaže odrediti redoslijed kojim se ciljevi izvršavaju se.

Bogat popis dodataka koje službeno podržava Maven dostupan je ovdje. Tu je i zanimljiv članak kako napraviti izvršnu datoteku JAR na Baeldungu pomoću raznih dodataka.

Da bih bolje razumio koji ciljevi se pokreću u kojim fazama prema zadanim postavkama pogledajte zadani Maven životni ciklus uvezi.

Da bismo prošli bilo koju od gore navedenih faza, samo moramo pozvati jednu naredbu:

mvn 

Na primjer, mvn čista instalacija uklonit će prethodno stvorene jar / war / zip datoteke i prevedene klase (čist) i izvršiti sve faze potrebne za instalaciju nove arhive (instalirati).

Imajte na umu da ciljevi koje pruža dodaci mogu se povezati s različitim fazama životni ciklus.

5. Vaš prvi Maven projekt

U ovom ćemo odjeljku koristiti Mavenovu funkciju naredbenog retka za izradu Java projekta.

5.1. Generiranje jednostavnog Java projekta

Da bismo izgradili jednostavan Java projekt, pokrenimo sljedeću naredbu:

mvn arhetip: generiraj -DgroupId = org.baeldung -DartifactId = org.baeldung.java -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

The groupId je parametar koji ukazuje na grupu ili pojedinca koji su stvorili projekt, a to je često obrnuto ime domene tvrtke. The artefaktId je naziv osnovnog paketa koji se koristi u projektu, a mi koristimo standard arhetip.

Budući da nismo naveli verziju i vrstu pakiranja, oni će biti postavljeni na zadane vrijednosti - verzija će biti postavljena na 1,0-SNAPSHOT, a pakiranje će biti postavljeno na staklenka.

Ako ne znate koje parametre pružiti, uvijek možete odrediti interaktivniMod=pravi, tako da Maven traži sve potrebne parametre.

Nakon dovršenja naredbe imamo Java projekt koji sadrži App.java klase, što je samo jednostavan program "Hello World", u src / main / java mapu.

Imamo i primjer testne nastave u src / test / java. The pom.xml ovog projekta izgledat će slično ovome:

 4.0.0 org.baeldung org.baeldung.java jar 1.0-SNAPSHOT org.baeldung.java //maven.apache.org junit junit 4.1.2 test 

Kao što vidite, junit ovisnost je zadana prema zadanim postavkama.

5.2. Sastavljanje i pakiranje projekta

Sljedeći je korak sastavljanje projekta:

mvn sastaviti

Maven će trčati kroz sve životni ciklus faze potrebne za sastaviti faza za izgradnju izvora projekta. Ako želite pokrenuti samo test fazu, možete koristiti:

mvn test

Sada ćemo se pozvati na paket faza, koja će stvoriti sastavljenu arhivu staklenka datoteka:

mvn paket

5.3. Izvršenje aplikacije

Konačno, izvršit ćemo naš Java projekt s exec-maven-plugin. Konfigurirajmo potrebne dodatke u pom.xml:

 src maven-compiler-plugin 3.6.1 1.8 1.8 org.codehaus.mojo exec-maven-plugin 1.5.0 org.baeldung.java.App 

Prvi dodatak, maven-compiler-plugin, odgovoran je za sastavljanje izvornog koda pomoću Java verzije 1.8. The exec-maven-plugin traži mainClass u našem projektu.

Da bismo izvršili aplikaciju, izvodimo sljedeću naredbu:

mvn izvršni: java

6. Projekti s više modula

Mehanizam u Mavenu koji upravlja projektima s više modula (koji se također nazivaju agregator projekti) naziva se Rizjedač.

The Reaktor prikuplja sve dostupne module za izgradnju, zatim sortira projekte u ispravan redoslijed izrade i na kraju ih gradi jedan po jedan.

Pogledajmo kako stvoriti višemodularni nadređeni projekt.

6.1. Stvori roditeljski projekt

Prije svega, moramo stvoriti nadređeni projekt. Kako bi se stvorio novi projekt s imenom roditeljski projekt, koristimo sljedeću naredbu:

mvn arhetip: generiraj -DgroupId = org.baeldung -DartifactId = nadređeni projekt

Zatim ažuriramo vrstu pakiranja unutar pom.xml datoteka koja označava da je ovo roditelj modul:

pom

6.2. Stvaranje projekata podmodula

U sljedećem koraku kreiramo projekte podmodula iz direktorija roditelj-projekt:

cd nadređeni projekt mvn arhetip: generiraj -DgroupId = org.baeldung -DartifactId = jezgra mvn arhetip: generiraj -DgroupId = org.baeldung -DartifactId = usluga mvn arhetip: generiraj -DgroupId = org.baeldung -DartifactId = webapp

Da bismo provjerili jesmo li podmodule stvorili ispravno, pogledamo u nadređeni projekt pom.xml datoteku, gdje bismo trebali vidjeti tri modula:

 osnovna usluga webapp 

Štoviše, nadređeni odjeljak bit će dodan u svaki podmodul pom.xml:

 org.baeldung nadređeni projekt 1.0-SNAPSHOT 

6.3. Omogućite upravljanje ovisnostima u nadređenom projektu

Upravljanje ovisnostima je mehanizam za centraliziranje informacija o ovisnosti za roditeljski projekt muti-modula i njegovu djecu.

Kada imate skup projekata ili modula koji nasljeđuju zajedničkog roditelja, sve potrebne podatke o ovisnostima možete staviti u zajednički pom.xml datoteka. To će pojednostaviti reference na artefakte u djeteta POMs.

Pogledajmo uzorke roditelja pom.xml:

   org.springframework opruga-jezgra 4.3.5.Opusti // ... 

Proglašavanjem opružna jezgra inačici u roditelju, svi podmoduli koji ovise o opružna jezgra može proglasiti ovisnost koristeći samo groupId i artefaktId, a verzija će se naslijediti:

  org.springframework opruga-jezgra // ... 

Štoviše, možete osigurati izuzeća za upravljanje ovisnostima kod roditelja pom.xml, tako da podređeni moduli neće naslijediti određene biblioteke:

  org.springframework proljeće-kontekst 

Napokon, ako podređeni modul treba koristiti drugu verziju upravljane ovisnosti, možete nadjačati upravljanu verziju u djetetovoj pom.xml datoteka:

 org.springframework opruga-jezgra 4.2.1.OSLOBOĐENJE 

Imajte na umu da iako podređeni moduli nasljeđuju od svog nadređenog projekta, nadređeni projekt ne mora nužno imati nikakve module koje agregira. S druge strane, nadređeni projekt također može agregirati projekte koji ga ne nasljeđuju.

Za više informacija o nasljeđivanju i agregiranju pogledajte ovu dokumentaciju.

6.4. Ažuriranje podmodula i izrada projekta

Možemo promijeniti ambalaža vrsta svakog podmodula. Na primjer, promijenimo ambalaža od webapp modul za RAT ažuriranjem pom.xml datoteka:

rat

Sada možemo testirati izgradnju našeg projekta pomoću mvn čista instalacija naredba. Izlaz dnevnika Maven trebao bi biti sličan ovome:

[INFO] Skeniranje projekata ... [INFO] Redoslijed reaktora: [INFO] nadređeni projekt [INFO] jezgra [INFO] usluga [INFO] webapp // ............. [ INFO] ----------------------------------------- [INFO] Sažetak reaktora: [ INFO] ----------------------------------------- [INFO] nadređeni projekt. ................. USPJEH [2.041s] [INFO] jezgra ........................ .... USPJEH [4.802s] [INFO] usluga ......................... USPJEH [3.065s] [INFO] webapp ... ....................... USPJEH [6.125s] [INFO] ------------------- ----------------------

7. Zaključak

U ovom smo članku razgovarali o nekim popularnijim značajkama Apache Maven alata za izgradnju.

Svi primjeri koda na Baeldungu izrađeni su pomoću Mavena, tako da možete jednostavno provjeriti našu web stranicu GitHub projekta kako biste vidjeli razne konfiguracije Mavena.