Než se pustíme do ANT, Mavenu nebo Gradle, musíme nejprve pochopit několik věcí, které s nimi souvisejí.
Závislost: Obecně se závislostí rozumí, když něco vyžaduje nějakou jinou věc, aby se samo provedlo. Jednoduše řečeno, „A“ má závislost na „B“, pokud „A“ vyžaduje „B“ pro své úspěšné provedení. Ve světě softwaru je závislost cokoli, co vaše aplikace vyžaduje pro své úspěšné spuštění. Je to v podstatě jakákoli externí podpůrná knihovna, kterou aplikace vyžaduje. např. zuul, hystrix, lombok, jdbc atd.
Původně jsme závislosti spravovali tak, že jsme:
- stahovali jar soubor požadované knihovny ručně z internetu a přidali jej do našeho projektu.
- napsali skript, který automaticky stáhne knihovnu z externího zdroje přes síť.
Problémy, se kterými se potýkáme před těmito nástroji:
- Přidávání závislostí ručním stahováním z internetu je velmi namáhavý úkol.
- Naše skripty mohou selhat, pokud se změní adresa URL externího zdroje přes internet.
- Je velmi obtížné identifikovat a spravovat tranzitivní závislosti v naší aplikaci.
Nástroj pro správu závislostí: Řeší a spravuje závislosti, které aplikace vyžaduje.
Nástroj pro sestavení: Automatizuje vytváření spustitelných aplikací ze zdrojového kódu. Sestavení zahrnuje kompilaci, propojení a zabalení kódu do použitelné nebo spustitelné podoby. Automatizace sestavování zahrnuje:
- Stažení závislostí
- Kompilování zdrojového kódu do binárního kódu
- Balení tohoto binárního kódu
- Spouštění testů
- Vysílání do produkčních systémů
Správa závislostí a nástroje pro sestavování v Javě:
- ANT + Ivy (2000/2004)
- Maven (2004)
- Gradle (2012)
Apache ANT (Another Neat Tool) je open source projekt společnosti Apache, vydaný v roce 2000. Jedná se o java knihovnu, která slouží k automatizaci procesů sestavování java aplikací. Lze ji použít i pro sestavování jiných než javových aplikací. Řídí se zásadou „Konfigurace nad konvencemi“. V systému Ant se různé fáze procesu sestavování nazývají „Targets“ (cíle). Sestavovací soubory ANT jsou zapsány v XML a podle konvence se nazývají „build.xml“. Obsahuje tři prvky: projekt, cíl a úlohu. Každý soubor sestavení obsahuje jeden projekt. Každá jednotlivá věc v souboru build.xml se nachází pod prvkem project. Projekt obsahuje alespoň jeden cíl (výchozí). Target v sobě obsahuje sadu úloh a definuje konkrétní stav procesu sestavování. Úloha je část kódu, kterou lze spustit. Každý uzel může mít přiřazeny atributy:
Atributy projektu:
- Název:
- Basedir: Název projektu:
- Výchozí: Kořenová složka projektu a je nepovinná: Výchozí cíl pro sestavení. Projekt může mít jeden nebo více cílů. Slouží k určení výchozího cíle projektu.
Atributy cíle:
- Název:
- Popis: Název cíle: Popis cíle.
- Závisí:
- If: Seznam všech cílů oddělených čárkou, na kterých tento cíl závisí:
- Unless: Cíl se provede, pokud je atribut true:
Příklad Build.xml:
<?xml version="1.0"?>
<project>
<target name="hello">
<echo>Hello, World</echo>
</target>
</project>
Přidání závislosti v Ant + Ivy:
<dependency org="org.projectlombok" name="lombok" rev="1.18.10"/>
Hlavní výhodou Ant je jeho flexibilita. Ant nevnucuje vývojáři žádné kódovací konvence ani strukturu projektu. V důsledku to znamená, že Ant vyžaduje, aby vývojáři psali všechny příkazy sami, což někdy vede k velkým souborům pro sestavení a jsou obtížně udržovatelné. Zpočátku neměl Ant vestavěnou podporu pro správu závislostí. Později pro účely správy závislostí převzal Apache Ivy, vyvinutý jako podprojekt projektu Apache Ant.
Apache Maven
Jedná se o nástroj pro správu závislostí a automatizaci sestavení, vydaný v roce 2004. Pokračuje v používání XML, ale překonává jeho nevýhody tím, že se řídí zásadou „konvence nad konfigurací“. Spoléhá na konvence a poskytuje předdefinované příkazy (cíle). Jeho konfigurační soubor obsahující pokyny pro sestavení a správu závislostí se podle konvence nazývá „pom.xml“ a nachází se v kořenové složce projektu.
Maven engine bere jako vstupy soubor pom.xml a projekt. Přečte soubor pom.xml a stáhne závislosti v něm uvedené jako soubory jar do místního úložiště. Poté provede životní cykly, fáze sestavení a zásuvné moduly. Nakonec vytvoří zabalený a otestovaný artefakt.
příklad souboru pom.xml:
Několik důležitých značek v souboru pom.xml:
- groupId:
- artifactId: Je to název projektu.
- verze: Představuje verzi projektu.
- packaging: Představuje konečnou podobu sestavení projektu. např. jar, war.
Přidat závislost v maven:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
Úložiště maven:
Úložiště je adresář, kde existují všechny zabalené soubory jar spolu s vlastními soubory pom. Tyto pom soubory obsahují externí závislosti daného projektu. Tímto způsobem maven rekurzivně stahuje závislosti vašeho projektu, dokud nejsou všechny požadované závislosti přítomny v místním úložišti. V nástroji maven existují tři typy úložišť:
- Místní úložiště:
- Úložiště na úrovni organizace/vzdálené úložiště:
- Centrální repozitář:
Kdykoli je v souboru pom.xml projektu uvedena závislost, maven ji vyhledá v místním úložišti. Pokud ji tam nenajde, hledá ji ve vzdáleném/org wide repozitáři. Pokud se nenachází ani tam, hledá ji v centrálním úložišti.
Maven předepisuje přísnou strukturu projektu, zatímco Ant poskytuje flexibilitu i tam. Jeho přísné konvence mají tu cenu, že je mnohem méně flexibilní než Ant – přizpůsobení cíle je velmi obtížné.
Nevýhody Mavenu:
- Správa závislostí neřeší dobře konflikty mezi různými verzemi téže knihovny.
- Přizpůsobení cílů je obtížné.
Gradle
Jedná se o open-source nástroj pro správu závislostí a automatizaci sestavení, vydaný v roce 2012. Kombinuje dobré části aplikací Apache Ant a Apache Maven, staví nad nimi a místo jazyka XML používá doménově specifický jazyk (založený na Groovy). Flexibilitu převzal od Ant a svůj životní cyklus od Maven. Řídí se také zásadou „konvence nad konfigurací“. Podporuje repozitáře Maven a Ivy pro načítání závislostí. Jeho konfigurační soubor je podle konvence známý jako „build.gradle“ a nachází se v kořenové složce projektu. Gradle dal svým krokům sestavení název „tasks“ (úkoly), na rozdíl od „targets“ (cíle) v systému Ant nebo „phases“ (fáze) v systému Maven. Společnost Google přijala Gradle jako výchozí nástroj pro sestavení systému Android OS.
Gradle nepoužívá XML. Místo toho měl vlastní doménově specifický jazyk založený na Groovy (jeden z jazyků JVM). V důsledku toho bývají skripty pro sestavení v Gradle mnohem kratší a přehlednější než skripty napsané pro Ant nebo Maven. Množství kotlového kódu je u Gradle mnohem menší.
Konfigurace Gradle
- implementace: Slouží k deklarování závislostí, které nechceme vystavit našim konzumentům při kompilaci.
- api: Používá se pro deklaraci závislostí, které jsou součástí našeho API, tj. pro závislosti, které chceme explicitně vystavit našim konzumentům.
- compileOnly: Umožňuje nám deklarovat závislosti, které mají být k dispozici pouze v době kompilace, ale za běhu nejsou potřeba. Příkladem použití této konfigurace je anotační procesor jako Lombok, který upravuje bajtový kód v době kompilace. Po kompilaci již není potřeba, takže závislost není za běhu dostupná.
- runtimeOnly: Umožňuje nám deklarovat závislosti, které nejsou potřeba v době kompilace, ale budou k dispozici v době běhu. Příkladem je SLF4J, kde do konfigurace
implementation
zahrnemeslf4j-api
a do konfiguraceruntimeOnly
implementaci tohoto API (napříkladslf4j-log4j12
nebologback-classic
). - testImplementation: Podobně jako
implementation
, ale závislosti deklarované pomocítestImplementation
jsou k dispozici pouze během kompilace a běhu testů. Můžeme ji použít pro deklaraci závislostí na testovacích frameworcích jako JUnit nebo Mockito, které potřebujeme pouze v testech a které by neměly být dostupné v produkčním kódu. - testCompileOnly:
- testRuntimeOnly: Podobně jako
compileOnly
, ale závislosti deklarované pomocítestCompileOnly
jsou dostupné pouze při kompilaci testů, nikoli za běhu:
Projekty a úlohy v Gradle
Každé sestavení Gradle se skládá z jednoho nebo více projektů. Každý projekt se skládá ze sady úloh. Každá úloha představuje jednu práci, kterou sestavení provede, např. vygeneruje JavaDoc, zveřejní některé archivy v úložišti atd.
příklad buildu.gradle
Úložiště Gradle:
„Aliasy“ v Gradle se používají v případě přidání repozitářů Maven do sestavení našeho projektu. Tyto aliasy jsou následující:
- mavenCentral():
- jcenter():
- mavenLocal(): Tento alias označuje závislosti, které jsou získávány z úložiště Maven JCenter společnosti Bintray:
Příklad: Přidejte centrální repozitář Maven do našeho projektu, přidejte následující úryvek kódu do našeho souboru ‚build.gradle‘:
repositories {
mavenCentral()
}
Přidejte závislost v Gradle:
compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
Výhody:
- Dobře zvládá tranzitivní závislosti. Pokud v projektu existuje konfliktní tranzitivní závislost, pak pro její vyřešení vybere nejnovější verzi závislosti. Například závislost „A“ interně vyžaduje závislost „C“ s verzí 2.0 a závislost „B“ interně vyžaduje závislost „C“ s verzí 3.0. To znamená, že závislost „A“ interně vyžaduje závislost „C“. Pak Gradle použije nejnovější verzi závislosti ‚C‘.
- Konfigurační soubory Gradle jsou menší a čistší, protože používá jazyk specifický pro danou doménu, založený na Groovy namísto XML.
- Gradle používá koncept inkrementálního sestavování a vyhýbá se práci tím, že sleduje vstup a výstup úloh a spouští pouze to, co je nezbytné, a zpracovává pouze soubory, které se změnily, pokud je to možné, a proto pracuje rychleji než maven.
.