Programování

Maven 2 POM demystifikován

Budování projektu je složité podnikání. Vzhledem k desítkám úkolů vyžadovaných při převodu vašeho nástroje na pracovní program existují doslova stovky nástrojů, které dělají vše od generování zdrojového kódu, přes kompilaci, testování, distribuci až po přípravu ranní kávy (pokud najdete jednoho, drahý čtenáři, dejte mi vědět). Mnoho z těchto programů je vynikající v tom, co dělají. Bohužel pro ty z nás, kteří spravujeme rozsáhlé systémy budování pro život, existuje zřídka mnoho společného; každý program vyžaduje vlastní různorodou instalaci a esoterickou konfiguraci. Stalo se nevyhnutelnou skutečností našich životů, že většina systémů pro sestavení je postavena na zakázku ručním lepením těchto nástrojů pomocí několika homebrew skriptů (ano, Ant skripty se počítají).

Více než jiný nástroj pro sestavení je Maven sestavením rámec. Čistě odděluje váš kód od konfiguračních souborů, dokumentace a závislostí. Maven je překvapivě flexibilní v tom, že umožňuje uživatelům konfigurovat většinu aspektů jejich kódu, stejně jako v řízení chování modulů plug-in, jednotlivých cílů a dokonce samotného životního cyklu sestavení. Maven je skutečná struktura a uvnitř těchto zdí váš projekt přebývá; chce to být vstřícný hostitel.

Problém však stále přetrvává: správa práce tisíců skriptů pro vlastní sestavení v rámci jednoho rámce je těžká a, aby byla provedena správně, vyžaduje mnoho informací. Naštěstí byl tým Maven 2 docela úspěšný. Učení z chyb Maven 1, bezpočet požadavků uživatelů, vyladění a aktualizace, Maven 2 je výkonnější než kdy dříve. Bohužel s velkou silou přichází skvělá konfigurace. Aby artefakty Maven 2 mohly být snadno přenosnými jednotkami, spadá tato složitá konfigurace do jednoho souboru. Zadejte Maven POM.

Co je POM?

POM znamená projektový objektový model. Jedná se o XML reprezentaci projektu Maven uchovávaného v souboru s názvem pom.xml. V přítomnosti lidí z Mavenu mluví o projektu ve filozofickém smyslu, nad rámec pouhé sbírky souborů obsahujících kód. Projekt obsahuje konfigurační soubory, zapojené vývojáře a role, které hrají, systém sledování defektů, organizaci a licence, URL, kde projekt žije, závislosti projektu a všechny ostatní malé kousky, které přicházejí do hry za účelem poskytnutí kódu život. Projekt je jednotným kontaktním místem pro všechny věci, které s ním souvisejí. Ve skutečnosti ve světě Maven nemusí projekt vůbec obsahovat žádný kód, pouze pom.xml. S několika takovými typy projektů se setkáme dále v článku.

Rychlý strukturální přehled

POM je velký a složitý, takže jeho rozdělení na kousky usnadňuje trávení. Pro účely této diskuse jsou tyto části seskupeny do čtyř logických jednotek, jak je znázorněno na obrázku 1: POM vztahy, informace o projektu, nastavení sestavení a prostředí sestavení. Začneme diskusí o vztazích POM.

Níže je uveden seznam prvků přímo pod prvkem projektu POM. Všimněte si toho modelVersion obsahuje 4.0.0. To je v současné době jediná podporovaná verze POM pro Maven 2 a je vždy vyžadována. Definice schématu XML Maven 4.0.0 se nachází na adrese //maven.apache.org/maven-v4_0_0.xsd. Jeho prvky nejvyšší úrovně jsou následující:

4.0.0

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

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

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

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

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

POM vztahy

Naším prvním úkolem je prozkoumat vztahy mezi projekty, které jsou znázorněny na obrázku 2 jako levý horní roh grafu na obrázku 1.

Projekty musí nějakým způsobem souviset. Od vytvoření prvních assemblerů měly softwarové projekty závislosti; Maven zavedl více forem vztahů dosud nevyužitých v takové formě pro projekty Java. Tyto vztahy jsou Maven souřadnice, závislosti na souřadnicích, dědičnost projektu a agregace.

Souřadnice

Každý projekt Maven obsahuje svůj vlastní jedinečný identifikátor, dabovaný projektem souřadnice, který funguje jako adresa artefaktu a dává mu jedinečné místo ve vesmíru Maven. Pokud by projekty neměly způsob, jak se navzájem propojit, nebyly by potřebné souřadnice. To znamená, že kdyby měl vesmír jen jeden dům, proč by potřeboval adresu jako 315 Cherrywood Lane?

Níže uvedený kód je minimální POM, který Maven 2 umožní -, , a jsou všechna povinná pole. Působí jako vektor v prostoru Maven s seskupovačem prvků, identifikátorem a časovým razítkem.

4.0.0org.codehaus.mojoA1

Ve světě Maven tyto tři hlavní prvky (Mavenova trojice - viz její sláva!) Tvoří souřadnice POM. Souřadnice jsou znázorněny na obrázku 3.

Možná tento POM sám o sobě není tak působivý. Zlepší se to.

Závislosti

Jedním z nejsilnějších aspektů Mavenu je jeho zpracování závislostí projektu a v Maven 2 to zahrnuje tranzitivní závislosti. Obrázek 4 ukazuje, jak je budeme graficky znázorňovat.

Správa závislostí má dlouhou tradici v tom, že je komplikovaným nepořádkem pro cokoli jiného než pro ty nejchudší projekty. „Jarmageddon“ rychle následuje, protože strom závislostí se stává obrovským, komplikovaným a trapným pro architekty, kteří jsou opovrhováni novými absolventy, kteří „by to mohli udělat lépe“. Následuje „Jar Hell“, kde verze závislostí na jednom systému nejsou úplně stejné verze jako ty používané pro vývoj; mají buď nesprávnou verzi, nebo konfliktní verze mezi podobně pojmenovanými JAR. Věci se proto začínají lámat a určovat, proč se to ukazuje jako obtížné. Maven řeší oba tyto problémy tím, že má společné lokální úložiště, ze kterého může odkazovat na správné projekty, verze a vše.

Dědictví

Jednou z funkcí, kterou Maven 2 přináší z Maven 1 dní, je dědičnost projektu, jak je znázorněno na obrázku 5. V sestavovacích systémech, jako je Ant, lze dědičnost jistě simulovat, ale Maven učinil další krok při explicitním dědění projektu na objektový model projektu.

Následující kód definuje nadřazený POM v Maven 2:

4.0.0org.codehaus.mojob2pom

Tento rodič vypadá podobně jako náš první POM, s malým rozdílem. Všimněte si, že jsme nastavili obal zadejte jako pom, což je vyžadováno pro nadřazené i agregační projekty (více se budeme věnovat obal v sekci „Nastavení sestavení“). Pokud chceme výše uvedený projekt použít jako nadřazený, můžeme jej změnit org.codehaus.mojo: a POM být:

4.0.0org.codehaus.mojob2A

Je důležité si uvědomit, že všechny POM dědí od rodiče, ať už je to výslovně definováno nebo ne. Tento základní POM je známý jako „super POM“ a obsahuje hodnoty zděděné ve výchozím nastavení. Snadný způsob, jak se podívat na výchozí konfigurace super POM, je vytvořit jednoduchý pom.xml s ničím jiným než modelVersion, groupId, artifactId, a verzea spuštění příkazu mvn help: efektivní-pom.

Kromě jednoduchého nastavení hodnot k dědění mají rodiče také pravomoc vytvářet výchozí konfigurace pro své děti, aniž by jim ukládaly hodnoty. Správa závislostí je obzvláště silný nástroj pro konfiguraci sady závislostí prostřednictvím společného umístění (rodič POM). The Správa závislostí syntaxe prvku je podobná syntaxi v sekci závislostí. Co však dělá, je umožnit dětem zdědit nastavení závislostí, ale nikoli samotnou závislost. Přidání závislosti pomocí řízení závislostí prvek ve skutečnosti nepřidá závislost na POM, ani nepřidá závislost dětem; vytvoří výchozí konfiguraci pro jakoukoli závislost, kterou se dítě může rozhodnout přidat do své vlastní sekce závislostí. Nastavení podle řízení závislostí platí také pro aktuální konfiguraci závislostí POM (ačkoli konfigurace přepsané uvnitř prvku závislosti mají vždy přednost).

Agregace

Projekt s moduly je známý jako multimodulární projekt. Moduly jsou projekty, které POM vypíše jako seznam. Multimodulární projekty o svých modulech vědí, ale opak nemusí být nutně pravdivý, jak je znázorněno na obrázku 6.

Za předpokladu, že nadřazený POM je umístěn v nadřazeném adresáři, kde POM pro projekt A životy, a že projekt A také sídlí v adresáři se stejným názvem, můžeme změnit rodičovský POM b agregovat dítě A přidáním jako modulu:

4.0.0org.codehaus.mojob2pomA

Teď, když jsme utekli MVV kompilace v základním adresáři byste viděli začátek sestavení s:

[INFO] Hledání projektů ... [INFO] Pořadí sestavení reaktoru: [INFO] Nepojmenovaný - org.codehaus.mojo: b: pom: 2 [INFO] Nepojmenovaný - org.codehaus.mojo: a: jar: 2 

Životní cyklus Maven se nyní spustí až do fáze životního cyklu zadané ve správném pořadí; to znamená, že každý artefakt je postaven jeden po druhém, a pokud jeden artefakt vyžaduje, aby byl nejprve vytvořen jiný, bude.

Poznámka k dědičnosti vs. agregaci

Dědičnost a agregace vytvářejí příjemnou dynamiku pro řízení sestavení prostřednictvím jediného POM na vysoké úrovni. Často uvidíte projekty, které jsou rodiči i multimodulemi, například výše uvedený příklad. Jejich doplňkovost z nich dělá přirozenou shodu. Dokonce i jádro projektu Maven 2 prochází jedním nadřazeným / multimodulárním POM org.apache.maven: maven, takže sestavení projektu Maven 2 lze provést jediným příkazem: MVV kompilace. Ačkoli se používá ve spojení, multimodul a nadřazený prvek nejsou stejné, a neměly by být zaměňovány. Projekt POM (fungující jako nadřazený) může být zděděn, ale tento nadřazený projekt nemusí nutně agregovat žádné moduly. Naopak, projekt POM může agregovat projekty, které z něj nedědí.

Když se dají dohromady všechny čtyři části rovnice, doufejme, že uvidíte sílu mechanismu vztahů Maven 2, jak je znázorněno na obrázku 7.

Maven nám poskytuje pěkný rámec pro vzájemné propojení projektů a prostřednictvím těchto vztahů můžeme vytvářet pluginy, které lze opakovaně použít v jakémkoli projektu podle Mavenových konvencí. Ale schopnost spravovat projektové vztahy je jen částí celkové Mavenovy rovnice. Zbytek POM se nezabývá jinými projekty, ale nastavením sestavení, informacemi a prostředím. S rychlým pochopením toho, jak se projekty vzájemně vztahují, pojďme se podívat na to, jak POM obsahuje informace o správném projektu.