Višemodalni projekt s Mavenom

1. Pregled

U ovom uputstvu pokazat ćemo kako izraditi projekt s više modula s Mavenom.

Prvo ćemo razgovarati o multi-modulnom projektu i pogledati prednosti slijeđenja ovog pristupa. Tada ćemo postaviti naš ogledni projekt. Za dobar uvod u Maven, pogledajte ovaj vodič.

2. Mavenov projekt s više modula

Projekt s više modula izgrađen je od agregatora POM koji upravlja grupom podmodula. U većini slučajeva, agregator se nalazi u korijenskom direktoriju projekta i mora imati pakiranje tipa pom.

Sada su podmoduli redovni Mavenovi projekti i mogu se graditi odvojeno ili putem agregatora POM.

Izgradnjom projekta putem agregatora POM, svaki projekt koji ima vrstu pakiranja razlikuje se od pom rezultirat će izgrađenom arhivskom datotekom.

3. Prednosti upotrebe multi-modula

Značajna prednost korištenja ovog pristupa je u tome možemo smanjiti dupliciranje.

Recimo da imamo aplikaciju koja se sastoji od nekoliko modula, neka to bude front-end modul i back-end modul. Sada radimo na obje i mijenjamo funkcionalnost koja utječe na njih dvije. U tom slučaju, bez specijaliziranog alata za izgradnju, morat ćemo zasebno graditi obje komponente ili napisati skriptu koja će kompajlirati kôd, pokrenuti testove i prikazati rezultate. Tada, nakon što u projekt uvedemo još više modula, postat će teže upravljati i održavati.

Osim toga, u stvarnom svijetu projekti će možda trebati određene Maven dodatke za izvođenje različitih operacija tijekom životnog ciklusa gradnje, dijeljenje ovisnosti i profila ili uključivanje drugih BOM projekata.

Stoga, kada koristimo multi-module, možemo izradite module naše aplikacije u jednoj naredbi a ako je redoslijed važan, Maven će nam to shvatiti. Također, možemo podijeliti veliku količinu konfiguracije s drugim modulima.

4. Roditelj POM

Maven podržava nasljeđivanje na način da svaka datoteka pom.xml ima implicitni nadređeni POM, zove se Super POM a može se nalaziti u binarnim datotekama Maven. Ove dvije datoteke Maven je spojio i čine Efektivni POM.

Stoga možemo stvoriti svoje vlastitu datoteku pom.xml koja će nam poslužiti kao nadređeni projekt. Zatim možemo tamo uključiti svu konfiguraciju s ovisnostima i postaviti je kao nadređenu naših podređenih modula, tako da će je oni naslijediti.

Osim nasljedstva, Maven daje pojam agregacije. Nadređeni POM koji koristi ovu funkciju naziva se skupni POM. U osnovi, ovakav POM izričito deklarira svoje module u svojoj datoteci pom.xml.

5. Podmoduli

Podmoduli ili potprojekti su redoviti Mavenovi projekti koji nasljeđuju roditeljski POM. Kao što već znamo, nasljeđivanje nam dijeli konfiguraciju i ovisnosti s podmodulima. Međutim, ako svoj projekt želimo izgraditi ili objaviti u jednom kadru, svoje podmodule moramo izričito prijaviti u nadređenom POM-u. U konačnici, naš nadređeni POM bit će nadređeni kao i ukupni POM.

6. Izrada aplikacije

Sad kad razumijemo Mavenove podmodule i hijerarhiju, napravimo uzorak aplikacije koja će ih demonstrirati. Za generiranje svojih projekata koristit ćemo Mavenovo sučelje naredbenog retka.

Ova će se aplikacija sastojati od tri modula koja će predstavljati:

  • The jezgra dio naše domene
  • Web servis pružanje nekih REST API-ja
  • A webapp koji sadrže neku vrstu web-elemenata usmjerenih prema korisnicima

Budući da ćemo se usredotočiti na Maven, implementacija ovih usluga ostat će nedefinirana.

6.1. Generiranje nadređenog POM-a

Prvo, izradimo nadređeni projekt:

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

Jednom kada se roditelj generira, moramo otvoriti pom.xml datoteku koja se nalazi u roditeljskom direktoriju i promijenite pakiranje u pom.

pom

Postavljanjem pakiranja na pom tip, izjavljujemo da će projekt služiti kao roditelj ili agregator - neće proizvesti daljnje artefakte.

Sada, kad je naš agregator gotov, možemo generirati svoje podmodule.

Međutim, moramo napomenuti, ovo je mjesto gdje se nalazi sva konfiguracija koja se dijeli i koja se na kraju ponovno koristi u podređenim modulima. Između ostalog, možemo se poslužiti ovisnostUpravljanje ili pluginManagement ovdje.

6.2. Stvaranje podmodula

Kako je imenovan naš roditelj POM roditelj-projekt, moramo biti sigurni da se nalazimo u roditeljskom direktoriju i pokrenuti generirati naredbe:

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

Primijetite upotrijebljenu naredbu. Ista je kao i mi za roditelja. Stvar je ovdje u tome što su ovi moduli redoviti Maven projekti, no Maven je prepoznao da su ugniježđeni. Kad smo promijenili direktorij u roditelj-projekt, otkrilo je da roditelj ima ambalažu tipa pom i modificirao oboje pom.xml datoteke u skladu s tim.

Nakon toga, Maven će generirati tri podmodula i izmijeniti za nas roditeljski pom.xml datoteku dodavanjem nekih oznaka:

 osnovna usluga webapp 

Sada naš roditelj izričito deklarira agregirane module.

Dalje, kada trčite mvn paket naredbu u nadređenom direktoriju projekta, Maven će izgraditi i testirati sva tri modula.

Štoviše, Maven Reactor će analizirati naš projekt i izraditi ga u pravilnom redoslijedu. Dakle, ako je naš webapp modul ovisi o usluga modul, Maven će prvo izgraditi servis, onda webapp.

Napokon, ako želimo podijeliti svu konfiguraciju s našim podmodulima, u njihovim pom.xml datoteke, morat ćemo proglasiti roditelja:

 org.baeldung nadređeni projekt 1.0-SNAPSHOT 

Moramo napomenuti da podmoduli mogu imati samo jednog roditelja. Međutim, možemo uvesti mnogo specifikacija. Više detalja o BOM datotekama možete pronaći u ovom članku.

6.3. Izgradnja projekta

Sada možemo graditi sva tri modula odjednom. U direktoriju nadređenog projekta pokrenite:

mvn paket

Ovo će izgraditi sve module, trebali bismo vidjeti sljedeći izlaz naredbe:

[INFO] Traženje projekata ... [INFO] -------------------------------------- ---------------------------------- [INFO] Naredba izgradnje reaktora: [INFO] nadređeni projekt [INFO] osnovna [INFO] usluga [INFO] webapp ... [INFO] Sažetak reaktora: [INFO] nadređeni projekt .......................... ........... USPJEH [0,140 s] [INFO] jezgra .............................. ................. USPJEH [2.195 s] [INFO] usluga ........................ .................... USPJEH [0,767 s] [INFO] webapp ..................... ........................ USPJEH [0,572 s] [INFO] ------------------ -------------------------------------------------- ---- [INFO] IZGRADNJA USPJEHA [INFO] -------------------------------------- ----------------------------------

Reaktor navodi roditelj-projekt, ali kako jest pom vrsta je isključeno i izrada rezultira u tri odvojena .jar datoteke za sve ostale module. U tom se slučaju gradnja događa kod njih tri.

7. Zaključak

U ovom uputstvu raspravljali smo o prednostima korištenja Maven multi-modula. Također, razlikovali smo redovni Mavenov nadređeni POM i agregirani POM. Na kraju smo pokazali kako postaviti jednostavan multi-modul za početak igre.

Maven je sjajan alat, ali je sam po sebi složen. Ako želite pronaći više detalja o Mavenu, pogledajte referencu Sonatype Maven ili vodiče za Apache Maven. Ako tražite naprednu upotrebu postavljenih višemodula Maven, pogledajte kako projekt Spring Boot iskorištava njegovu upotrebu.

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.