Seznamte se s Apache Mavenem

20. 4. 2021 Azure, Programming

Apache Maven je nástroj pro automatizaci buildů využívaný hlavně v projektech, ve kterých se objevují programovací jazyky, které jsou schopny běžet na Java Virtual Machine (JVM). Kromě automatizace buildů se obvykle používá i jako nástroj pro automatický dependency management.

Architektura Mavenu

Samotná architektura služby Apache Maven je založena na tzv. Maven Repozitářích. Maven Repozitář je defacto lokace, kde jsou uloženy artefakty.

Poznámka: Artefakt je soubor, nejčastěji ve formátu JAR (Java Archive), který byl nahrán do kteréhokoliv Maven Repozitáře a stal se tak součástí ekosystému.

Typy Maven Repozitářů

Existují 3 typy Apache Maven Repozitářů: lokální, centrální a vzdálený. Všechny tři jsou v dnešní době naprosto běžný při vývoji v programovacím jazyce Java, zejména ve frameworku Spring. Mobilní aplikace napsané v Javě nejčastěji používají buildovací nástroj Gradle, protože struktura projektů Java EE/Spring se výrazně liší od struktury mobilních aplikací napsaných v Javě a podle vývojářů mobilních aplikací nebyl Maven tak flexibilní nástroj.

Lokální repozitář je místo na pevném disku počítače, na kterém Maven používáme, obvykle ve formátu <user.home>/.m2/. V mém případě cesta vypadá takto: C:\Users\honzi\.m2. Tady najdeme všechny tzv. knihovny, které jsme si kdy stáhli. Jo, všechno je to tady.

Centrální repozitář je veřejně dostupný a obvykle spravovaný komunitou používající nástroj Maven. Mezi nejznámější a nejpoužívanější patří Maven Central. Firma Oracle má například svůj vlastní Maven repozitář a svoje knihovny poskytuje skrze něj.

Vzdálený repozitář je ve své podstatě podobný repozitáři centrálnímu až na to, že tyto repozitáře jsou obvykle spravované korporátními společnostmi, které ho využívají ke sdílení interních knihoven.

Získávání závislostí (Dependency management)

Dependency Management, do kterého se bude pouštět normální uživatel, je vcelku jednoduchý a místy až stereotypní. Pro začátek si musíme ujasnit verzování Apache Maven Artefaktů. Jednotlivé hotové nezkušební verze se označují čísly, např: 1.5.3 tedy 1 – major release, 2- minor release, 3 – patch. Nehotové verze používají pro označení svého stavu keyword SNAPSHOT. Teď, když už rozumíme označení verzí, se můžeme posunout dále.

Řekněme, že máme projekt v Mavenu a potřebujeme nějakou knihovnu. Po upravení xml souboru pom.xml, ve kterém jsou uloženy všechny tagy popisující závislosti, se Maven podívá, jestli tuto knihovnu a příslušnou verzi této knihovny máme uloženou v lokálním repozitáři. Pokud ano, vyřešeno, pokud ne, Maven se po knihovně podívá v centrálním repozitáři a uloží danou knihovnu do lokálního repozitáře. Pokud má knihovna verzi, která označuje, že knihovna je připravena do produkčního nasazení, nic se už neděje. Pokud má knihovna jakoukoliv verzi SNAPSHOT, Maven se bude v určitých intervalech koukat do centrálního repozitáře, jestli už neexistuje production ready verze této SNAPSHOT verze.

Maven POM

POM je zkratka pro Project Object Model, tedy projektový model závislostí. Je to XML soubor, který slouží k deskripci Maven projektů. Může dědit z rodičovského projektového modelu závislosti, ale to si ukážeme příště. Ještě existuje jedna verze POM nazývaná Effective POM. Effective POM je xml soubor, ve kterém jsou popsány všechny závislosti celého projektu, tedy i závislosti zděděné rodičovským POM.

schéma Maven pom.xml
Maven POM | Zdroj: java2s.com

Maven Dependencies

Maven Dependency, tedy závislost, je soubor formátu JAR, na kterém je váš projekt závislý.

Dependency Scope

Využití závislosti můžeme limitovat pomocí tzv. dependency scope. Testovací knihovny obvykle budou mít scope test, limitujeme tedy jejich scope na využití pouze v testovacím adresáři a nikde jinde. Dalšími možnostmi vlastnosti scope jsou: compile, provided a runtime.

Compile scope se používá v defaultním nastavení, není ho tedy nutné specifikovat. Závislost s dependency scopem compile bude dostupná v celé aplikaci.

Runtime scope znamená, že knihovna mající tento dependency scope není nutná ke kompilaci, ale je nutná ke spuštění programu.

Provided scope se podobá compile scopu, ale indikuje, že očekáváme od JDK, nebo od web kontejneru, doplnění této závislosti.

pozitiva a negativa dependency scope
Dependency Scope | Zdroj: stackoverflow.com

Maven Bill Of Materials

Bill of materials je převzatý pojem z výrobního prostředí. Jedná se o něco jako soupis ingrediencí potřebných k vyrobení nějakého pokrmu. Maven BOM tento princip převzal a aplikuje ho ve správě závislostí. Pomocí Maven BOM můžeme definovat běžné závislosti a jejich verze, vlastnosti, pluginy a konfigurace pluginů a buildovací profily. Aplikuje se hlavně v mikroservisních architekturách, kde není možno definovat jediný pom.xml soubor, který by se staral o vše tak, jak to bývá u monolitických aplikací. Pomocí Maven BOM můžeme docílit jednotné konfigurace napříč mikroservisy.

Závěr

V tomto článku jsme vám přiblížili co je Apache Maven a jeho základní teorii. V příštím článku si ukážeme praktické ukázky.