ANT Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Úvod Apache ANT (ant.apache.org) - Java-orientovaný sestavovací nástroj sloužící k podobným účelům jako unixový make. Vlastnosti: používá XML formát pro zápis sestavovacího skriptu, definuje svoji funkcionalitu pomocí Java tříd (na rozdíl od make, který používa shell script), obsahuje velké množství standardních úloh (task), je snadno rozšiřitelný o uživatelské úlohy.
"Hello World" ANT skript je implicitně umístěn v aktuálním adresáři a jmenuje se build.xml: <?xml version="1.0" encoding="utf-8"?> <project> <echo message="hello, world"/> </project> vyvolání: >ant výstup: Buildfile: /home/danecek/testant/build.xml [echo] Hello, world BUILD SUCCESSFUL Total time: 0 seconds
Úloha Úloha (task) - je základní funkční krok (příkaz), který může být proveden. V sestavovacím skriptu je úloha zavolána stejnojmenným elementem. Úloha může mít atributy (parametry). Obecný tvar volání úlohy: <jméno atribut 1 ="hodnota 1 "... atribut n ="hodnota n "> <vnořený-element> </vnořený-element> </jméno> ANT obsahuje velké množství předdefinovaných úloh, avšak je jednoduché doplnit zákaznickou úlohu. Příklad: úloha echo vypíše na standardní výstup hodnotu atributu message: <echo message="hello, world"/>
Uživatelská úloha (1/2) Nová úloha může být jednoduše přidána jako podtřída třídy org.apache.tools.ant.task. Jednotlivé atributy úlohy jsou definovány jako setry: package mytask; import org.apache.tools.ant.buildexception; import org.apache.tools.ant.task; public class MyHelloTask extends Task { private String who; @Override public void execute() throws BuildException { System.out.printf("Hello %s\n", who); } public void setwho(string who) { this.who = who; } }
Uživatelská úloha (2/2) jarfile s uživatelskou úlohou musí být: 1. umístěn v adresáři: ANT_HOME/lib 2. resp. v adresáři: {user.home}/.ant/lib 3. resp. identifikován parametrem -lib na příkazové řádce: ant -lib ~/antlib/myhellotask.jar Uživatelská úloha musí být v souboru build.xml deklarována pomocí úlohy taskdef: <project> <taskdef name="myhellotask" classname="mytask.myhellotask"/> <MyHelloTask who="chris"/> </project> Výstup: [MyHelloTask] Hello Chris
Cíl Cíl (target) je posloupnost úloh vykonávaná jako jeden celek: <project default="target2"> <echo message = "init"/> <target name = "target1"> <echo message = "run target1"/> </target> <target name = "target2" description = "run target"> <echo message = "run target2"/> </target> </project> Cíl (jeden nebo i více) může být zadán při volání antu: ant target1 target2 Pokud není cíl explicitně zadán vykoná se cíl zadaný jako default atribut elementu project.
Závislost cílů I Mezi cíli může být stanovena závislost pomocí atributu depends: <target name="a"/> <target name="b" depends="a"/> <target name="c" depends="b"/> <target name="d" depends="c,b,a"/> Při vyvolání cíle D proběhne provádění cílů v pořadí: A, B, C, D (na pořadí uvedení cílů v atributu depends nezáleží). Každý cíl je za běhu skriptu vykonán pouze jednou. Atribut description (nepovinný) může být použit pro dokumentaci cílů. Popisy všech cílů jsou vytištěny zadáním parametru -projecthelp. Dokumetované cíle jsou tzv. hlavní (main targets). Cíle bez dokumentace jsou považovány za podružné.
Úloha Javac Prohledává rekurzivně adresář srcdir a nalezené zdrojové soubory, které kompiluje do adresáře destdir. Překládají se pouze soubory, u kterých je classfile starší než zdrojový soubor. Protože adresář destdir musí existovat kombinuje se javac obvykle s úlohou mkdir, která vytvoří adresář: <project basedir=".">... <target name="build" depends="init"> <mkdir dir="classes"/> <javac srcdir = "src" destdir = "classes"/> </target> <project> Atributy dir, srcdir, dstdir jsou vztaženy relativně k adresáři ve kterém je umístřěn sestavovací skript resp. k adresáři zadanému explicitně v elemetu project atributem basedir:
Úloha Java Úloha vykoná zadanou třídu, která musí obsahovat metodu main. Parametry pro metodu main mohou být dány vnořenými elemety arg: <java classname = "main.main" classpath="classes" > <arg value="hello"/> </java> Variantně může být uveden spustitelný jarfile (tzn. opatřený souborem manifest s vlastností (property) Main-Class): <java jar = "dist/main.jar"> <arg value="hello"/> </java>
Úloha Jar Úloha vytvoří jarfile: <jar destfile="dist/lib.jar" basedir="classes"/> Vnořeným elementem manifest je možno umístit v jarfilu soubor manifest: <jar destfile="dist/app.jar" basedir="classes"> <manifest> <attribute name="main-class" value="com.acme.checksites.main"/> </manifest> </jar>
Vlastnosti Vlastnost (property) je pojmenovaná hodnota, která může být předávána jako atribut při volání úlohy. Vyhodnocení vlastnosti se předepisuje závorkami: ${... }: <project> <property name = "pozdrav" value = "Ahoj"/> <echo message = "${pozdrav}"/> </project> Vlastnosti mohou být také umístěny v samostatném souboru, kde je na každé řádce definována jedna vlastnost. Příklad: jednořádkový soubor ant.properties: greeting=hello Soubor se identifikuje atributem file: <project> <property file="ant.properties"/> <echo message = "${greeting}"/> </project>
Příklad jednoduchého projektu (1/5) Program, který využívá jako resource textový soubor: package main; import java.io.inputstream; import java.util.scanner; public class Main { } public static void main(string[] args) { InputStream is = Main.class.getResourceAsStream( "/resources/pozdrav.txt"); Scanner s = new Scanner(is); while (s.hasnextline()) { System.out.println(s.nextLine()); } }
Příklad jednoduchého projektu (2/5) Adresářová struktura projektu:
Příklad jednoduchého projektu (3/5) Soubor project.properties: # Project main class main.class=main.main Soubor build.xml: <project name="my-project" default="dist" basedir="."> <description>simple build file</description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="target" location="target"/> <property name="classes" location="${target}/classes"/> <property name="dist" location="${target}/dist"/> <property file ="project.properties"/>
Příklad jednoduchého projektu (4/5) <target name="init"> <!-- Create the time stamp --> <tstamp/> </target> <target name="clean" description="clean up" > <!-- Delete the ${target} directory tree --> <delete dir="${target}"/> </target> <target name="compile" depends="init" description="compile the source " > <mkdir dir="${classes}"/> <!-- Compile java from ${src} into ${classes} --> <javac srcdir="${src}" destdir="${classes}"/> </target>
Příklad jednoduchého projektu (5/5) <target name="build" depends="compile" description="generate the distribution" > <!-- Copy resources into classes dir --> <copy todir="${classes}/resources/"> <fileset dir="${src}/resources"/> </copy> <!-- Create the distribution directory --> <mkdir dir="${dist}"/> <!-- Put everything in ${classes} into the MyProject-${DSTAMP}.jar file --> <jar jarfile= "${dist}/myproject-${dstamp}.jar" basedir="${classes}"/> </target> <target name="run" depends="build"> <java classpath="${dist}/myproject-${dstamp}.jar" classname="${main.class}" /> </target>