Nedávno se objevila na stránkách Sonatype prosba o vyzkoušení Mavenu 3 RC1 (link). Cílem této prosby je snaha o stihnutí slibovaného termínu vydání Mavenu 3 k prvnímu říjnu 2010. Neváhali jsme tedy a vyzkoušeli, co se nám Maven 3 snaží přinést a co bude znamenat přechod ze stávající verze.

Novinky

Nejprve si projděme novinky, které si pro nás Maven 3 připravil:

  • paměť problémů s artefakty – pro mě velice užitečná vlastnost; pokud dojde k problému při získávání nějaké závislosti projektu, Maven si uloží tento incident a při dalším buildu se již nebude repository dotazovat; tato cache je časově omezená a zneplatní se také v případě změny adresy repository (samozřejmě, že jde vymazat i ručně – ukládá se v lokální repository)
  • rozdělení <repositories> a <pluginRepositories> – další velmi užitečná vlastnost; zatímco Maven 2 stahoval pluginy z obou lokací, Maven 3 striktně odděluje závislosti z klasických repository a z repositories pro pluginy; navíc v Maven 2 byly stahovány vždy nejnovější pluginy (pokud nebyla uvedena verze) – tedy i SNAPSHOT; nyní jsou stahovány pouze normální release pluginů a navíc Maven 3 doporučuje uvádět verzi pluginu u všech používaných pluginů
  • úprava stahování tranzitivních závislostí – u Mavenu 2 se nám stávalo, že mnohdy špatně rozpoznal tranzitivní závislosti a to vedlo ke konfliktům ve verzích knihoven; Maven 3 slibuje zlepšení díky novému systému Aether
  • původ knihoven – v lokální repository jsou nově uloženy informace, které určují odkud byly knihovny staženy (z jaké repository); to by mělo přinést lepší reprodukovatelnost buildů a dohledání případných problémů
  • striktnější validace pom.xml souboru – XML soubor je nyní striktnější a upozorňuje na  mnohem více chyb
  • konec podpory legacy repository a profiles.xml – Maven 3 již dále nepodporuje legacy strukturu repository (zajišťující kompatibilitu s první verzí Mavenu) a také profily již nelze definovat mimo pom.xml či settings.xml (což jsme nikdy nepouživali, takže nevím jestli je to dramatická změna)
  • změna ${pom.version} za ${project.version} a ${pom.artifactId} za ${project.artifactId} – celkem logická změna zástupné proměnné pro projekt
  • site plugin – jelikož v rámci refaktorizace autoři odstranili generování Maven site dokumentace z jádra systému, tak je tento systém prozatím nefunkční (důvodem odstranění je možnost použití alternativních pluginů); na nové verzi site pluginu už se ale pracuje, takže náprava jistě nebude dlouho trvat
  • mnohé další – Maven 3 přináší mnohé další novinky jako je například více procesorové zpracování apod.; podrobnější seznam naleznete zde

Kompatibilita

Jak sami autoři uvádějí, zachovat kompatibilitu se stávající verzí byla nejenže jejich priorita, ale také jeden z nejtěžších úkolů, které před nimi stály. Všichni si určitě pamatujeme, jak jsme přecházeli z Mavenu 1 na Maven 2 – jednalo se úplně odlišné nástroje a přechod nebyl jednoduchý. Proto nyní mile překvapí, že na většině projektů nemusíte měnit zhola nic – vše prostě funguje na výbornou.

Co rozhodně potěší je zlepšení logování Mavenu. Pokud nastane nějaká chyba či upozornění Maven na ni velmi konkrétně upozorní a tím pomůže jejímu rychlému odstranění – při přechodu z Maven 2 se jedná zejména o upozornění na duplicity definice repository, či verze pluginu. Při našich testech jsme se jinak s jinými typy problémů nesetkali (až na typ repository legacy, což Maven vyhodnotí jako chybu a přes ni není schopen přejít). Za úpravu zobrazovaných informací během buildu si tedy Maven 3 od nás odnáší velkou pochvalu.

Pokud byste přeci jenom měli nějaký problém například s kompatibilitou pluginů, zde je seznam pluginů a jejich stav vůči nové verzi Mavenu. Z toho seznamu nás prozatím nejvíce mrzí asi Selenium a site plugin (viz výše), který jsme s Mavenem na některých projektech používali. Snad se tento problém co nejdříve vyřeší.

Maven 3 a Hudson

Většina z vás jistě používá, stejně jako my, velmi silnou kombinaci Maven a Hudson pro průběžné integrační testování. Zajímalo nás tedy, zdali bude možné používat Hudson i s Maven 3.

Bohužel jak se zdá, tak si zatím Maven 3 s Hudsonem nerozumí – tedy mluvíme-li o přímé podpoře Maven 2 jobů. Pokud jsme zkusili vytvořit Maven job v Hudsonu s Mavenem 3, tak se build nepodařil a skončil chybou, na kterou lze narazit na JIRA Hudsonu (link). Pokud vytvoříte externí job, tak pak samozřejmě vše funguje bez problémů.

Blízká se ovšem na lepší časy – Maven 3 poskytuje nové API, které v budoucnu umožní lepší integraci Hudsonu a Mavenu. Díky tomu bude konfigurace jobů jednodušší a lehčeji spravovatelná (viz wiki Hudsonu). Autoři Hudsonu zatím argumentují tím, že Maven 3 není finální a API se může měnit – proto zatím jeho podpora není v aktuální verzi Hudsonu. Věříme ovšem, že se ji dočkáme brzy po uvedení konečné verze novéhu Mavenu. Něco málo o použití nového API v Hudsonu naleznete na této stránce.

Závěr

Maven 3 nás velice potěšil – ať už se jedná o perfektní zpětnou kompatibilitu, zlepšené logování a spoustu nových funkcí tak autoři odvedli dobrou práci a je vidět, že Maven posunuli opět o krok dál. Zatím zamrzí drobné problémy s pluginy, které mohou být překážkou v nasazení nové verze, ale věříme, že budou rychle odstraněny ve finální verzi, či krátce po jejím vydání. Podělte se s námi v diskuzi o vaše zkušenostmi s Mavenem 3 a s tím co se vám na něm líbí, či co vás trápí.