Javarevisited

Krátce řečeno, ačkoli Maven a ANT jsou nástroje pro sestavování, hlavní rozdíl je v tom, že maven poskytuje také správu závislostí, standardní rozvržení projektu a jeho správu. Pokud jde o rozdíl mezi Mavenem, ANT a Jenkinsem, později je to nástroj pro kontinuální integraci, který je mnohem více než nástroj pro sestavování. Pomocí nástrojů Jenkins nebo Hudson můžete nastavit prostředí CI a automaticky sestavit, otestovat a nasadit svůj projekt Java. A nyní poslední, hlavní rozdíl mezi Jenkinsem a Hudsonem, oba pocházejí ze stejného zdrojového kódu, ale jeden je uzavřený, zatímco druhý je open source. Podrobnosti si můžete přečíst v tomto článku.
Nyní začneme dlouhým příběhem, jaký je rozdíl mezi Mavenem a ANT nebo rozdíl mezi Mavenem a Jenkinsem nebo Maven vs Hudson jsou některé z často diskutovaných otázek mezi vývojáři Javy při vývoji. No všechny čtyři, tedy ANT, Maven, Jenkins a Hudson, jsou nástroje, které pomáhají vývojářům v Javě při sestavování, testování jednotek, kontinuální integraci (CI) a řízení projektů.
V tomto článku o Javě prozkoumáme jednotlivé nástroje Maven, ANT, Jenkins a Hudson, abychom získali základní představu o tom, co jsou zač, jaký přínos nabízejí a jak se používají v projektech Java JEE. Jen pro základní představu: ANT je známý nástroj pro sestavování, pravděpodobně nejstarší ze všech. Nástroj pro sestavování slouží k vytváření výstupů, jako je soubor JAR nebo soubor WAR, ze zdrojových kódů a zdrojů Javy pro nasazení.
Maven přišel po ANT a nabízí mnohem více než nástroj pro sestavování. Hlavní rozdíl mezi ANT a Mavenem spočívá v tom, že v ANT musíte vše definovat, tj. zdrojový adresář, adresář pro sestavení, cílový adresář atd. zatímco Maven přejímá princip Convention over configuration.
To znamená, že Maven má předdefinovanou strukturu projektu, tj. standardní adresář pro zdrojové soubory, testovací soubory a zdroje. Na druhou stranu jsou Jenkins a Hudson nástrojem Continues Integration, který vám dává možnost automatizovat proces sestavení a nasazení.
Pomocí Jenkins nebo Hudson můžete spustit sestavení, kdykoli vývojář odevzdá kód, zjistit, zda se projekt kompiluje v pořádku, spustit jednotkové testy, vytvořit sestavení nebo dokonce nasadit v prostředí QA nebo v produkčním prostředí.
Podobně můžete mít v Jenkins nebo Hudson zavedený proces denního sestavení, nočního sestavení nebo týdenního sestavení. V příštím díle se podrobněji seznámíme s Mavenem, ANT, Jenkinsem a Hudsonem a pochopíme rozdíly mezi nimi.
Pokud s Mavenem teprve začínáte, doporučuji vám nejprve projít komplexní kurz Mavenu, například Apache Maven: Beginner to Guru, abyste se naučili základy. Pomůže vám nejen sestavit a nasadit projekty Java a Spring Boot pomocí Mavenu, ale také se do hloubky naučit samotný Maven.

Maven vs ANT

Od doby, kdy byl Maven vydán, mnoho programátorů v Javě porovnává Maven a ANT, což je celkem přirozené. Dokonce i mně trvalo nějakou dobu, než jsem si Maven osvojil, protože jsem byl velmi zvyklý na proces sestavování pomocí ANT. Nakonec jsem si uvědomil, že Maven nabízí jako nástroj pro sestavování větší pohodlí než ANT a také prosazuje společný způsob sestavování javovských aplikací mezi více projekty, vývojáři a organizacemi.
Před přechodem na Maven jsem pracoval s velmi složitými skripty ANT, vlastně každý projekt, na kterém pracuji, má jinou strukturu sestavování než ostatní.
Pro vytvoření verze je třeba strávit značný čas pochopením celého procesu sestavování, např. odkud přicházejí knihovny, zda přicházejí jako JAR nebo je projekt sestavuje během sestavování atd. Maven mnohé z těchto problémů řeší zavedením standardní konvence a lepší správy závislostí.
Pokud bychom měli porovnat Maven a ANT, následuje můj seznam rozdílů mezi Mavenem a ANT :

1) Jedním z hlavních rozdílů mezi Mavenem a ANT je, že Maven vyžaduje méně konfigurace než ANT, protože pracuje na principu konvence nad konfigurací a předpokládá rozumné výchozí nastavení např.např. zdrojový soubor Javy v adresáři ${basedir}/src/main/java, zdroje v adresáři ${basedir}/src/main/resources, testovací případy JUnit v adresáři ${basedir}/src/test/java atd.
Vytváří také soubory tříd Javy v adresáři ${basedir}/target/classes a soubor JAR v adresáři ${basedir}/target. Naproti tomu ANT vyžaduje všechny tyto adresáře dodané jako konfiguraci, obvykle v souboru pro sestavení ANT, např. build.xml.
2) Dalším významným rozdílem mezi Mavenem a ANT je správa závislostí. Maven zavedl koncept úložiště, což je centrální místo pro ukládání všech knihoven, souborů JAR atd. Maven umožňuje používat centrální úložiště Mavenu i místní úložiště a automaticky stahovat závislosti během procesu sestavování.
Proti tomu projekty založené na ANT obvykle používají ${lib} jako adresář pro ukládání závislostí. Změna a aktualizace závislostí je v Mavenu mnohem jednodušší než v ANT, protože nemusíte závislosti stahovat ručně. Existence centrálního úložiště v rámci celé organizace také pomáhá odstranit redundanci v různých projektech.
3) Třetí a nejdůležitější rozdíl mezi Mavenem a ANT spočívá v tom, že Maven nabízí konzistentní a společné rozhraní pro sestavování projektů Java. Stačí stáhnout projekt a spustit mvn install pro jeho sestavení. Také při znalosti konvencí Mavenu a pohledu do pom.xml lze snadno pochopit, kde jsou zdrojové soubory a jaké jsou závislosti projektu.

4) Další technický rozdíl mezi ANT a Mavenem je, že úloha ANT nemá žádný životní cyklus, je třeba definovat cíle a jejich závislosti. Zatímco Maven má životní cyklus, který je vyvolán při spuštění příkazů jako mvn install. Maven provede řadu kroků jako výsledek tohoto příkazu a vytvoří artefakty, např. soubor JAR, který je koncem životního cyklu.
5) Maven také prosazuje standardní konvenci pojmenování artefaktů definovanou pomocí groupId, artifactId a verze. Další rozdíl mezi ANT a Mavenem spočívá v tom, že Maven je více než jen nástroj pro sestavování, funguje jako nástroj pro správu projektů a může generovat zprávy atd.

Maven vs. Jenkins a Hudson

Jenkins a Hudson jsou nástroje pro kontinuální integraci, běžně známé jako CI frameworky. Umožňují projektu Java automatizovat proces sestavení a nasazení. Pomocí nástrojů CI, jako je Hudson nebo Jenkins, můžete automaticky vytvářet hodinová nebo denní sestavení, můžete také automaticky spouštět jednotkové testy a můžete sestavení nasadit do prostředí QA nebo produkčního prostředí.
To pomáhá, pokud pracujete na velkém projektu a vývojový tým je rozptýlen na více místech. Nástroje CI mohou spustit sestavení vždy, když vývojář odevzdá kód, a zkontrolovat, zda se projekt kompiluje nebo ne.
Mimochodem, Jenkins a Hudson pocházejí ze stejného zdrojového stromu. Hudson byl původní projekt, který byl open source a podporovaný společností Sun.
Když společnost Oracle koupila Sun, převzala kontrolu nad názvem Hudson a logistickou platformou Hudson. Mnoha přispěvatelům do open source se to nelíbilo, což vyústilo v Jenkins, který je do značné míry řízen komunitou.
Pokud bychom měli porovnat Maven a Jenkins nebo Hudson, následující by byl můj seznam rozdílů mezi Mavenem a Hudsonem nebo Jenkinsem :

1) Hlavní rozdíl mezi Mavenem a Jenkinsem nebo Hudsonem je, že Maven je nástroj pro sestavování, který umí sestavit projekt, a Jenkins nebo Hudson poskytuje spouštěč pro sestavení. Pomocí nástroje Jenkins nebo Hudson nebo jakéhokoli nástroje CI můžete řídit, kdy se má sestavení automaticky spustit.
2) Jenkins může používat Maven jako nástroj pro sestavení. Jenkins nebo Hudson také umí mnohem víc než jen sestavovat aplikace, mohou spouštět všechny jednotkové testy, nasazovat výstupy na nakonfigurované servery atd. V podstatě je rozdíl v tom, že Maven je nástroj pro sestavování, zatímco Jenkins nebo Hudson je nástroj pro průběžnou integraci.
To je vše o rozdílech mezi Mavenem a ANT, Jenkinsem nebo Hudsonem atd. Maven je dnes v podstatě standardem sestavování projektů v Javě a můžete si ho přizpůsobit tak, aby vyhovoval vašemu staršímu prostředí založenému na ANT. Některé organizace mají také nástroje CI, jako je Jenkins, které lze použít spolu s Mavenem k automatizovanému procesu sestavování, testování a nasazování.
Další vzdělávání
Základy Mavenu od Bryana Hansena
Crash kurz Mavenu
Java Maven :101 Přestaňte sestavovat programy v Javě složitým způsobem!