Nač je nám ANT ?
ANT umožňuje programátorům používajícím jazyk Java psát komplexní sestavovací schémata pro své aplikace. Můžeme namítnout, že již existuje a je dlouho používaná utilita make, ovšem tato jest pouze jakousi nástavbou v příkazovém interpreteru. Make totiž pouze dodefinovává pravidla, kterými se bude překlad řídit. Dále se pak již využívají nativní příkazy operačního systému. Z toho vyplývá, že sestavovací schéma make není obecně přenositelné mezi různými operačními systémy. Tento problém je při použití ANTu vyřešen. ANT je totiž celý implementován v jazyce Java, a to zaručuje jeho přenositelnost mezi různými platformami. Každá operace, kterou lze volat, s některými výjimkami, je implementována za pomoci standardních javovských knihoven, tedy bez využití nativních programů hostitelského operačního systému. Dalším aspektem je syntaxe sestavovacího souboru, který je samotnou utilitou zpracováván. Narozdíl od utility make, která má v sestavovacích souborech svou speciální syntaxi, je pro vytváření sestavovacích schémat pro utilitu ANT využit formát XML. Toto využití formátu XML dovoluje zkontrolovat samotné sestavovací schéma, a to je jistě dobrá vlastnost.
Jak to vypadá a jak se to používá ?
Sestavování programu je za použití utility ANT stejně jako u make řízeno pomocí tzv. cílů (target), z nichž jeden je považován za implicitní a musí být známo, který to je. Cíl potom obsahuje jednotlivé úkoly (task), které jsou v rámci tohoto cíle vykonány. Nejlepší asi bude příklad:
<project name="Priklad_1" default="init"> <target name="init"> <mkdir dir="bin"/> <chmod file="bin" perm="a+xr"/> </target> </project>
Tento příklad je jednoduchou ukázkou, jak vypadá sestavovací schéma. Je to schéma pro projekt jménem Priklad1, jehož implicitním cílem je cíl init. Tento cíl nám vytvoří adresář a poté k němu nastaví práva.
Teď je nasnadě otázka: „Jak to spustit ?“ Pokud spustíme ANT, tedy utilitu ant, bez jakéhokoliv parametru, bude implicitně hledat v aktuálním adresáři soubor build.xml, ze kterého potom převezme implicitní cíl (tak teď už víme, na co tam je :-) ). Samozřejmě máme možnost nazvat si tento soubor jakkoliv, ovšem pak to musíme sdělit i ANTu pomocí přepínače. Také můžeme definovat jiný cíl, který se má spustit. To má své opodstatnění, které si ukážeme na příkladu:
<project name="Priklad_2" default="compile"> <target name="compile"> <mkdir dir="bin"/> <chmod file="bin" perm="a+xr"/> <javac srcdir="src" destdir="bin"/> </target> <target name="clean"> <delete dir="bin"/> </target> </project>
Nyní, pokud spustíme ANT bez přepínačů, provede se implicitní cíl compile. My jsme ovšem definovali i další cíl, který má za úkol po nás uklidit. Spustíme-li ANT a předáme-li jako argument řetězec clean, neprovede se implicitní cíl, nýbrž námi specifikovaný cíl, tedy clean. Tato vlastnost nám dává možnost definovat a realizovat různé akce. Můžeme si celý proces sestavování rozdělit do několika fází, které mohou být na sobě závislé, a provádět jednotlivé kroky jakoby logicky odděleně (více viz. dále).
Obecněji o struktuře
Každý sestavovací soubor obsahuje několik částí, povinných i nepovinných, ale v každém případě standardních. Některé z těchto elementů je možné opakovat vícekrát, ale jsou i takové, které se mohou vyskytovat pouze jednou.
project
Tento tag je v každém sestavovacím souboru povinný a může se vyskytovat pouze jednou. Je to zároveň kořenový element celého souboru. Element project obsahuje tři atributy, které využívá utilita ANT při sestavování. Nejméně důležitým je atribut name, ten obsahuje jméno projektu. Dalšími, mnohem důležitějšími, jsou atributy default a basedir. Atribut default je právě tím cílem, který utilita ANT implicitně provádí, basedir je bázovým adresářem pro všechny relativní cesty uvedené dále v sestavovacím souboru.
<project name="Priklad_3" default="compile" basedir="."> ... </project>
Tedy jméno projektu je nastaveno na Priklad3, implicitně se bude vykonávat cíl compile a veškeré relativní cesty v sestavovacím schématu budou mít za společný startovací bod aktuální adresář.
property
Element property má v sestavovacím souboru úlohu jakési konstanty, lze ji tedy jednou nastavit, ale už ne změnit. Tento element má několik možností použití. My si nejprve ukážeme možnost, jak využít pojmenovaný property
element. Element property má atribut name, který je povinný pouze tehdy, je-li uveden i některý z následujících: value, location, refid. Tento přístup k elementu property je velmi prozaický. Atribut value je v tomto případě čistě konstantní hodnotou, kterou lze využít například jako překladovou konstantu pro vytváření verzí. Atribut location je perfektním zjednodušujícím prvkem, je používán k uložení cest do jednotlivých adresářů.
<project name="Priklad_4" default="init" basedir="."> <property name="version" value="1.0"/> <property name="dest" value="build"/> <target name="init"> <mkdir dir="${dest}/${version}"/> </target> ... </project>
Jinou možností, jak využít element property, jsou atributy, v jejichž kombinaci se nevyskytuje atribut name. Patří mezi ně atributy: resource, file,environment. Tyto se používají při načítání vlastností z externích zdrojů. Zde ovšem nastává problém s použitím na různých platformách. Jako příklad snad jen domovský adresář: na systémech Unix dobře definovaná záležitost, kdežto na systémech Windows, a vůbec těch starších, jsou to jaksi prázdná slova. Proto buďte při používání těchto možností opatrní při přecházení mezi systémy. Pomocí atributu file lze načítat vlastnosti z konkrétně pojmenovaného souboru, zatímco atribut environment přečte všechna systémová nastavení (proměnné prostředí) a zpřístupní je skrze zadaný prefix.
<project name="Priklad_5" default="init" basedir="."> <property file=".ant_properies" prefix="ext"/> <property environment="env"/> ... <echo ${ext.some_property}> <echo ${env.ANT_HOME}> </project>
target a tasky
Element target je obalem pro logicky oddělitelnou část sestavovacího schématu, které dává jméno, popisuje ji a definuje podmínky, kdy může být provedena. Je to vlastně jakýsi vyšší funkční celek v sestavovacím schématu. Velmi šikovnou myšlenkou je zavedení atributu depends, dejinujícího, které cíle by měly být vykonány, než se přistoupí k vykonávání daného cíle.
<project name="Priklad_6" default="init" basedir="."> <target name="init"> <mkdir dir="bin"/> </target> <target name="compile" depends="init"> <javac srcdir="src" destdir="bin"/> </target> </project>
Task je de facto každý element sestavovacího schématu, ovšem ty, které jsme si popsali výše, mají jistý speciální význam, proto je nebudeme brát v úvahu. Teď bychom si měli popsat, jak využívat celé to rozličné množství vestavěných tasků, abychom byli schopni vytvářet efektivní a strukturovaná schémata. Protože je to ale velmi obsáhlá kapitola, necháme si ji jako náplň dalšího dílu, ve kterém se také ještě hlouběji zmíním o závislostech mezi cíli a podmínkami pro vykonávání.