Kapitola 1. Deployment s Ant

Obsah

1.1. Ant – Another Neat Tool
1.1.1. Základní informace
1.1.2. Jak Ant získat
1.1.3. Použití
1.1.4. Použití <property>
1.1.5. Nastavování cest a opětovné použití nastavení
1.1.6. Nastavení jmen souborů
1.1.7. Kombinování <path> a <fileset>
1.1.8. Možnosti <target>
1.1.9. Když je něco špatně
1.1.10. Úkoly (tasks)
1.1.11. Přehled a použití často používaných úkolů
1.1.12. Ukázka komplexního projektu použitelného v praxi
1.1.13. Doporučeno k přečtení:

1.1. Ant – Another Neat Tool

1.1.1. Základní informace

  • 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

Výstraha

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:

    1. 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>

    2. 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)

1.1.2. Jak Ant získat

  • 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

1.1.3. Použití

  • 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

Poznámka

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>

1.1.3.1. Atributy <project>

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

Poznámka

Jako oddělovač adresářů lze použít \ i / případně je libovolně míchat

1.1.4. Použití <property>

  • 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.)

Výstraha

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

Poznámka

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>

1.1.4.1. Nastavení hodnoty ve smyslu jméno souboru nebo adresáře

  • 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

1.1.4.2. Pozor na skládání jmen adresářů

  • 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

1.1.4.3. Přednastavené konstanty

  • kromě námi pojmenovaných konstant umožňuje <property> použít i přednastavené konstanty

Jsou to:

  1. 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ýstraha

    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
  2. environment

    • pro práci se systémovými proměnnými

    Výstraha

    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>

1.1.5. Nastavování cest a opětovné použití nastavení

  • 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

Poznámka

  1. potřebujeme-li sofistikované nastavení cesty, kdy nevystačíme s <pathelement>, použijeme <dirset> ve stejném duchu, jako <fileset> – viz dále

  2. na základní úrovni (<target>) neexistuje <classpath>

1.1.6. Nastavení jmen souborů

  • 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

Poznámka

Jinou možností je použití <filelist>

1.1.7. Kombinování <path> a <fileset>

  • <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" />

1.1.8. Možnosti <target>

1.1.8.1. Seznam <target>

  • 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

1.1.8.2. Vzájemné závislosti

  • 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

1.1.8.3. Podmíněné provádění <target>

  • 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>

      Výstraha

      nezávisí na hodnotě <property>

  • používá se dvojice příkazů ifunless (ve smyslu ifelse)

    <?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

1.1.9. Když je něco špatně

  • 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.
    ...

1.1.10. Úkoly (tasks)

  • jsou to jednotlivé příkazy v rámci jednoho <target>

Jsou tří typů:

  1. vestavěné (built-in, v dokumentaci nazývané core tasks)

    • např. <javac>

    • pracují bez jakýchkoliv dalších knihoven

  2. 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>

  3. 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

1.1.11. Přehled a použití často používaných úkolů

1.1.11.1. <copy> – kopírování souborů a adresářů

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>

1.1.11.2. <delete>

  • 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

    Výstraha

    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>

1.1.11.3. <mkdir>

  • 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

1.1.11.4. <move>

  • stejné použití jako u <copy>, pouze soubory přesune

1.1.11.5. <javac>

  • 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

1.1.11.6. <java>

  • 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

1.1.11.7. <javadoc>

  • 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

1.1.11.8. <jar>

  • 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>

    Výstraha

    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>

1.1.11.9. Časová známka <tstamp>

  • 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

1.1.11.10. <native2ascii>optional task

<?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>

1.1.12. Ukázka komplexního projektu použitelného v praxi

<?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>

1.1.13. Doporučeno k přečtení:

ant\docs\ant_in_anger.html