Abych udržel tempo publikací na blogu, tak každý článek nemůže přinášet zásadní téma. Zůstaňme tedy při zemi, u něčeho staršího. Ač jsem někdy Maven haněl, tak tentokrát bych se ho rád zastal. Doporučuji paralelní build a použití démona, který (dle mého pozorování) není tak rozšířený, jak by býval mohl být.

Přehled buildovacích nástrojů

Doporučuji k přečtení článek My final take on Gradle (vs. Maven). Nechci papouškovat celý, ale stručné shrnutí.

Ant

Ant taky pamatuju, takže můžu potvrdit, že neřešil závislosti a chyběla konzistence mezi projekty.

Maven

Maven přináší závislosti a konvence. Dnes už se jedná o běžný přístup konvence před konfigurací (convention over configuration, není nutné explicitně konfigurovat, máte implicitní smysluplné nastavení). Pro specifické úpravy si můžete napsat vlastní plugin, což není zase tak snadné. Nemá podporu paralelního build a i ve verzi 3 stále označen jako experimentální. Očekávané zrychlení paralelního buildu je 20 až 50 %.

Nicolas Fränkel v odkazovaném článku tvrdí, a já s ním souhlasím, že málo flexibility není bug ale žádoucí vlastnost.

Gradle

Gradle využívá Maven závislosti a přidává flexibilitu, které se až vymyká z rukou. Od začátku myslí na rychlost buildu a systém cachování. Prsí se, že oproti Mavenu jsou v některých případech až 100 krát rychlejší.

Maven Daemon

Maven Daemon je dlouhodobý proces běžící na pozadí. Start JVM není úplně zanedbatelná operace. S démonem tedy ušetříte start JVM při každém buildu a hlavně nepřijdete o JIT (Just-In-Time) optimalizace. V neposlední řadě dostaneme vylepšený výstup paralelního build na konzoli.

Vlastní pozorování

V současné době mimo jiné přispívám do open source projektu PowerAuth. Níže naleznete dobu buildu na MacBook Pro s M1 procesorem. mvnd je příkaz pro build pomocí Maven Daemon.

Příkaz Čas buildu Poznámka
mvn clean package 46,6 s  
mvn package 30,6 s  
mvn clean package -T 1C 40 s Paralelní běh, 1 thread na dostupný core.
mvn package -T 1C 28,6 Paralelní běh, 1 thread na dostupný core.
mvnd clean package 37,9 s Démon, paralelně spouští by default.
mvnd package 26,4 s Démon, paralelně spouští by default, první běh.
mvnd package 22,8 s Démon, paralelně spouští by default, po zahřátí.


Úskalí paralelního buildu

Jak jsme si již řekli, paralelní build v Mavenu stále není plně podporován. Kromě problémových pluginů můžete narazit i na problémy ve svém kód, který třeba nezvládne paralelní běh integrační testů, takže si budete muset zamést i před svým prahem.

Závěr

Ač zrychlení paralelního buildu v Mavenu nedosahuje hodnot, jaké reklamuje Gradle, tak přesto by byla škoda toho nevyužít. Když už se dáte cestu paralelního buildu v Mavenu, doporučuji využít Maven Daemon. Při práci ve větších týmech a v situaci, kdy programátoři přechází mezi projekty, dávám přednost předvídatelnosti před rychlostí.

Související