Programovanie

Maven 2 POM demystifikovaný

Vytvorenie projektu je zložité podnikanie. Kvôli desiatkam úloh potrebných pri konverzii súborov typu hodge-podge na pracovný program existujú doslova stovky nástrojov, ktoré robia všetko od generovania zdrojového kódu, cez kompiláciu, testovanie, distribúciu, varenie rannej kávy (ak nájdete jednu, drahý čitateľ, dajte mi vedieť). Mnohé z týchto programov sú vynikajúce v tom, čo robia. Bohužiaľ, pre tých z nás, ktorí riadime rozsiahle systémy budovania pre život, existuje zriedka veľa spoločného; každý program vyžaduje vlastnú rôznorodú inštaláciu a ezoterickú konfiguráciu. Stalo sa nevyhnutnou skutočnosťou našich životov, že väčšina systémov postavenia je postavená na zákazku ručným lepením týchto nástrojov pomocou niekoľkých homebrew skriptov (áno, počet Ant skriptov).

Maven je viac ako iný nástroj na zostavenie rámec. Čisto oddeľuje váš kód od konfiguračných súborov, dokumentácie a závislostí. Maven je prekvapivo flexibilný v tom, že umožňuje používateľom konfigurovať väčšinu aspektov ich kódu, ako aj ovládať správanie doplnkov, jednotlivých cieľov a dokonca samotného životného cyklu zostavenia. Maven je skutočná štruktúra a v týchto stenách sídli váš projekt; chce to byť ústretový hostiteľ.

Problém však stále zostáva: správa práce tisícov skriptov na vytváranie vlastných súborov v jednom rámci je náročná a aby bola vykonaná správne, vyžaduje veľa informácií. Tím Maven 2 bol našťastie celkom úspešný. Maven 2, ktorý sa učí z chýb Maven 1, nespočetných požiadaviek používateľov, vylepšovania a aktualizácií, je výkonnejší ako kedykoľvek predtým. Bohužiaľ, s veľkým výkonom prichádza aj skvelá konfigurácia. Aby boli artefakty Maven 2 ľahko prenosné jednotky, táto zložitá konfigurácia spadá do jedného súboru. Zadajte Maven POM.

Čo je POM?

POM znamená projektový objektový model. Jedná sa o XML reprezentáciu projektu Maven, ktorý sa nachádza v súbore s názvom pom.xml. V prítomnosti ľudí z Mavenu sa hovorí o projekte vo filozofickom zmysle, nad rámec obyčajnej zbierky súborov obsahujúcich kód. Projekt obsahuje konfiguračné súbory, ako aj zapojených vývojárov a role, ktoré hrajú, systém sledovania chýb, organizáciu a licencie, adresu URL, kde projekt žije, závislosti projektu a všetky ďalšie malé časti, ktoré vstupujú do hry pri poskytovaní kódu. život. Projekt je kontaktným miestom všetkých vecí, ktoré s ním súvisia. V skutočnosti vo svete Maven nemusí projekt vôbec obsahovať žiadny kód, iba pom.xml. S pár takýmito typmi projektov sa stretneme neskôr v článku.

Stručný štrukturálny prehľad

POM je veľký a zložitý, takže jeho rozdelenie na kúsky uľahčuje trávenie. Na účely tejto diskusie sú tieto časti zoskupené do štyroch logických jednotiek, ako je znázornené na obrázku 1: POM vzťahy, informácie o projekte, nastavenia zostavy a prostredie zostavy. Začneme diskusiou o vzťahoch POM.

Nižšie je uvedený zoznam prvkov priamo pod prvkom projektu POM. Všimni si modelVersion obsahuje 4.0.0. Toto je momentálne jediná podporovaná verzia POM pre Maven 2 a je vždy požadovaná. Definícia schémy XML Maven 4.0.0 sa nachádza na adrese //maven.apache.org/maven-v4_0_0.xsd. Jeho prvky najvyššej úrovne sú:

4.0.0

... ... ... ... ... ... ...

... ... ... ... ... ... ... ...

... ... ... ...

... ... ... ...

... ... ... ... ...

POM vzťahy

Našou prvou úlohou je preskúmať projektové vzťahy, ktoré sú znázornené na obrázku 2 ako ľavý horný roh grafu na obrázku 1.

Projekty musia navzájom nejako súvisieť. Od vytvorenia prvých asemblerov mali softvérové ​​projekty závislosti; Maven zaviedol viac foriem vzťahov, ktoré sa doteraz v takejto podobe nepoužívali pre projekty Java. Tieto vzťahy sú Mavenove súradnice, závislosti na súradniciach, dedičnosť projektu a agregácia.

Súradnice

Každý projekt Maven obsahuje svoj vlastný jedinečný identifikátor, dabovaný projektom súradnice, ktorý funguje ako adresa artefaktu a dáva mu jedinečné miesto vo vesmíre Maven. Keby projekty nemali žiadny vzájomný vzťah, neboli by potrebné súradnice. To znamená, že ak by vesmír mal iba jeden dom, načo by mu bola adresa ako 315 Cherrywood Lane?

Nasledujúci kód predstavuje minimálny POM, ktorý program Maven 2 umožní—, a sú všetky povinné polia. Fungujú ako vektor v priestore Maven s grouperom prvkov, identifikátorom a časovou značkou.

4.0.0org.codehaus.mojoa1

Vo svete Maven tvoria tieto tri hlavné prvky (Mavenova trojica - hľa jeho sláva!) Súradnice POM. Súradnice sú znázornené na obrázku 3.

Možno tento POM sám o sebe nie je taký pôsobivý. Lepší sa to.

Závislosti

Jedným z najsilnejších aspektov Mavenu je jeho riešenie závislostí projektu a v Mavene 2 to zahŕňa tranzitívne závislosti. Obrázok 4 zobrazuje, ako ich budeme graficky reprezentovať.

Správa závislostí má dlhoročnú tradíciu v tom, že je komplikovaným neporiadkom pre čokoľvek okrem najtriviálnejších projektov. „Jarmageddon“ rýchlo nasleduje, keď sa strom závislosti stáva obrovským, komplikovaným a trápnym pre architektov, ktorých opovrhujú noví absolventi, ktorí „by to mohli urobiť lepšie“. Nasleduje „Jar Hell“, kde verzie závislostí na jednom systéme nie sú úplne rovnaké ako verzie použité na vývoj; majú buď nesprávnu verziu, alebo konfliktné verzie medzi podobne pomenovanými JAR. Preto sa veci začnú lámať a presne určovať, prečo je to ťažké. Maven rieši oba tieto problémy tým, že má spoločné lokálne úložisko, z ktorého môže odkazovať na správne projekty, verzie a všetky.

Dedenie

Jednou z funkcií, ktoré Maven 2 prináša z Maven 1 dní, je dedičnosť projektu, ako je znázornené na obrázku 5. V zostavovacích systémoch, ako je napríklad Ant, sa dá dedičnosť určite simulovať, ale Maven urobil ďalší krok pri explicitnom dedení projektu na objektový model projektu.

Nasledujúci kód definuje nadradený POM v Maven 2:

4.0.0org.codehaus.mojob2pom

Tento rodič vyzerá podobne ako náš prvý POM, s malým rozdielom. Všimnite si, že sme nastavili balenie typ ako pom, ktorá je požadovaná pre materské aj agregačné projekty (viac sa budeme venovať balenie v sekcii „Nastavenia zostavenia“). Ak chceme vyššie uvedený projekt použiť ako nadradený, môžeme ho zmeniť org.codehaus.mojo: a POM byť:

4.0.0org.codehaus.mojob2a

Je dôležité si uvedomiť, že všetky POM dedia po rodičoch, či už sú výslovne definované alebo nie. Tento základný POM je známy ako „super POM“ a obsahuje hodnoty dedené predvolene. Jednoduchý spôsob, ako sa pozrieť na predvolené konfigurácie super POM, je vytvoriť jednoduchý pom.xml bez ničoho iného modelVersion, groupId, artifactIda verziaa spustenie príkazu pomoc mvn: efektívne-pom.

Okrem jednoduchého nastavenia hodnôt dedenia majú rodičia tiež právomoc vytvárať predvolené konfigurácie pre svoje deti bez toho, aby im vnucovali hodnoty. Správa závislostí je obzvlášť silný nástroj na konfiguráciu množiny závislostí prostredníctvom spoločného umiestnenia (rodič POM). The dependencyManagement syntax prvku je podobná ako v sekcii závislostí. Čo to však robí, je umožniť deťom dediť nastavenia závislostí, ale nie závislosť samotnú. Pridanie závislosti pomocou dependencyManagement prvok vlastne nepridáva závislosť na POM, ani nepridáva závislosť deťom; vytvára predvolenú konfiguráciu pre každú závislosť, ktorú si môže dieťa zvoliť pridať do svojej vlastnej sekcie závislostí. Nastavenia podľa dependencyManagement platí aj pre aktuálnu konfiguráciu závislostí POM (hoci konfigurácie prepísané vo vnútri prvku závislosti majú vždy prednosť).

Agregácia

Projekt s modulmi je známy ako multimodulárny projekt. Moduly sú projekty, ktoré POM vypíše ako zoznam. Multimodulárne projekty vedia o svojich moduloch, ale nie je to nevyhnutne pravda, ako je znázornené na obrázku 6.

Za predpokladu, že nadradený POM sa nachádza v nadradenom adresári kde POM pre projekt a životy, a že projekt a tiež sa nachádza v adresári s rovnakým názvom, môžeme zmeniť rodičovský POM b agregovať dieťa a pridaním ako modulu:

4.0.0org.codehaus.mojob2poma

Keby sme bežali mvn zostaviť v základnom adresári by ste videli stavať začiatok:

[INFO] Vyhľadáva sa projekty ... [INFO] Poradie zostavy reaktora: [INFO] Nepomenované - org.codehaus.mojo: b: pom: 2 [INFO] Nepomenované - org.codehaus.mojo: a: jar: 2 

Životný cyklus Maven sa teraz vykoná až do fázy životného cyklu určenej v správnom poradí; to znamená, že každý artefakt je vytváraný jeden po druhom a ak jeden artefakt vyžaduje, aby bol najskôr zostavený iný, bude.

Poznámka k dedičstvu vs. agregácii

Dedenie a agregácia vytvárajú príjemnú dynamiku pre riadenie zostavení prostredníctvom jediného POM na vysokej úrovni. Často uvidíte projekty, ktoré sú rodičmi aj multimodulmi, napríklad príklad vyššie. Ich komplementárnosť z nich robí prirodzenú zhodu. Aj projektové jadro Maven 2 beží cez jeden rodič / multimodulárny POM org.apache.maven: maven, takže zostavenie projektu Maven 2 je možné vykonať jediným príkazom: mvn zostaviť. Aj keď sa multimodul a rodič používajú v spojení, nie sú navzájom rovnaké a nemali by sa zamieňať. Projekt POM (fungujúci ako nadradený) môže byť zdedený, ale tento nadradený projekt nemusí nevyhnutne agregovať žiadne moduly. Naopak, projekt POM môže agregovať projekty, ktoré z neho nededia.

Keď sa spoja všetky štyri časti rovnice, dúfajme, že uvidíte silu vzťahového mechanizmu Maven 2, ako je to znázornené na obrázku 7.

Maven nám poskytuje pekný rámec na vzájomné prepojenie projektov a prostredníctvom týchto vzťahov môžeme vytvoriť doplnky, ktoré budú opakovane použiteľné pre akýkoľvek projekt podľa Mavenových konvencií. Ale schopnosť riadiť projektové vzťahy je iba časťou celkovej Mavenovej rovnice. Zvyšok POM sa nezaoberá inými projektmi, ale nastavením budovania, informáciami a prostredím. S rýchlym pochopením toho, ako projekty vzájomne súvisia, začnime sa zaoberať tým, ako POM obsahuje informácie o samotnom projekte.

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