Obsah
<property>
<path>
a
<fileset>
<target>
sestavovací utilita pro multiplatformní použití z
ant.apache.org
„nástroj pro mravenčí práci“
ve světě vývojářů v Javě všeobecně přijímán
součást všech významných IDE buď jako plugin (JBuilder, NetBeans) nebo jako vestavěná součást (Eclipse)
http://ant.apache.org/manual/ide.html
konfigurovatelný a flexibilní systém
konzolová aplikace
značné množství schopností, významně převyšující možnosti „sestavovacího nástroje“
http://ant.apache.org/manual/tasksoverview.html
Mnoho stejných akcí lze provést několika rozdílnými způsoby (matoucí).
podobá se make™ („like Make, but without Make's wrinkles“)
základní rozdíly:
make
nastavba příkazového interpreteru – využívá platformově závislé příkazy OS
není přenositelný (rm
versus
del
)
používá pro zápis příkazů speciální syntaxi s včetně
problematického <Tab>
Ant
implementován v Javě za pomoci standardních knihoven
plně přenositelný
pro zápis příkazů používá formát XML (se všemi jeho výhodami)
ant.apache.org
jako jeden .zip
soubor, který se pouze rozbalí do například C:\Program
Files\Java\ant
referenční popis (Ant task reference) nalezneme v souboru
ant\docs\appendix_e.pdf
pro bezproblémovou činnost je třeba přidat do
PATH
cestu:
C:\Program Files\Java\ant\bin
v manuálu se doporučuje ještě nastavit systémovou proměnnou
set ANT_HOME="C:\Program Files\Java\ant"
někdy je nutné nastavit (pokud to již není)
JAVA_HOME
je třeba připravit XML soubor s popisem činností – projekt
(<project>
) (též „sestavovací
schéma“)
jméno souboru je implicitně
build.xml
, který se zpracovává po
příkazu
>ant
je výhodné mít pro každý vytvářený projekt jeden soubor
je možné použít i jiné jméno, pak je spuštění
>ant -buildfile mujbuildfile.xml
základní princip je, že <project>
má
minimálně jeden cíl (co se má udělat)
cíl se označuje <target>
– logicky
oddělená část projektu
jeden <target>
může být spuštěn jako
defaultní
v rámci jednoho <target>
může být víc
úkolů (tasks)
úkoly nejsou příkazy OS (byť mnohé mají stejnou syntaxi), ale „služby“ poskytované Antem™
ant\docs\manual\tasksoverview.html
Příklad souboru adresar1.xml
, který v rámci
jediného <target>
(který je navíc defaultní) provede
dva úkoly – vytvoří adresář a vypíše zprávu.
<target>
musí být pojmenován pomocí atributu
name
Přesto, že názvy úkolů mkdir
a echo
jsou stejné, jako příkazy OS, nevykonávají se příkazy OS, ale činnosti
z Java tříd.
<?xml version="1.0" encoding="UTF-8"?> <project name="Adresar" default="vytvorAdresar"> <target name="vytvorAdresar"> <mkdir dir="muj-adresar"/> <echo message="Hotovo"/> </target> </project>
tento projekt po spuštění vypíše:
D:\xml\ant>ant -buildfile adresar1.xml Buildfile: adresar1.xml vytvorAdresar: [mkdir] Created dir: D:\xml\ant\muj-adresar [echo] Hotovo BUILD SUCCESSFUL Total time: 0 seconds D:\xml\ant>
je možné mít více <target>
ty, které nebyly označeny v <project>
jako default
, se spouštějí uvedením svého
jména
<?xml version="1.0" encoding="UTF-8"?> <project name="Adresar" default="vytvorAdresar"> <target name="vytvorAdresar"> <mkdir dir="muj-adresar"/> <echo message="Hotovo"/> </target> <target name="smaz"> <delete dir="muj-adresar"/> </target> </project>
tento projekt po spuštění vypíše:
D:\xml\ant>ant -buildfile adresar2.xml smaz Buildfile: adresar2.xml smaz: [delete] Deleting directory D:\xml\ant\muj-adresar BUILD SUCCESSFUL Total time: 0 seconds D:\xml\ant>
pokud bychom soubor projektu přejmenovali na
build.xml
, bylo by spouštění:
D:\xml\ant>ant Buildfile: build.xml vytvorAdresar: [mkdir] Created dir: D:\xml\ant\muj-adresar [echo] Hotovo BUILD SUCCESSFUL Total time: 0 seconds D:\xml\ant>ant smaz Buildfile: build.xml smaz: [delete] Deleting directory D:\xml\ant\muj-adresar BUILD SUCCESSFUL Total time: 0 seconds D:\xml\ant>
name="Adresar"
nepovinný atribut, který má význam pouze pro přehlednost
doporučuje se uvádět – soubor se typicky jmenuje
build.xml
, takže z jeho názvu není jasné,
k čemu je projekt určen
default="vytvorAdresar"
povinný atribut, označuje nejpravděpodobnější/nejčastěji
používaný <target>
basedir="."
je to základní adresář pro všechny relativní cesty uváděné dále
jednoduchý, ale velmi účinný způsob, jak udržet pořádek v umístění souborů
nepovinný atribut, ale velmi často uváděný
není-li uveden, má implicitní hodnotu "."
,
tj. „aktuální adresář“
<project name="Adresar" default="vytvorAdresar" basedir="d:\zzz"> <target name="vytvorAdresar"> <mkdir dir="muj-adresar"/> <echo message="Hotovo"/> </target> </project>
D:\xml\ant>ant -buildfile adresar3.xml Buildfile: adresar3.xml vytvorAdresar: [mkdir] Created dir: D:\zzz\muj-adresar [echo] Hotovo BUILD SUCCESSFUL
Jako oddělovač adresářů lze použít \
i
/
případně je libovolně míchat
element dává možnost nastavit (typicky na začátku) symbolické konstanty
používají se dále s výhodami symbolických konstant (nastavení jen jednou, čitelnost, atd.)
Jedná se o skutečné konstanty, které se po nastavení nedají měnit.
nastavení obecné hodnoty
<property name="jmeno" value="hodnota">
použití je
${jmeno}
konstant může být libovolné množství, každé
<property>
nastavuje jednu
vedlejším efektem příkladu jsou dva různé způsoby výpisu textu na konzoli
<echo message="zprava"/> <echo>zprava</echo>
<?xml version="1.0" encoding="UTF-8"?> <project name="Konstanty" default="vytvorAdresar"> <property name="adresar" value="muj-adresar"/> <property name="podadresar" value="vnoreny"/> <target name="vytvorAdresar"> <mkdir dir="${adresar}/${podadresar}"/> <echo message="${adresar}/${podadresar}"/> <echo>${adresar}/${podadresar}</echo> </target> <target name="smaz"> <delete dir="${adresar}/${podadresar}"/> <delete dir="${adresar}"/> </target> </project>
místo value
použijeme
location
<property name="jmeno" location="jmeno">
je-li jmeno
úplná cesta, zůstává při použití
nezměněna
je-li to neúplná cesta, použije se v součinnosti s
basedir
<?xml version="1.0" encoding="UTF-8"?> <project name="Location" default="loc" basedir="."> <property name="jmeno-rel" location="src" /> <property name="jmeno-abs" location="d:\zzz" /> <target name="loc"> <echo message="${jmeno-rel}"/> <echo message="${jmeno-abs}"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile location.xml Buildfile: location.xml loc: [echo] D:\xml\ant\src [echo] D:\zzz BUILD SUCCESSFUL
location
se jeví jako vhodný nástroj pro
konečná jména adresářů
při skládání jmen adresářů je ale zcela nevhodný
<?xml version="1.0" encoding="UTF-8"?> <project name="Location-chyba" default="loc" basedir="."> <property name="adresar" location="muj-adresar"/> <property name="podadresarLoc" location="vnoreny"/> <property name="podadresarVal" value="vnoreny"/> <target name="loc"> <echo message="${adresar}/${podadresarLoc}"/> <echo message="${adresar}/${podadresarVal}"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile location-chyba.xml
Buildfile: location-chyba.xml
loc:
[echo] D:\xml\ant\muj-adresar/D:\xml\ant\vnoreny
[echo] D:\xml\ant\muj-adresar/vnoreny
BUILD SUCCESSFUL
kromě námi pojmenovaných konstant umožňuje
<property>
použít i přednastavené
konstanty
Jsou to:
file
nastavení jmen a hodnot konstant z externího souboru
nemusíme pak měnit soubor projektu
<?xml version="1.0" encoding="UTF-8"?> <project name="Konstanty externe" default="externe"> <property file="adresare.properties" prefix="adr"/> <target name="externe"> <echo message= "vytvarim adresar: ${adr.adresar}/${adr.podadresar}"/> </target> </project>
soubor s nastavením vlastností má nejčastěji příponu
.properties
(ale není to nezbytné)
obsah souboru
adresare.properties
:
adresar="muj-adresar" podadresar=vnoreny
V nastavení hodnoty se nesmí používat uvozovky (ve smyslu
začátek a konec hodnoty). Vše, co je za znakem =
až
do konce řádky je hodnota konstanty
po spuštění vypíše:
externe: [echo] vytvarim adresar: "muj-adresar"/vnoreny
environment
pro práci se systémovými proměnnými
Jména systémových proměnných jsou case-sensitive. Nesouhlasí-li, vypíše se použité jméno, nikoliv hodnota.
<?xml version="1.0" encoding="UTF-8"?> <project name="Konstanty prednastavene" default="prednastavene"> <property environment="e"/> <target name="prednastavene"> <echo>${e.Path}</echo> </target> </project>
pro nastavení cest (názvů několika adresářů vzájemně
oddělených „ ;
“ nebo „
:
“) použijeme <path>
je vhodné vytvářenou cestu identifikovat pomocí atributu
id
pak lze snadno vytvářet odkazy na tuto cestu kdekoliv
jinde pomocí refid
skutečný oddělovač adresářů („;
“
nebo „:
“) si Ant doplní dle konvencí
konkrétní platformy
<?xml version="1.0" encoding="UTF-8"?> <project name="NastaveniCesty" default="vypis"> <path id="mujClasspath"> <pathelement path="C:\Program Files\java\"/> <pathelement location="prelozene/knihovna.jar"/> </path> <property name="cesta" refid="mujClasspath" /> <target name="vypis"> <echo message="${cesta}" /> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile classpath.xml Buildfile: classpath.xml vypis: [echo] C:\Program Files\java;D:\xml\ant\prelozene\knihovna.jar
potřebujeme-li sofistikované nastavení cesty, kdy
nevystačíme s <pathelement>
, použijeme
<dirset>
ve stejném duchu, jako
<fileset>
– viz dále
na základní úrovni (<target>
) neexistuje
<classpath>
používáme <fileset>
a opět je vhodné
nastavit atribut id
pro pozdější
refid
soubory, které přidáváme do seznamu, zapíšeme pomocí elementu
<include>
(lze použít i atribut
includes
)
je možné používat masku:
*.java
– všechny soubory
.java
v zadaném adresáři
**/*.java
– všechny soubory
.java
v zadaném adresáři a ve všech
vnořených podadresářích
ze seznamu lze vyloučit soubory pomocí elementu
<exclude>
lze použít i atribut excludes
, kde může být
seznam vyloučených souborů oddělených čárkou nebo mezerou
<?xml version="1.0" encoding="UTF-8"?> <project name="NastaveniSouboru" default="vypis"> <property name="adresar" location="." /> <fileset id="mojeSoubory" dir="${adresar}" excludes="a*.xml, p*.xml z*.xml"> <include name="**/*.java" /> <include name="*.xml" /> <exclude name="build.xml" /> <exclude name="i*.xml" /> </fileset> <property name="soubory" refid="mojeSoubory" /> <target name="vypis"> <echo message="${soubory}" /> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile soubory.xml Buildfile: soubory.xml vypis: [echo] Akcenty.java;build3.xml;classpath.xml; location.xml;optional.xml;soubory.xml; src\LideSAX.java;src\ObsluhaChyb.java BUILD SUCCESSFUL
Jinou možností je použití <filelist>
<path>
často vnitřně využívá
<fileset>
v <task>
, který potřebuje
classpath
, se často tato hodnota nastavuje pomocí
refid
je samozřejmě možné classpath
nastavit
lokálně s využitím <fileset>
a/nebo
<dirset>
příklad ukazuje nastavení classpath
pro překlad
pomocí javac
™ s využitím
knihoven JAXB
<property environment="e"/> <property name="jwsdp" value="${e.JWSDP_HOME}"/> <path id="classpathProJAXB"> <pathelement path="${adresarClassSouboru}" /> <fileset dir="${jwsdp}" includes="jaxb/lib/*.jar" /> <fileset dir="${jwsdp}" includes="jwsdp-shared/lib/*.jar" /> </path> <target name="generovani"> <javac> <classpath refid="classpathProJAXB" />
máme-li více <target>
, můžeme si jejich
seznam vypsat použitím příkazu:
-projecthelp
D:\xml\ant>ant -buildfile zavislosti.xml -projecthelp Buildfile: zavislosti.xml Main targets: Other targets: druhy prvni treti Default target: prvni
jednotlivé <target>
mohou záviset pořadím
provádění na jiných <target>
závislosti se mohou řetězit
používá se atribut depends
<?xml version="1.0" encoding="UTF-8"?> <project name="Zavislosti" default="prvni"> <target name="prvni" depends="druhy"> <echo message="prvni = defaultni"/> </target> <target name="druhy" depends="treti"> <echo message="druhy"/> </target> <target name="treti"> <echo message="treti"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile zavislosti.xml Buildfile: zavislosti.xml treti: [echo] treti druhy: [echo] druhy prvni: [echo] prvni = defaultni BUILD SUCCESSFUL
je možné konstruovat složité závislosti, ale snaha je o přímočaré souvislosti
zacyklí-li se závislosti, Ant vypíše chybové hlášení
<?xml version="1.0" encoding="UTF-8"?> <project name="Zavislosti" default="prvni"> <target name="prvni" depends="druhy"> <echo message="prvni = defaultni"/> </target> <target name="druhy" depends="prvni"> <echo message="druhy"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile zavislosti-cyklus.xml Buildfile: zavislosti-cyklus.xml BUILD FAILED Circular dependency: prvni <- druhy <- prvni
bez podmínek je <target>
proveden vždy
při vyvolání
lze ale nastavit jeho provádění v závislosti na
existenci
<property>
nezávisí na hodnotě
<property>
používá se dvojice příkazů if
–
unless
(ve smyslu if
–
else
)
<?xml version="1.0" encoding="UTF-8"?> <project name="Podminky" default="druhy"> <property name="povoleni" value="nezalezi"/> <target name="prvni" if="povoleni"> <echo message="prvni"/> </target> <target name="druhy" unless="povoleni"> <echo message="druhy"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile if-unless1.xml prvni Buildfile: if-unless1.xml prvni: [echo] prvni BUILD SUCCESSFUL D:\xml\ant>ant -buildfile if-unless1.xml druhy Buildfile: if-unless1.xml druhy: BUILD SUCCESSFUL
podmínky se dají kombinovat se závislostmi
je třeba zvýšené opatrnosti
<?xml version="1.0" encoding="UTF-8"?> <project name="Podminky" default="druhy"> <property name="povoleni" value="nezalezi"/> <target name="prvni" if="povoleni"> <echo message="prvni"/> </target> <target name="druhy" depends="prvni" unless="povoleni"> <echo message="druhy"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile if-unless2.xml Buildfile: if-unless2.xml prvni: [echo] prvni druhy: BUILD SUCCESSFUL
nesprávně nastavená podmínka v kombinaci se závislostí
prvni
očekává, že před svým spuštěním bude
mít vykonanou činnost druhy
, což se ale
neprovede
<?xml version="1.0" encoding="UTF-8"?> <project name="Podminky" default="prvni"> <property name="povoleni" value="nezalezi"/> <target name="prvni" depends="druhy" if="povoleni"> <echo message="prvni = defaultni"/> </target> <target name="druhy" unless="povoleni"> <echo message="druhy"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile if-unless3.xml Buildfile: if-unless3.xml druhy: prvni: [echo] prvni = defaultni BUILD SUCCESSFUL
v případech, kdy Ant™ neprovádí očekávanou činnost, je vhodné použít další parametr příkazové řádky
podrobnější informace o průběhu
-verbose
D:\xml\ant>ant -buildfile if-unless3.xml -verbose ... druhy: Skipped because property 'povoleni' set. ...
dalším možným parametrem je -debug
, který
vypisuje ještě podrobnější výstup
D:\xml\ant>ant -buildfile if-unless3.xml -debug ... Setting project property: povoleni -> nezalezi Build sequence for target `prvni' is [druhy, prvni] Complete build sequence is [druhy, prvni, ] druhy: Skipped because property 'povoleni' set. ...
jsou to jednotlivé příkazy v rámci jednoho
<target>
Jsou tří typů:
vestavěné (built-in, v dokumentaci nazývané „core tasks“)
např. <javac>
pracují bez jakýchkoliv dalších knihoven
volitelné (optional)
např. <XmlValidate>
jsou součástí distribuce Ant™ (a také kompletně popsané v dokumentaci), ale ke své práci potřebují typicky nějakou externí knihovnu
knihovny jsou popsány v Library Dependencies
některé z nich mohou fungovat okamžitě, protože externí knihovna je součástí např. JDK
např. <native2ascii>
vlastní
napíšeme si je dle potřeby jako třídy v Javě
ant\docs\manual\tutorial-writing-tasks.html
přicházejí s produkty třetích stran
celkově je úkolů z 1. a 2. skupiny velké množství (více než 100)
v dokumentaci se uvádí dělení do těchto základních skupin:
Archive Tasks, Audit/Coverage Tasks, Compile Tasks, Deployment Tasks, Documentation Tasks, EJB Tasks, Execution Tasks, File Tasks, Java2 Extensions Tasks, Logging Tasks, Mail Tasks, Miscellaneous Tasks, .NET Tasks, Pre-process Tasks, Property Tasks, Remote Tasks, SCM Tasks, Testing Tasks, Visual Age for Java Tasks
lze kopírovat
soubor do téhož adresáře pod jiným jménem
<copy file="stary.txt" tofile="novy.txt"/>
soubor do jiného adresáře pod stejným jménem
<copy file="stary.txt" todir="D:\zzz"/>
adresář (včetně vnořených podadresářů)
<copy todir="D:\zzz"> <fileset dir="."/> </copy>
využití již definovaného seznamu souborů pomocí
refid
<copy todir="D:\zzz\kopie"> <fileset refid="mojeSoubory" /> </copy>
<?xml version="1.0" encoding="UTF-8"?> <project name="copy" default="copy"> <property name="adresar" location="." /> <fileset id="mojeSoubory" dir="${adresar}" excludes="a*.xml, p*.xml z*.xml"> <include name="**/*.java" /> <include name="*.xml" /> <exclude name="build.xml" /> <exclude name="i*.xml" /> </fileset> <target name="copy"> <copy file="stary.txt" tofile="novy.txt"/> <copy file="stary.txt" todir="D:\zzz"/> <copy todir="D:\zzz"> <fileset dir="."/> </copy> <copy todir="D:\zzz\kopie"> <fileset refid="mojeSoubory" /> </copy> </target> </project>
mazání souborů, adresářů i vnořených podadresářů
podobně jako u <copy>
lze použít pro
označení skupiny mazaných souborů <fileset>
i
pomocí refid
Při použití <fileset>
se nebere v potaz
nastavení adresáře pomocí atributu dir
pro mazání prázdných podadresářů lze zvolit atribut
includeEmptyDirs="true"
<?xml version="1.0" encoding="UTF-8"?> <project name="delete" default="delete"> <property name="adresar" location="." /> <fileset id="mojeSoubory" dir="${adresar}" excludes="a*.xml, p*.xml z*.xml"> <include name="**/*.java" /> <include name="*.xml" /> <exclude name="build.xml" /> <exclude name="i*.xml" /> </fileset> <target name="delete"> <delete file="novy.txt"/> <delete dir="D:\zzz\src"/> <!-- <delete dir="D:\zzz\kopie"> <fileset refid="mojeSoubory" /> </delete> --> <delete includeEmptyDirs="true"> <fileset dir="D:\zzz" includes="**/*.bak" /> </delete> </target> </project>
vytvoří adresář
jedná-li se o více vnořených adresářů, vytvoří najednou všechny případné chybějící
jako oddělovač adresářů lze použít /
i
\
často se používá <property>
<mkdir dir="${pocatecni}/vnor1\vnor2/${koncovy}"/>
příklad viz výše
překlad .java
souborů
srcdir
je prohledáván rekurzivně (překlad
balíků i podbalíků)
překládají se chybějící .class
a
.class
, které jsou starší než zdrojové
.java
minimální verze je
<javac srcdir="."/>
existuje velké množství přepínačů, většinou vystačíme jen s několika
<?xml version="1.0" encoding="UTF-8"?> <project name="javac" default="javac"> <property environment="e"/> <property name="jwsdp" value="${e.JWSDP_HOME}"/> <path id="classpathProJAXB"> <pathelement path="." /> <fileset dir="${jwsdp}" includes="jaxb/lib/*.jar" /> <fileset dir="${jwsdp}" includes="jwsdp-shared/lib/*.jar" /> </path> <target name="javac"> <javac srcdir="."/> <mkdir dir="./class" /> <javac srcdir="." destdir="./class" includes="Zakladni.java src/balik/*.java"> <compilerarg value="-Xlint" /> </javac> <delete includeEmptyDirs="true"> <fileset dir="." includes="**/*.class" /> </delete> <javac debug="on"> <src path="." /> <!-- <dst path="." /> nelze --> <classpath refid="classpathProJAXB" /> </javac> </target> </project>
vypíše pro zdrojové soubory
„./Zakladni.java
“
public class Zakladni { public static void main(String[] args) { System.out.println("Zakladni"); } }
„./src/balik/Hlavni.java
“
package balik; public class Hlavni { public static void main(String[] args) { System.out.println("Hlavni v baliku"); } }
D:\xml\ant>ant -buildfile javac.xml Buildfile: javac.xml javac: [javac] Compiling 2 source files [javac] Compiling 2 source files to D:\xml\ant\class [delete] Deleting 4 files from D:\xml\ant [javac] Compiling 2 source files BUILD SUCCESSFUL
spuštění Java programu
programy Zakladni
a
Hlavni
z adresare
./class
by se z příkazové řádky
spouštěly:
D:\xml\ant>java -cp ./class Zakladni Zakladni D:\xml\ant>java -cp ./class balik.Hlavni Hlavni v baliku
potřebujeme-li předat JVM nějaké parametry pro spuštění,
musíme spustit další instanci JVM pomocí atributu
fork="true"
chceme-li spustit .jar
soubor, musíme
opět použít fork="true"
<?xml version="1.0" encoding="UTF-8"?> <project name="java" default="java"> <target name="java"> <java classname="Zakladni" /> <java classname="Zakladni" classpath="./class" /> <java classname="balik.Hlavni"> <classpath path="./class" /> </java> <java classname="balik.Hlavni" classpath="./class" fork="true"> <jvmarg value="-Xmx300M"/> </java> <java jar="hlavni.jar" fork="true"> </java> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile java.xml Buildfile: java.xml java: [java] Zakladni [java] Zakladni [java] Hlavni v baliku [java] Hlavni v baliku [java] Hlavni v baliku BUILD SUCCESSFUL
generování dokumentace
má značné množství parametrů, pro základní použití stačí jen několik
<?xml version="1.0" encoding="UTF-8"?> <project name="javadoc" default="javadoc"> <target name="javadoc"> <javadoc sourcepath="./src" destdir="./doc" windowtitle="MujBalik"> <fileset dir="./src" includes="**/*.java" /> </javadoc> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile javadoc.xml Buildfile: javadoc.xml javadoc: [javadoc] Generating Javadoc [javadoc] Javadoc execution [javadoc] Loading source file D:\xml\ant\src\balik\Hlavni.java... [javadoc] Loading source files for package balik... [javadoc] Constructing Javadoc information... [javadoc] Standard Doclet version 1.6.0 [javadoc] Building tree for all the packages and classes... [javadoc] Building index for all the packages and classes... [javadoc] Building index for all classes... BUILD SUCCESSFUL
vytvoří .jar
soubor
jméno (a případné umístění v adresářích)
.jar
souboru musí být v atributu
destfile="aplikace1.jar"
(občas je někde vidět jarfile
místo
destfile
)
soubory, které mají být do .jar
přidány, lze specifikovat pomocí
<fileset>
počáteční adresář z <fileset>
se
NEvkládá do .jar
(tzn. v .jar
je o jednu úroveň adresářů méně)
vždy vytvoří soubor MANIFEST.MF
v
podadresáři META-INF
soubory do .jar
lze určit i pomocí
atributu basedir
vytvářený MANIFEST.MF
lze doplnit
pomocí <manifest>
a vytvořit přímo spustitelný
.jar
<?xml version="1.0" encoding="UTF-8"?> <project name="jar" default="jar"> <target name="jar"> <jar destfile="aplikace1.jar"> <fileset dir="./class" /> <fileset dir="./src" /> </jar> <jar destfile="aplikace2.jar" basedir="." excludes="*.*" > </jar> <jar destfile="hlavni.jar" basedir="./class"> <manifest> <attribute name="Main-Class" value="balik.Hlavni"/> </manifest> </jar> </target> </project>
výhodná v případě, že názvy souborů nebo adresářů závisejí na aktuálním datumu/čase
přednastaví tři property
: DSTAMP
,
TSTAMP
a TODAY
lze si nastavit i vlastní property
pomocí
<format>
<?xml version="1.0" encoding="UTF-8"?> <project name="tstamp" default="tstamp"> <target name="tstamp"> <tstamp/> <echo message="DSTAMP=${DSTAMP}"/> <echo message="TSTAMP=${TSTAMP}"/> <echo message="TODAY=${TODAY}"/> <tstamp> <format property="MujDatum" pattern="yyyy-MM-dd"/> <format property="MujCas" pattern="HH:mm:ss"/> </tstamp> <echo message="MujDatum=${MujDatum}"/> <echo message="MujCas=${MujCas}"/> <mkdir dir="distribuce${MujDatum}"/> </target> </project>
vypíše:
D:\xml\ant>ant -buildfile tstamp.xml Buildfile: tstamp.xml tstamp: [echo] DSTAMP=20070121 [echo] TSTAMP=1822 [echo] TODAY=January 21 2007 [echo] MujDatum=2007-01-21 [echo] MujCas=18:22:58 [mkdir] Created dir: D:\xml\ant\distribuce2007-01-21 BUILD SUCCESSFUL
vhodný v případě, kdy budeme šířit svoje zdrojové soubory s i18n (internationalization)
atribut ext
udává příponu nově vzniklých
souborů
http://ant.apache.org/manual/OptionalTasks/native2ascii.html
<?xml version="1.0" encoding="UTF-8"?> <project name="native2ascii" default="n2a"> <target name="n2a"> <native2ascii encoding="CP1250" src="." dest="./konverze" includes="**/*.java" ext=".java"/> </target> </project>
<?xml version="1.0" encoding="UTF-8"?> <project name="Univerzalni" default="ladeni" basedir="."> <description> Soubor pro veskerou praci s Java soubory na prikazove radce P.Herout, 2007 prikazy: init - vytvori pocatecni adresare preklad - preklad zdrojovych souboru ladeni - spusteni programu (defaultni prikaz) dokumentace - vytvori dokumentaci distribuce - zabali vse do spustitelneho .jar uklid - vymaze vse krome zdrojovych souboru </description> <!-- properties menene vzdy --> <property name="balik" value="balik"/> <property name="souborSMain" value="Hlavni"/> <property name="distribucniJAR" value="aplikace"/> <!-- properties menene dle platformy --> <property name="kodovaniZdroje" value="windows-1250"/> <!-- value="ISO-8859-2" --> <!-- properties menene temer nikdy --> <property name="zdrojove" value="src"/> <property name="prelozene" value="class"/> <property name="dokumentace" value="doc"/> <property name="distribuce" location="dist"/> <target name="init"> <mkdir dir="${zdrojove}/${balik}"/> <mkdir dir="${prelozene}"/> </target> <target name="preklad" depends="init" > <javac srcdir="${zdrojove}" destdir="${prelozene}" debug="on"/> </target> <target name="ladeni" depends="preklad" > <java classname="${balik}.${souborSMain}"> <classpath path="${prelozene}" /> </java> </target> <target name="dokumentace" > <javadoc sourcepath="${zdrojove}" destdir="${dokumentace}" windowtitle="${balik}"> <fileset dir="${zdrojove}" includes="**/*.java" /> </javadoc> </target> <target name="distribuce" depends="preklad, dokumentace" > <mkdir dir="${distribuce}/${zdrojove}"/> <mkdir dir="${distribuce}/${dokumentace}"/> <native2ascii encoding="${kodovaniZdroje}" src="${zdrojove}" dest="${distribuce}/${zdrojove}" includes="**/*.java" ext=".java"/> <copy todir="${distribuce}"> <fileset dir="${prelozene}"/> </copy> <copy todir="${distribuce}/${dokumentace}"> <fileset dir="${dokumentace}"/> </copy> <tstamp> <format property="MujDatum" pattern="yyyy-MM-dd"/> </tstamp> <jar destfile="${distribucniJAR}${MujDatum}.jar" basedir="${distribuce}"> <manifest> <attribute name="Main-Class" value="${balik}.${souborSMain}"/> </manifest> </jar> <delete dir="${distribuce}"/> </target> <target name="uklid" > <delete dir="${prelozene}"/> <delete dir="${dokumentace}"/> <!-- maze distribucni .jar !!! --> <delete> <fileset dir="." includes="*.jar" /> </delete> </target> </project>