Viacmodulová aplikácia Maven s modulmi Java

1. Prehľad

Systém Java Platform Module (JPMS) dodáva aplikáciám Java väčšiu spoľahlivosť, lepšie oddelenie záujmov a silnejšie zapuzdrenie. Nie je to však nástroj na zostavenie chýba mu schopnosť automatického riadenia závislostí projektu.

Samozrejme, možno si položíme otázku, či môžeme používajte osvedčené nástroje na vytváranie, ako napríklad Maven alebo Gradle, v modulárnych aplikáciách.

Vlastne môžeme! V tomto návode Naučíme sa, ako vytvoriť viacmodulovú aplikáciu Maven pomocou modulov Java.

2. Zapuzdrenie modulov Maven v moduloch Java

Odkedy správa modularity a závislostí nie sú v Jave navzájom konceptmi, dokážeme hladko integrovať napríklad JPMS s Mavenom, a tak využiť to najlepšie z oboch svetov.

V štandardnom viacmodulovom projekte Maven pridáme jeden alebo viac podradených modulov Maven tak, že ich umiestnime do koreňového priečinka projektu a deklarujeme ich v nadradenom POM v rámci oddiel.

Na druhej strane upravíme POM každého podriadeného modulu a špecifikujeme jeho závislosti prostredníctvom štandardu <groupId>, <artifactId> a <verzia> súradnice.

The reaktor mechanizmus v Mavene - zodpovedný za riešenie viacmodulových projektov - stará sa o zostavenie celého projektu v správnom poradí.

V tomto prípade v zásade použijeme rovnakú metodiku návrhu, ale s jedným jemným, ale zásadným variantom: zabalíme každý modul Maven do modulu Java tak, že doň pridáme súbor deskriptora modulu, modul-info.java.

3. Modul Parent Maven

Aby sme demonštrovali, ako modularita a riadenie závislostí skvelo spolupracujú, zostavíme základný ukážkový viacmodulový projekt Maven, ktorých funkčnosť sa zúži na iba načítanie niektorých doménových objektov z vrstvy perzistencie.

Aby bol kód jednoduchý, použijeme obyčajný kód Mapa ako podkladová dátová štruktúra na ukladanie doménových objektov. Samozrejme, môžeme ľahko prejsť ďalej po ceste do plnohodnotnej relačnej databázy.

Začnime definovaním rodičovského modulu Maven. Aby sme to dosiahli, vytvorme koreňový adresár projektu nazvaný napríklad multimodulemavenproject (ale môže to byť čokoľvek iné) a pridajte k tomu rodiča pom.xml spis:

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

V definícii materského POM stojí za zmienku niekoľko podrobností.

Najskôr, keďže používame Java 11, v našom systéme budeme potrebovať minimálne Maven 3.5.0, pretože Maven od tejto verzie podporuje Javu 9 a vyššiu.

A tiež budeme potrebovať minimálne verziu 3.8.0 doplnku kompilátora Maven. Preto nezabudnite skontrolovať najnovšiu verziu doplnku na serveri Maven Central.

4. Moduly Child Maven

Všimnite si, že až do tohto bodu nadradený POM nedeklaruje žiadne podradené moduly.

Pretože náš ukážkový projekt načíta niektoré objekty domény z vrstvy vytrvalosti, vytvoríme štyri podradené moduly Maven:

  1. entitový modul: bude obsahovať jednoduchú triedu domény
  2. daomodul: bude obsahovať rozhranie potrebné na prístup k vrstve perzistencie (základná zmluva DAO)
  3. userdaomodule: bude obsahovať implementáciu daomodulRozhranie
  4. mainappmodule: vstupný bod projektu

4.1. The entitový modul Maven modul

Teraz pridajme prvý podradený modul Maven, ktorý obsahuje iba základnú triedu domény.

V koreňovom adresári projektu vytvorme entitymodule / src / main / java / com / baeldung / entity adresárová štruktúra a pridať a Používateľ trieda:

verejná trieda Používateľ {private final Názov reťazca; // štandardný konštruktor / getter / toString}

Ďalej zahrňme moduly pom.xml spis:

 com.baeldung.multimodulemavenproject multimodulemavenproject 1.0 com.baeldung.entitymodule entitymodule 1,0 jar entitymodule

Ako vidíme, Subjekt modul nemá žiadne závislosti od ostatných modulov, ani nevyžaduje ďalšie Mavenove artefakty, pretože obsahuje iba Používateľ trieda.

Teraz musíme zapuzdruje modul Maven do modulu Java. Aby sme to dosiahli, jednoducho umiestnime nasledujúci súbor deskriptora modulu (modul-info.java) pod entitymodule / src / main / java adresár:

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

Nakoniec pridajme podradený modul Maven do nadradeného POM:

 entitový modul 

4.2. The daomodul Maven modul

Vytvorme nový modul Maven, ktorý bude obsahovať jednoduché rozhranie. To je vhodné na definovanie abstraktného kontraktu na načítanie generických typov z vrstvy perzistencie.

V skutočnosti existuje veľmi závažný dôvod umiestniť toto rozhranie do samostatného modulu Java. Týmto spôsobom máme abstraktnú, vysoko oddelenú zmluvu, ktorú je ľahké znovu použiť v rôznych kontextoch. V jadre ide o alternatívnu implementáciu princípu závislosti závislostí, ktorá prináša flexibilnejší dizajn.

Preto vytvorme daomodule / src / main / java / com / baeldung / dao adresárovú štruktúru v koreňovom adresári projektu a pridajte do nej adresár Dao rozhranie:

verejné rozhranie Dao {voliteľné findById (int id); Zoznam findAll (); }

Teraz definujme moduly pom.xml spis:

 // nadradené súradnice com.baeldung.daomodule daomodule 1,0 jar daomodule

Nový modul taktiež nevyžaduje ďalšie moduly ani artefakty, takže ho zabalíme iba do modulu Java. Vytvorme deskriptor modulu pod daomodule / src / main / java adresár:

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

Nakoniec pridajme modul do nadradeného POM:

 entomodulárny daomodul 

4.3. The userdaomodule Maven modul

Ďalej definujeme modul Maven, ktorý obsahuje implementáciu Dao rozhranie.

V koreňovom adresári projektu vytvorme userdaomodule / src / main / java / com / baeldung / userdao adresárovú štruktúru a pridajte do nej nasledujúce UserDao trieda:

verejná trieda UserDao implementuje Dao {súkromní koneční používatelia mapy; // štandardný konštruktor @Override public Voliteľné findById (int id) {návrat Voliteľné.ofNullable (users.get (id)); } @Override public List findAll () {return new ArrayList (users.values ​​()); }}

Jednoducho povedané UserDao trieda poskytuje základné API, ktoré nám umožňuje načítať Používateľ objekty z vrstvy perzistencie.

Pre zjednodušenie sme použili a Mapa ako podporná dátová štruktúra pre pretrvávanie doménových objektov. Samozrejme je možné zabezpečiť dôkladnejšiu implementáciu, ktorá využíva napríklad manažéra entity Hibernate.

Teraz definujme POM modulu Maven:

 // nadradené súradnice com.baeldung.userdaomodule userdaomodule 1.0 jar userdaomodule com.baeldung.entitymodule entitymodule 1.0 com.baeldung.daomodule daomodule 1.0 

V tomto prípade sa veci mierne líšia userdaomodule modul vyžaduje entitymodule a daomodul modulov. Preto sme ich pridali ako závislosti do pom.xml spis.

Stále musíme tento modul Maven zapuzdriť do modulu Java. Pridajme teda nasledujúci deskriptor modulu pod userdaomodule / src / main / java adresár:

modul com.baeldung.userdaomodule {vyžaduje com.baeldung.entitymodule; vyžaduje com.baeldung.daomodule; poskytuje com.baeldung.daomodule.Dao s com.baeldung.userdaomodule.UserDao; export com.baeldung.userdaomodule; } 

Nakoniec musíme tento nový modul pridať do nadradeného POM:

 entitymodule daomodule userdaomodule 

Z pohľadu na vysokej úrovni je to ľahké vidieť the pom.xml súbor a deskriptor modulu hrajú rôzne úlohy. Aj tak sa pekne dopĺňajú.

Povedzme, že musíme aktualizovať verzie entitymodule a daomodul Mavenské artefakty. Môžeme to ľahko urobiť bez toho, aby sme museli meniť závislosti v deskriptore modulu. Maven sa postará o zahrnutie tých správnych artefaktov pre nás.

Podobne môžeme zmeniť implementáciu služby, ktorú modul poskytuje, úpravou „Poskytuje..so“ direktíva v deskriptore modulu.

Veľa získavame, keď používame moduly Maven a Java spoločne. Prvý z nich prináša funkčnosť automatického centralizovaného riadenia závislostí, zatiaľ čo druhý poskytuje základné výhody modulárnosti.

4.4. The mainappmodule Maven modul

Ďalej musíme definovať modul Maven, ktorý obsahuje hlavnú triedu projektu.

Rovnako ako predtým, vytvorme mainappmodule / src / main / java / mainapp adresárovú štruktúru v koreňovom adresári a pridajte do nej nasledujúce Aplikácia trieda:

public class Aplikácia {public static void main (String [] args) {Map users = new HashMap (); users.put (1, nový užívateľ ("Julie")); users.put (2, nový používateľ („David“)); Dao userDao = nový UserDao (používatelia); userDao.findAll (). forEach (System.out :: println); }}

The Aplikácia triedy hlavný() metóda je celkom jednoduchá. Najskôr sa naplní a HashMap s pár Používateľ predmety. Ďalej používa a UserDao napríklad na ich načítanie z Mapa, a potom ich zobrazí na konzole.

Okrem toho musíme tiež definovať moduly pom.xml spis:

 // nadradené súradnice 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 

Závislosti modulu sú celkom samozrejmé. Potrebujeme teda umiestniť modul do modulu Java. Preto pod mainappmodule / src / main / java adresárová štruktúra, zahrňme deskriptor modulu:

modul com.baeldung.mainappmodule {vyžaduje com.baeldung.entitypmodule; vyžaduje com.baeldung.userdaopmodule; vyžaduje com.baeldung.daopmodule; používa com.baeldung.daopmodule.Dao; } 

Nakoniec pridajme tento modul do nadradeného POM:

 entitymodule daomodule userdaomodule mainappmodule 

Keď sú všetky podradené moduly Maven už na mieste a sú úhľadne zapuzdrené v moduloch Java, vyzerá štruktúra projektu takto:

multimodulemavenproject (koreňový adresár) pom.xml | - entitymodule | - src | - hlavný | - java module-info.java | - com | - baeldung | - entity User.class pom.xml | - daomodule | - src | - hlavný | - 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 | - main | - java module-info.java | - com | - baeldung | - mainapp Application.class pom.xml 

5. Spustenie aplikácie

Na záver spustíme aplikáciu, buď z nášho IDE, alebo z konzoly.

Ako by sme mohli čakať, mali by sme ich vidieť pár Používateľ objekty vytlačené na konzolu pri spustení aplikácie:

Používateľ {name = Julie} Používateľ {name = David} 

6. Záver

V tomto tutoriáli sme sa učili pragmatickým spôsobom ako dať Maven a JPMS pracovať vedľa seba pri vývoji základného viacmodulového projektu Maven, ktorý využíva moduly Java.

Ako obvykle sú všetky ukážky kódu zobrazené v tomto tutoriáli dostupné na GitHub.


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