Višemodulna aplikacija Maven s Java modulima

1. Pregled

Java Platform Module System (JPMS) dodaje više pouzdanosti, bolje odvajanje problema i jaču inkapsulaciju Java aplikacija. Međutim, to nije alat za izgradnju, dakle nedostaje mogućnost automatskog upravljanja ovisnostima o projektu.

Naravno, možemo se zapitati možemo li koristite dobro uspostavljene alate za izgradnju, poput Mavena ili Gradlea, u modulariziranim aplikacijama.

Zapravo možemo! U ovom vodiču, naučit ćemo kako stvoriti višemodularnu Maven aplikaciju pomoću Java modula.

2. Kapsuliranje Maven modula u Java module

Od modularnost i upravljanje ovisnostima nisu međusobno isključivi koncepti u Javi, možemo neprimjetno integrirati JPMS, na primjer, s Mavenom, iskorištavajući tako najbolje iz oba svijeta.

U standardni višemodulni Maven projekt, dodajemo jedan ili više podređenih Mavenovih modula stavljajući ih u korijensku mapu projekta i prijavljujući ih u nadređeni POM, odjeljak.

Zauzvrat, uređujemo POM svakog podređenog modula i specificiramo njegove ovisnosti putem standarda <id grupe>, <artefaktId> i <inačica> koordinate.

The reaktor mehanizam u Mavenu - odgovoran za upravljanje višemoduljskim projektima - brine se za izgradnju cijelog projekta u pravom redoslijedu.

U ovom ćemo se slučaju u osnovi služiti istom metodologijom dizajna, ali s jednom suptilnom, ali temeljnom varijantom: umotat ćemo svaki Maven modul u Java modul dodajući mu datoteku deskriptora modula, module-info.java.

3. Roditeljski modul Maven

Da bismo demonstrirali kako modularnost i upravljanje ovisnostima izvrsno funkcioniraju zajedno, izradit ćemo osnovni demo projekt s više modula Maven, čija će se funkcionalnost suziti na samo dohvaćanje nekih objekata domene iz sloja trajnosti.

Da bi kôd bio jednostavan, koristit ćemo običan Karta kao temeljna struktura podataka za pohranu objekata domene. Naravno, lako se možemo dalje prebaciti na punopravnu relacijsku bazu podataka.

Počnimo s definiranjem nadređenog modula Maven. Da bismo to postigli, stvorimo korijenski direktorij projekta koji se zove, na primjer, multimodulemavenproject (ali to može biti bilo što drugo) i dodajte tome roditelja pom.xml datoteka:

com.baeldung.multimodulemavenproject multimodulemavenproject 1.0 pom multimodulemavenproject org.apache.maven.plugins maven-compiler-plugin 3.8.0 11 11 UTF-8 

Nekoliko je pojedinosti vrijednih pažnje u definiciji nadređenog POM-a.

Prvo, budući da koristimo Javu 11, trebat će nam barem Maven 3.5.0 na našem sustavu, jer Maven podržava Javu 9 i noviju od te verzije nadalje.

Trebat će nam i najmanje verzija 3.8.0 dodatka za kompilaciju Maven. Stoga provjerimo najnoviju verziju dodatka na Maven Central.

4. Moduli Child Maven

Primijetite da je do ovog trenutka, nadređeni POM ne deklarira nijedan podređeni modul.

Budući da će naš demo projekt dohvatiti neke objekte domene sa sloja trajnosti, stvorit ćemo četiri podređena Maven modula:

  1. modul entiteta: sadržavat će jednostavnu klasu domene
  2. daomodul: sadržavat će sučelje potrebno za pristup sloju postojanosti (osnovni DAO ugovor)
  3. userdaomodule: uključivat će provedbu daomodulSučelje
  4. mainappmodule: ulazna točka projekta

4.1. The modul entiteta Maven modul

Sad, dodajmo prvi podređeni modul Maven, koji samo uključuje osnovnu klasu domene.

U korijenskom direktoriju projekta napravimo entitymodule / src / main / java / com / baeldung / entity strukturu direktorija i dodajte a Korisnik razred:

korisnik javne klase {privatni konačni naziv niza; // standardni konstruktor / getter / toString}

Dalje, uključimo module pom.xml datoteka:

 com.baeldung.multimodulemavenproject multimodulemavenproject 1.0 com.baeldung.entitymodule entitymodule 1.0 jar entitymodule

Kao što vidimo, Entitet modul nema nikakve ovisnosti o drugim modulima, niti zahtijeva dodatne Mavenove artefakte, jer uključuje samo Korisnik razred.

Sad moramo enkapsulirati Maven modul u Java modul. Da bismo to postigli, jednostavno postavimo sljedeću datoteku deskriptora modula (module-info.java) ispod entitymodule / src / main / java imenik:

modul com.baeldung.entitymodule {izvozi com.baeldung.entitymodule; }

Na kraju, dodajmo podređeni modul Maven nadređenom POM-u:

 modul entiteta 

4.2. The daomodul Maven modul

Stvorimo novi Maven modul koji će sadržavati jednostavno sučelje. To je prikladno za definiranje apstraktnog ugovora za dohvaćanje generičkih vrsta iz sloja postojanosti.

Zapravo postoji vrlo uvjerljiv razlog za smještanje ovog sučelja u zasebni Java modul. Čineći to, imamo apstraktni, nevezani ugovor koji je lako ponovno upotrijebiti u različitim kontekstima. U osnovi je ovo alternativna primjena Načela inverzije ovisnosti koja daje fleksibilniji dizajn.

Stoga, kreirajmo daomodule / src / main / java / com / baeldung / dao strukturu direktorija ispod korijenskog direktorija projekta i dodajte joj Dao sučelje:

javno sučelje Dao {Neobvezno findById (int id); Popis findAll (); }

Sada, definirajmo module pom.xml datoteka:

 // roditeljske koordinate com.baeldung.daomodule daomodule 1.0 jar daomodule

Novi modul ne zahtijeva ni druge module ni artefakte, pa ćemo ga samo umotati u Java modul. Stvorimo deskriptor modula pod daomodule / src / main / java imenik:

modul com.baeldung.daomodule {izvozi com.baeldung.daomodule; }

Na kraju, dodajmo modul nadređenom POM-u:

 entitymodule daomodule 

4.3. The userdaomodule Maven modul

Dalje, definirajmo Maven modul koji sadrži implementaciju Dao sučelje.

U korijenskom direktoriju projekta napravimo userdaomodule / src / main / java / com / baeldung / userdao strukturu direktorija i dodajte joj sljedeće UserDao razred:

javna klasa UserDao implementira Dao {privatne korisnike konačne karte; // standardni konstruktor @Override public Izborni findById (int id) {return Optional.ofNullable (users.get (id)); } @Override javni popis findAll () {vrati novi ArrayList (users.values ​​()); }}

Jednostavno rečeno, UserDao klasa pruža osnovni API koji nam omogućuje dohvaćanje Korisnik predmeti iz sloja postojanosti.

Da bi stvari bile jednostavne, koristili smo a Karta kao sigurnosna struktura podataka za trajno držanje objekata domene. Naravno, moguće je pružiti temeljitiju implementaciju koja koristi, na primjer, Hibernateov upravitelj entiteta.

Sada, definirajmo POM modula Maven:

 // nadređene koordinate com.baeldung.userdaomodule userdaomodule 1.0 jar userdaomodule com.baeldung.entitymodule entitymodule 1.0 com.baeldung.daomodule daomodule 1.0 

U ovom su slučaju stvari malo drugačije, kao što je userdaomodule modul zahtijeva entitymodule i daomodul modula. Zbog toga smo ih dodali kao ovisnosti u pom.xml datoteka.

Još uvijek trebamo enkapsulirati ovaj Maven modul u Java modul. Dakle, dodajmo sljedeći opis modula pod userdaomodule / src / main / java imenik:

modul com.baeldung.userdaomodule {zahtijeva com.baeldung.entitymodule; zahtijeva com.baeldung.daomodule; pruža com.baeldung.daomodule.Dao s com.baeldung.userdaomodule.UserDao; izvozi com.baeldung.userdaomodule; } 

Na kraju, moramo dodati ovaj novi modul nadređenom POM-u:

 entitymodule daomodule userdaomodule 

Iz pogleda na visokoj razini to je lako vidjeti the pom.xml datoteka i opis modula igraju različite uloge. I pored toga se lijepo nadopunjuju.

Recimo da moramo ažurirati verzije e-antitymodule i daomodul Mavenovi artefakti. To možemo lako učiniti, a da ne moramo mijenjati ovisnosti u opisu modula. Maven će se pobrinuti za uključivanje pravih artefakata za nas.

Slično tome, možemo promijeniti implementaciju usluge koju modul pruža modificirajući "Pruža..s" direktiva u opisu modula.

Dobivamo puno kada zajedno koristimo Maven i Java module. Prvi donosi funkcionalnost automatskog, centraliziranog upravljanja ovisnostima, dok drugi pruža unutarnje blagodati modularnosti.

4.4. The mainappmodule Maven modul

Uz to, moramo definirati modul Maven koji sadrži glavnu klasu projekta.

Kao i prije, kreirajmo mainappmodule / src / main / java / mainapp strukturu direktorija ispod korijenskog direktorija i dodajte joj sljedeće Primjena razred:

aplikacija javne klase {public static void main (String [] args) {Map users = new HashMap (); users.put (1, novi korisnik ("Julie")); users.put (2, novi korisnik ("David")); Dao userDao = novi UserDao (korisnici); userDao.findAll (). forEach (System.out :: println); }}

The Primjena razredu glavni() metoda je prilično jednostavna. Prvo, popunjava a HashMap s par Korisnik predmeta. Dalje koristi a UserDao primjer za njihovo preuzimanje iz Karta, a zatim ih prikazuje na konzoli.

Osim toga, također moramo definirati module pom.xml datoteka:

 // nadređene koordinate com.baeldung.mainappmodule mainappmodule 1.0 jar mainappmodule com.baeldung.entitymodule entitymodule 1.0 com.baeldung.daomodule daomodule 1.0 com.baeldung.userdaomodule userdaomodule 1.0 

Ovisnosti modula prilično su razumljive. Dakle, moramo samo smjestiti modul unutar Java modula. Stoga, pod mainappmodule / src / main / java struktura direktorija, uključimo deskriptor modula:

modul com.baeldung.mainappmodule {zahtijeva com.baeldung.entitypmodule; zahtijeva com.baeldung.userdaopmodule; zahtijeva com.baeldung.daopmodule; koristi com.baeldung.daopmodule.Dao; } 

Na kraju, dodajmo ovaj modul nadređenom POM-u:

 entitymodule daomodule userdaomodule mainappmodule 

Sa svim podređenim Mavenovim modulima koji su već postavljeni i uredno enkapsulirani u Java module, evo kako izgleda struktura projekta:

multimodulemavenproject (korijenski direktorij) pom.xml | - entitymodule | - src | - main | - java module-info.java | - com | - baeldung | - entitet User.class pom.xml | - daomodule | - src | - glavni | - java module-info.java | - com | - baeldung | - dao Dao.class pom.xml | - userdaomodule | - src | - main | - java module-info.java | - com | - baeldung | - userdao UserDao.class pom.xml | - mainappmodule | - src | - glavna | - java module-info.java | - com | - baeldung | - mainapp Application.class pom.xml 

5. Pokretanje aplikacije

Na kraju, pokrenimo aplikaciju, bilo iz našeg IDE-a ili iz konzole.

Kao što bismo mogli očekivati, trebali bismo vidjeti nekoliko Korisnik objekti ispisani na konzoli prilikom pokretanja aplikacije:

Korisnik {name = Julie} Korisnik {name = David} 

6. Zaključak

U ovom uputstvu naučili smo na pragmatičan način kako smjestiti Maven i JPMS da rade usporedno, u razvoju osnovnog višemodularnog Maven projekta koji koristi Java module.

Kao i obično, svi uzorci koda prikazani u ovom vodiču dostupni su na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found