Java má veľa spoločného so svetom open source (možno by sa dala považovať za jeho súčasť). A ako taká má jednu vlastnosť charakteristickú pre open source – modularitu knižníc. Pod týmto pojmom myslím to, že svet knižníc tretích strán, ktoré v Jave viete použiť, je tvorený obrovským množstvom malých knižníc. Aby ste mohli spustiť svoju aplikáciu, potrebujete (fyzicky dostať na svoj počítač) aj niekoľko desiatok takýchto knižníc, a čo je horšie, tieto knižnice majú tiež svoje závislosti, ktoré musíte nájsť. Aj keď je táto modularita ohromný nástroj, je to zároveň neuveriteľne komplexný problém. A ako taký je ručne ťažko riešiteľný, a preto vznikli nástroje, ktoré ho pomáhajú riešiť. Jedným z nich je aj Apache Ivy.
Ako som povedal, príprava všetkých knižníc tretích strán vie byť v Jave značne komplikovaný problém. A preto aj nástroj, ktorý ho rieši, je značne komplikovaný. A preto ani tento článok nebude úplne jednoduché čítanie. Ak ale hľadáte podobný nástroj, alebo už ste o Apache Ivy počuli a chcete sa dozvedieť viac, mohol by vám byť v niečom užitočný.
Apache Ivy je podprojekt projektu Apache Ant, ktorého hlavnou úlohou je automatizácia procesov. Ivy (z angličtiny „brečtan“) sa špecializuje na úlohu získavania súborov na základe ich závislostí medzi sebou. Dôležité je si uvedomiť samotnú podstatu problému, ktorú Ivy rieši, pretože potom vám jednotlivé jeho funkčnosti začnú dávať väčší zmysel. Tá podstata je, že máte systém, ktorý pozostáva zo súborov zoskupených do malých podmnožín (súbory, ktoré spolu veľmi úzko súvisia, napríklad zdrojové kódy, a tie isté zdrojové kódy preložené do binárnej podoby). Okrem toho sú v systéme definované závislosti medzi týmito podmnožinami (ak sú podmnožiny body, tak spolu so závislosťami vytvárajú štruktúru grafu). Takže máte súbory a závislosti medzi nimi. Takto vyzerá systém a teraz je podstatné, čo s ním chcete robiť. Chcete z neho vytiahnuť jeden súbor z nejakej podmnožiny a všetky súbory na ktorých práve tento jeden súbor závisí (napríklad ich potrebuje na to, aby ste ho mohli spustiť a on bude korektne fungovať). To je celé. To je základná myšlienka. Ivy sa oficiálne označuje ako tranzitívny manažér závislostí. To tranzitívny je tam preto, lebo nerobí len jeden prechod od aktuálneho súboru k ďalšiemu, ale je schopný vytiahnuť závislosti do ľubovoľnej hĺbky.
Na čo je to dobré? No, jedným z príkladov sú balíky v Jave. V jednom z predchádzajúcich článkov som písal, že Java očakáva, že všetky potrebné triedy (často zabalené v knižniciach – jar súboroch) nájde vo svojej Java Class Path. Váš program môže závisieť na nejakých balíkoch, ktoré môžu závisieť na ďalších a tak ďalej. Výsledok môže byť, že hľadať ručne a pripravovať ich môže byť komplikovaná a pracná robota. Ivy sa snaží riešiť obe tieto problémy. Ten prvý pomocou systému popisných súborov, pomocou ktorých sa orientuje, ktoré závislosti daný balík potrebuje a ten druhý pomocou Ivy knižnice, ktorá dokáže vykonávať príkazy Ivy, a ktorá vykoná tranzitívne stiahnutie potrebných závislostí.
Ivy potrebuje tieto balíky odniekiaľ stiahnuť. A tu sa dostávame k pojmu repozitár. To je miesto, kde Ivy dokáže vyhľadávať balíky a získavať ich. Nenachádzajú sa tam len samotné súbory, ale aj popisy ich závislostí, takže Ivy vie z takého zoznamu získať súbor aj so všetkými jeho závislosťami (ak sú všetky v repozitári prítomné). Aby to Ivy nemuselo robiť pre každý prípad, existuje niečo, čo sa nazýva cache. Je to lokálna kópia repozitára, kde sa Ivy pozerá v prvom rade a ak tam nenájde to, čo je potreba, tak pristúpi k repozitáru. Aby sme si to pekne utriedili, poďme si zrekapitulovať pojmy Ivy sveta:
Modul – skupina súborov (predtým som to označoval ako podmnožinu), ktoré spolu úzko súvisia. Modul je základná väzobná jednotka pre Ivy, čo znamená, že väzby sú vytvárané medzi modulmi a nie súbormi. Modul je tiež definovaný Ivy popisným súborom, ktorý hovorí, čo je to za modul (názov, verzia, stav vývoja atď), aké súbory poskytuje a čo sú jeho závislosti. Repozitár je potom ako sieť modulov, ktoré sa medzi sebou odkazujú – graf.
Artefakt – jeden súbor, ktorý je súčasťou niektorého modulu. Modul môže mať ľubovoľný počet súborov, ale ako som písal, mali by to byť súbory, ktoré medzi sebou úzko súvisia. Artefakt predstavuje najmenšiu jednotku (ďalej nedeliteľnú) v Ivy systéme. A tiež, ako som už písal, je hlavnou úlohou Ivy vyhodnocovať, ktoré súbory – artefakty sú potrebné a poskytnúť ich.
Dependency – väzba medzi modulmi. V rámci väzby definujeme hlavne názov modulu, ale môžem uviesť verziu, stav vývoja alebo branche.
Repository – miesto s pripravenými modulmi a ich súbormi. Fyzická realizácia môže byť napríklad FTP server, alebo zdieľaný priečinok na počítači v lokálnej sieti. Podstatné je zvoliť si štruktúru (tá sa dá prispôsobovať) a nahrať tam všetky moduly (popisné súbory) aj s ich artefaktmi.
Cache – lokálna kópia repozitára. Ide hlavne o optimalizáciu, kedy je repozitár dostupný len cez internet.
To by mohlo byť na začiatok všetko. Povedali sme si, že hlavnou úlohou Ivy je pripravovať súbory podľa grafu závislostí, ktoré medzi nimi existujú. Fyzicky sa to dá dosiahnuť pomocou knižnice Ivy a jej príkazov a pripraveného repozitára so správne zadefinovanými Ivy údajmi. V druhej polovici článku o Ivy sa pozrieme bližšie na tie príkazy, a tiež si povieme o čerešničke na torte – konfiguráciách.