ANT: narzędzie do automatyzacji zadań projektowych

Transkrypt

ANT: narzędzie do automatyzacji zadań projektowych
1
Apache
ANT
Narz˛edzie do automatyzacji zadań projektowych
Dawid Weiss
2004–2006
Spis treści
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
2
1 Wprowadzenie
A N T jest odpowiednikiem programu M A K E , znanego użytkownikom systemów Unix, i służy do
automatyzacji wykonywania serii poleceń zmierzajacych
˛
do wykonania pewnego określonego
celu. Celem tym, w przypadku zadań programistycznych, może być kompilacja plików źródłowych,
usuni˛ecie plików tymczasowych ale i również zupełnie inne zadania: opublikowanie dokumentacji na stron˛e W W W, wykonanie testów jednostkowych i generacja raportu w formie H T M L, czy
też wysłanie protokołem F T P plików na serwer dystrybucyjny. O sile narz˛edzia świadczy wachlarz możliwości jego użycia.
Popularność A N Ta jest wynikiem paru czynników:
automatyzacja
zadań
przenośność A N T jest napisany w Javie i używa j˛ezyka X M L do opisu skryptów automatyzacji.
Poprawnie napisany skrypt b˛edzie zatem działał identycznie zarówno w środowisku Windows, jak i innych (Linux czy MacOS).
dużo gotowych zadań Biblioteka ANTa zawiera wiele gotowych zadań takich, jak kompilator Java, kompresja Z I P, czy też wszechstronne zadania do obsługi plików.
integracja ANT jest łatwo integrowalny z innymi środowiskami programistycznymi. I tak Eclipse
i wszystkie inne środowiska programisty umożliwiaja˛ uruchamianie skryptów bezpośrednio ze środowiska wizualnego.
automatyzacja ANT powstał z myśla˛ o automatyzacji zadań i daje si˛e łatwo uruchamiać w sposób
automatyczny (na przykład co pewien czas). Można ten fakt wykorzystać aby sprawdzać
integralność projektu za pomoca˛ testów regresji (określana˛ też czasem terminem continuous integration).
rozszerzalność Czegokolwiek nie ma jeszcze w programie A N T, daje si˛e łatwo zaprogramować
jako własne zadania (w j˛ezyku Java oczywiście).
Bez owijania w bawełn˛e: A N T jest używany zwykle do automatyzacji zadań programistycznych przez osoby zwiazane
˛
z programowaniem w j˛ezyku Java. Jednak nic
nie stoi na przeszkodzie aby użyć go do każdego innego j˛ezyka lub też zadania wymagajacego
˛
powtarzalnych, identycznych kroków wykonania.
2 Koncepcje podstawowe
2.1 Terminologia i jej znaczenie
Przed przystapieniem
˛
do programowania skryptów w programie ANT, warto przyswoić sobie terminologi˛e towarzyszac
˛ a˛ temu produktowi.
Każdy skrypt A N Ta to plik zapisany w j˛ezyku X M L (domyślnie A N T poszukuje pliku o nazwie
build.xml, choć nie trzeba si˛e do tej konwencji stosować). Ilustracja ?? prezentuje główne bloki,
z których składa si˛e każdy skrypt: cele, zadania i powiazania.
˛
Ich krótkie omówienie znajduje si˛e
poniżej.
cele Każdy skrypt składa si˛e z zestawu nazwanych celów (ang. target). Każdy cel powiniem posiadać unikalna˛ nazw˛e, która jednocześnie definiuje jego przeznaczenie. I tak typowymi
celami b˛eda:
˛
skrypty A N Ta
cele
• clean — cel czyszczacy
˛ projekt z plików tymczasowych,
• compile — cel kompilujacy
˛ pliki źródłowe,
• test — cel uruchamiajacy
˛ testy jednostkowe,
• build — cel kompilujacy
˛ pliki źródłowe i wszelka˛ inna dokumentacj˛e (przygotowanie
wersji dystrybucyjnej).
Cele sa˛ dokładniej omówione w rozdziale ?? na stronie ??.
zadania Na każdy cel składaja˛ si˛e liniowo wykonywane zadania (ang. task). Zadania owe sa˛ w
wi˛ekszości predefiniowane i opisane w dokumentacji do AN Ta. Ich stopień złożoności jest
różny: od prostego kopiowania pliku (zadanie copy), do złożenia pełnej aplikacji internetowej (zadanie war). Przykłady dost˛epnych zadań poznamy w rozdziale ?? na stronie ??.
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
zadania
3
RYSUNEK 1: Wizualizacja struktury skryptu A N Ta. Plik skryptu, nazwany tutaj build.xml, zawiera
nazwane cele (target), które z kolei zawieraja˛ podzadania (task). Cele sa˛ powiazane
˛
mi˛edzy soba˛ zależnościami (ang. dependency).
powiazania
˛
Jeśli wykonanie jednego celu zależy od pomyślnego wykonania innego, to można zdefiniować powiazanie
˛
lub zależność (ang. dependency) mi˛edzy celami. Przykładowo,
zadanie uruchamiajace
˛ testy jednostkowe zależy od tego, czy udało si˛e pomyślnie przeprowadzić proces kompilacji. Zadanie kompresji finalnego pliku Z I P z projektem może zależeć
zarówno od poprawnej kompilacji, jak i (co wystarczy) od poprawnego wykonania testów.
Klarowne deklaracje zależności mi˛edzy celami sa˛ głównym atutem A N Ta. Poprawnie
zaprojektowany plik automatyzacji zawiera autonomiczne, drobne cele, które sa˛ powiazane
˛
ze soba˛ w wi˛eksza˛ całość właśnie przy pomocy powiaza
˛ ń. Wielokrotnie zdarza
si˛e, że niektóre cele nie posiadaja˛ wcale zadań, a jedynie sieć zależności łacz
˛ ac
˛ a˛ inne
cele w jeden bardziej skomplikowany.
Programista A N Ta nie musi przejmować si˛e poprawna˛ kolejnościa˛ wykonania celów
— zadanie sortowania ich w odpowiedniej kolejności (sortowanie topologiczne) przejmuje na siebie A N T.
2.2 Plik skryptu i uruchamianie programu
ANT
Plik projektu to plik zapisany w j˛ezyku XML, który zawiera w sobie definicj˛e dost˛epnych w projekcie celów. Zwykle dla każdego projektu mamy jeden plik automatyzujacy
˛ zadania z nim zwiazane.
˛
Oczywiście w razie konieczności plików takowych można mieć wi˛ecej niż jeden (co komplikuje
jednak nieco wywołanie programu ant, bowiem należy wtedy wskazać, który plik ma być analizowany).
Każdy plik projektu musi obowiazkowo
˛
zawierać cel domyślny (wywoływany, gdy nie poda si˛e żadnego argumentu do polecenia ant. Trywialnym skryptem może wi˛ec być znakomity
przykład „hello world”:
1
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
3
4
5
6
7
<project name="My project" default="hello">
<target name="hello" description="Says hello">
<echo>Hello world.</echo>
</target>
</project>
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
zależności
4
Należy zwrócić uwag˛e na atrybut default, który wskazuje domyślny cel. Uruchomienie tego
skryptu1 daje nast˛epujacy
˛ wynik:
g:\projects>ant -f empty.xml
Buildfile: empty.xml
1
2
3
hello:
[echo] Hello world.
4
5
6
BUILD SUCCESSFUL
Total time: 1 second
7
8
Opcja -f służy do wskazania pliku skryptu o nazwie innej niż build.xml (w przypadku
której może zostać pomini˛eta). Jak widać z powyższego listingu, wynikiem działania programu
jest informacja o celach i zadaniach, które zostały wykonane.
Argumentami programu A N T sa˛ cele, które należy wykonać. Równie dobrze możemy wi˛ec
wpisać:
Uruchamianie
specyficznych celów
g:\projects>ant -q -f empty.xml hello
[echo] Hello world.
1
2
3
BUILD SUCCESSFUL
Total time: 0 seconds
4
5
Tym razem program A N T uruchomiono z opcja˛ -q, która powoduje mniejsza˛ liczb˛e wypisywanych komunikatów (ang. quiet) oraz ze specyficznym celem hello (w naszym przypadku
identycznym z domyślnym).
Aby dowiedzieć si˛e, jakie cele zawiera plik A N Ta, można przekazać do programu opcj˛e -p:
Informacja o
dost˛epnych celach
g:\projects>ant -f empty.xml -p
Buildfile: empty.xml
1
2
3
Main targets:
4
5
hello Says hello
Default target: hello
6
7
Jak widać, jedyny cel (domyślny) tego pliku to hello.
2.3 Cele
Jak już wspomnieliśmy, cele to główne bloki budujace
˛ plik skryptu ANTa. Każdy cel zawiera atrybut name, który jest jednoznacznym identyfikatorem tego celu. Dodatkowo można w definicji
celu umieścić atrybut description, który pojawi si˛e jako opis tego celu w momencie wywołania A N Ta z opcja˛ -p.
Konwencja nazw celów jest oczywiście jedynie umowa.
˛ Dla projektu łatwo jest wypisać wszystkie zdefiniowane w nim cele (wraz z dokumentacja),
˛ wi˛ec nawet zarzucenie tej konwencji nie czyni dużej szkody. Doświadczony programista b˛edzie jednak
oczekiwał celów o określonych nazwach (takich jak clean czy build).
Plik A N Ta definiujacy
˛ dwa cele: hello i world może wygladać
˛
nast˛epujaco:
˛
1
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
3
4
5
6
<project name="Hello-1" default="hello">
<target name="hello" description="Says hello">
<echo>Hello</echo>
</target>
7
8
9
10
11
<target name="world" description="Says world">
<echo>World.</echo>
</target>
</project>
1 Instalacja programu A N T jest omówiona w punkcie ?? na stronie ??
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
5
Przykładowe zaś wykonanie powyższego skryptu wyglada
˛ nast˛epujaco
˛ (prosz˛e zwrócić uwag˛e na
podane jawnie oba cele w argumentach do programu):
g:\projects>ant -f hello-1.xml world hello
Buildfile: hello-1.xml
1
2
3
world:
[echo] World.
4
5
6
hello:
[echo] Hello
7
8
9
BUILD SUCCESSFUL
Total time: 0 seconds
10
11
2.4 Powiazania
˛
Zależność jednego celu od drugiego definiujemy przy pomocy atrybutu depends w elemencie
target. Wartościa˛ atrybutu sa,˛ oddzielone przecinkami, nazwy celów, które maja˛ si˛e wykonać przed zadanym. Przykładowo, nasz poprzedni skrypt definiujacy
˛ cele hello i world może
wygladać
˛
nast˛epujaco:
˛
1
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
3
4
5
6
<project name="Hello-2" default="hello">
<target name="hello" description="Says hello">
<echo>Hello</echo>
</target>
7
8
9
10
11
<target name="world" description="Says world" depends="hello">
<echo>World.</echo>
</target>
</project>
Wówczas wywołanie celu world b˛edzie zawsze poprzedzone wykonaniem celu hello:
g:\projects>ant -f hello-2.xml world
Buildfile: hello-2.xml
1
2
3
hello:
[echo] Hello
4
5
6
world:
[echo] World.
7
8
9
BUILD SUCCESSFUL
Total time: 0 seconds
10
11
2.5 Zadania
Zadania w skrypcie A N Ta sa˛ deklarowane jako elementy j˛ezyka X M L wewnatrz
˛
celu. Zadania
mniej skomplikowane sa˛ zwykle deklarowane jako elementy puste (jedynie z atrybutami), lub
zawierajace
˛ pewne instrukcje wewnatrz
˛ deklaracji. Przykładowo, w poniższym celu tworzony jest
katalog i wyświetlana jest informacja dla użytkownika:
1
2
3
4
<target name="create.tmp">
<mkdir dir="tmp" />
<echo>Folder "tmp" created.</echo>
</target>
Nietrudno jest zgadnać,
˛ że A N T wykonuje zadania w kolejności ich deklaracji w skrypcie. Ten
i inne ważne elementy sposobu wykonania przez A N T skryptu automatyzacji podsumowano w
punktach poniżej:
Sposób wykonania
skryptu
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
6
1. Zadania sa˛ wykonywane sekwencyjnie: w kolejności zależności mi˛edzy celami, a nast˛epnie
w obr˛ebie jednego celu.
2. W ogólnym przypadku cały skrypt b˛edzie wykonywany dokładnie przez jeden watek.
˛
Zrównoleglenie zadań jest możliwe przy pomocy zadania o nazwie parallel, jednak w tym tekście
nie b˛edziemy poszerzali tego zagadnienia.
3. Wykonanie skryptu jest przerywane i kończy si˛e bł˛edem w momencie, gdy którekolwiek
zadanie zakończy si˛e bł˛edem (pozostałe zadania nie sa˛ wykonywane). W przypadku niektórych zadań można w sposób jawny żadać
˛
ignorowania bł˛edów wykonania.
Powyższe zasady ilustruje nast˛epujacy
˛ przykład:
1
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
3
4
5
6
7
8
<project name="Failure" default="build">
<target name="build">
<copy file="from.txt" tofile="to.txt" />
<echo>File copied.</echo>
</target>
</project>
Wykonanie tego skryptu (kopiowanie pliku, który nie istnieje) kończy si˛e bł˛edem. Prosz˛e zwrócić
uwag˛e na to, że zadanie echo nie wykonało si˛e:
>ant -f failure.xml
Buildfile: failure.xml
1
2
3
build:
4
5
BUILD FAILED
D:\failure.xml:5: Warning: Could not find file D:\from.txt to copy.
6
7
8
Total time: 1 second
9
Można jednak polecić zadaniu copy ignorowanie bł˛edów:
1
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2
3
4
5
6
7
8
<project name="Failure" default="build">
<target name="build">
<copy file="from.txt" tofile="to.txt" failonerror="false" />
<echo>File copied.</echo>
</target>
</project>
wtedy cały skrypt kończy si˛e sukcesem:
>ant -f failure-2.xml
Buildfile: failure-2.xml
1
2
3
build:
[copy] Warning: Could not find file D:\from.txt to copy.
[echo] File copied.
4
5
6
7
BUILD SUCCESSFUL
Total time: 0 seconds
8
9
Zadania o wi˛ekszym stopniu skomplikowania moga˛ składać si˛e z paru zagnieżdżonych instrukcji j˛ezyka X M L (w tym również deklaracji zbiorów plików, omówionych w rozdziale ??).
Przykład takiego bardziej skomplikowanego zadania (detale tutaj pomijamy) znajduje si˛e poniżej:
1
2
<junit dir="${build.dir}/jni-testdir" fork="true"
haltonerror="true" haltonfailure="true" printsummary="false">
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
7
3
<env key="LD_LIBRARY_PATH" file="${build.dir}/jni-testdir" />
4
5
6
7
8
9
<classpath>
<pathelement path="${build.dir}/classes" />
<pathelement path="${build.dir}/test" />
<path refid="libs" />
</classpath>
10
11
<formatter type="plain" usefile="false" />
12
13
<sysproperty key="java.library.path" path="${build.dir}/jni-testdir" />
14
15
16
17
18
19
20
<batchtest>
<fileset dir="${build.dir}/test">
<include name="**/*Test.class" />
</fileset>
</batchtest>
</junit>
Powstaje oczywiście pytanie skad
˛ czerpać wiedz˛e na temat dostepnych zadań? W wi˛ekszości
zastosowań w zupełności wystarczał b˛edzie zestaw podstawowych zadań dostarczany z A N Tem
(tak zwanych core tasks). Ich świetny opis i zestawienie oferuje dokumentacja ANTa, dost˛epna na
stronie http://ant.apache.org/manual (należy wybrać z menu opcj˛e Ant Tasks a nast˛epnie
Core Tasks). Inna użyteczna biblioteka zadań to A N T- CO N T R I B, dost˛epna pod adresem: http:
//ant-contrib.sourceforge.net/.
Tam, gdzie zadania podstawowe lub ich kompozycja nie wystarcza, można zawsze pokusić
si˛e o napisanie własnego zadania w j˛ezyku Java lub w formie skryptu. Tematyk˛e t˛e porusza
rozdział ??.
2.6 Deklarowanie zbiorów plików i katalogów
Automatyzacja budowy projektu to zwykle manipulacje pewnymi zbiorami plików. Wiele zadań
(przykładowo copy, delete lub javac) umożliwia deklarowanie zbiorów plików w postaci elementu fileset. Pojedynczy element fileset zawsze wskazuje na jakiś katalog w systemie
plików. Domyślnie jego wartościa˛ sa˛ wszystkie pliki i katalogi zawarte we wskazanym katalogu.
Zbiór ten może być zaw˛eżony poprzez użycie klauzul właczenia
˛
(include) lub wyłaczenia
˛
(exclude)
ścieżek plików pasujacych
˛
do pewnych wzorców. Przykładowo, wszystkie pliki z rozszerzeniem
java w katalogu src można skopiować używajac
˛ nast˛epujacej
˛ deklaracji:
1
2
3
4
5
<copy todir="src-copy">
<fileset dir="src">
<include name="**/*.java" />
</fileset>
</copy>
Jak widać wzorce w elementach include i exclude sa˛ specyficzne dla ANTa (nie sa˛ to wyrażenia regularne). Symbole specjalne, które moga˛ pojawić si˛e we wzorcu to:
S Y MB O L
O PI S
*
Symbol zast˛epujacy
˛ dowolny ciag
˛ znaków w nazwie pliku lub katalogu.
Symbol oznaczajacy
˛ dowolny ciag
˛ podkatalogów.
Symbol zast˛epujacy
˛ dowolna˛ liter˛e w nazwie pliku lub katalogu.
**
?
Sprawne posługiwanie si˛e wzorcami wymaga pewnej praktyki. Należy poświ˛ecić jej
choć troch˛e czasu. Jakie pliki wyznacza ten fileset?
1
2
3
4
<fileset dir=".">
<include name="**/local/**/*Test.java" />
<exclude name="**/Controller*.java" />
</fileset>
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
8
2.7 Deklarowanie i użycie ścieżek
Ten rozdział wymaga jeszcze ukończenia. Prosz˛e słuchać na zaj˛eciach! Wi˛ecej informacji znajduje si˛e również pod adresem: http://ant.apache.org/manual/using.
html#path.
2.8 Deklarowanie i użycie stałych w projekcie
Ten rozdział wymaga jeszcze ukończenia. Prosz˛e słuchać na zaj˛eciach! Wi˛ecej informacji znajduje si˛e również pod adresem: http://ant.apache.org/manual/using.
html#properties
3 Programowanie własnych zadań
Programowanie własnych zadań w programie A N T jest bardzo, bardzo łatwe i daje wiele satysfakcji (i możliwości, oczywiście). Zaprogramowanie nowego zadania sprowadza si˛e do napisania
klasy, która deklaruje metod˛e o sygnaturze public void execute()2 .
Ten rozdział wymaga jeszcze ukończenia. Prosz˛e słuchać na zaj˛eciach!
Wi˛ecej informacji znajduje si˛e również w rozdziale Developing with Ant w dokumentacji A N Ta pod adresem: http://ant.apache.org/manual/.
2 Poprawne zadania powinny dziedziczyć z klasy
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
org.apache.tools.ant.Task, jednak nie jest to wymagane.
9
4 Ćwiczenia praktyczne
4.1 Podstawy
4.1.1 Skrypt tworzacy
˛ katalogi tymczasowe i kasujacy
˛ je.
1
<project name="cw1" basedir="." default="init">
2
3
4
5
6
<target name="init">
<mkdir dir="tmp" />
<mkdir dir="tmp/build" />
</target>
7
8
9
10
11
<target name="clean">
<delete dir="tmp" failonerror="true"
includeemptydirs="true" quiet="true" />
</target>
12
13
</project>
4.1.2 Skrypt kompilujacy
˛ źródła, wprowadzenie stałych
1
<project name="cw2" basedir="." default="compile">
2
3
<property name="build.dir" location="tmp/build" />
4
5
6
7
<target name="init">
<mkdir dir="${build.dir}" />
</target>
8
9
10
11
12
<target name="clean" description="Clean up temporary files">
<delete dir="${build.dir}" failonerror="true"
includeemptydirs="true" quiet="true" />
</target>
13
14
15
16
17
18
19
20
21
<target name="compile" depends="init" description="Compiles sources">
<javac destdir="${build.dir}"
optimize="false" debug="true" deprecation="true"
failonerror="true"
includeantruntime="false" includejavaruntime="false">
<src location="src" />
</javac>
</target>
22
23
</project>
4.1.3 Skrypt kompilujacy
˛ źródła, z ustawieniem specyficznej ścieżki klas (CLASSPATH)
1
<project name="cw3" basedir="." default="compile">
2
3
<property name="build.dir" location="tmp/build" />
4
5
6
7
<target name="init">
<mkdir dir="${build.dir}" />
</target>
8
9
10
11
12
<target name="clean" description="Clean up temporary files">
<delete dir="${build.dir}" failonerror="true"
includeemptydirs="true" quiet="true" />
</target>
13
14
15
16
17
18
19
20
<target name="compile" depends="init" description="Compiles sources">
<javac destdir="${build.dir}"
optimize="false" debug="true" deprecation="true"
failonerror="true"
includeantruntime="false" includejavaruntime="false">
<src location="src-cw3" />
<classpath>
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
10
21
22
23
24
<fileset dir="lib" includes="**/*.jar" />
</classpath>
</javac>
</target>
25
26
</project>
4.1.4 Skrypt tworzacy
˛ plik J A R
1
<project name="cw4" basedir="." default="jar">
2
3
4
<property name="build.dir" location="tmp/build" />
<property name="dist.dir" location="tmp/dist" />
5
6
7
8
9
<target name="init">
<mkdir dir="${build.dir}" />
<mkdir dir="${dist.dir}" />
</target>
10
11
12
13
14
<target name="clean" description="Clean up temporary files">
<delete dir="${build.dir}" failonerror="true"
includeemptydirs="true" quiet="true" />
</target>
15
16
17
18
19
20
21
22
23
24
25
26
<target name="compile" depends="init" description="Compiles sources">
<javac destdir="${build.dir}"
optimize="false" debug="true" deprecation="true"
failonerror="true"
includeantruntime="false" includejavaruntime="false">
<src location="src-cw3" />
<classpath>
<fileset dir="lib" includes="**/*.jar" />
</classpath>
</javac>
</target>
27
28
29
30
31
32
<target name="jar" depends="compile">
<jar compress="true" jarfile="${dist.dir}/test.jar" update="false">
<fileset dir="${build.dir}" />
</jar>
</target>
33
34
</project>
4.2 Skrypty bardziej zaawansowane
4.2.1 Testowanie kodu z A N Ta przy pomocy JUnita
1
<project name="cw5" basedir="." default="test">
2
3
<property name="build.dir" location="tmp/build" />
4
5
6
7
<target name="init">
<mkdir dir="${build.dir}" />
</target>
8
9
10
11
12
<target name="clean" description="Clean up temporary files">
<delete dir="${build.dir}" failonerror="true"
includeemptydirs="true" quiet="true" />
</target>
13
14
15
16
17
18
19
20
21
<target name="compile" depends="init" description="Compiles sources">
<javac destdir="${build.dir}"
optimize="false" debug="true" deprecation="true"
failonerror="true"
includeantruntime="false" includejavaruntime="false">
<src location="src-cw3" />
<classpath>
<fileset dir="lib" includes="**/*.jar" />
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
11
22
23
24
</classpath>
</javac>
</target>
25
26
27
28
29
30
<target name="test" depends="compile" description="Runs test cases">
<junit dir="${build.dir}" fork="true"
errorproperty="junit.error" failureproperty="junit.failure"
haltonerror="true" haltonfailure="true"
printsummary="true">
31
32
33
34
<classpath>
<pathelement location="${build.dir}" />
</classpath>
35
36
37
38
39
40
41
42
43
<batchtest>
<fileset dir="${build.dir}">
<include name="**/*Test.class" />
</fileset>
</batchtest>
</junit>
</target>
</project>
4.3 Programowanie własnych zadań
4.3.1 Skrypt z własnym zadaniem: dodaj
Skrypt A N Ta, który najpierw kompiluje kod zadania, a nast˛epnie je wywołuje:
1
2
<project name="cw8" basedir="." default="dodaj">
<property name="build.dir" location="tmp/build" />
3
4
5
6
7
8
9
10
11
12
13
14
15
<target name="compile">
<mkdir dir="${build.dir}" />
<javac destdir="${build.dir}"
optimize="false" debug="true" deprecation="true"
failonerror="true"
includeantruntime="true">
<src location="src-cw8" />
<classpath>
<fileset dir="lib" includes="**/*.jar" />
</classpath>
</javac>
</target>
16
17
18
19
20
21
22
23
24
<target name="dodaj" depends="compile">
<taskdef name="dodaj" classname="pakiet.Dodaj">
<classpath location="${build.dir}" />
</taskdef>
<dodaj a="5" b="6" wynik="stala.wynik" />
<echo message="Wynik: ${stala.wynik}" />
</target>
</project>
Sam kod zadania Dodaj w Javie:
1
package pakiet;
2
3
import org.apache.tools.ant.*;
4
5
6
7
8
9
public class Dodaj {
private int a;
private int b;
private String name;
private Project project;
10
11
12
13
public void setA(int a) {
this.a = a;
}
14
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
12
public void setB(int b) {
this.b = b;
}
15
16
17
18
public void setWynik(String name) {
this.name = name;
}
19
20
21
22
public void setProject(Project project)
{
this.project = project;
}
23
24
25
26
27
28
29
30
31
}
public void execute() {
project.setProperty(name, Integer.toString(a + b));
}
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss
13
A Instalacja A N Ta
Instalacja programu A N T polega na wykonaniu nast˛epujacych
˛
czynności:
1. Pobraniu pliku Z I P z programem ze strony http://ant.apache.org.
2. Odkompresowaniu pliku Z I P do katalogu lokalnego.
Prosz˛e zwrócić uwag˛e by w ścieżce prowadzacej
˛ do instalacji nie było znaków spacji
ani innych specjalnych. Dobrym kandydatem jest, na przykład, c:\java\ant.
3. Ustawieniu zmiennej systemowej ANT_HOME tak, aby wskazywała na katalog instalacyjny.
4. Dodaniu katalogu ANT_HOME/bin do ścieżki domyślnej (zmiennej środowiskowej PATH).
Program ANT jest gotowy do pracy gdy wywołanie ant powoduje wypisanie komunikatu o braku
pliku build.xml.
Niektóre zadania A N Ta wymagaja˛ specyficznych kroków instalacji. Przykładowo, zadanie kompilacji plików Java (javac) wymaga zdefiniowania zmiennej
środowiskowej JAVA_HOME, wskazujacej
˛
na katalog instalacyjny JDK (Java Development Kit).
B Inne materiały
Program A N T posiada bardzo dobra˛ dokumentacj˛e użytkownika (niestety jedynie w j˛ezyku angielskim), która dołaczana
˛
jest do programu (katalog docs) oraz jest dost˛epna on-line pod adresem:
http://ant.apache.org/manual/index.html.
Id: ant-zajecia.tex 2504 2006-12-09 08:37:20Z dweiss

Podobne dokumenty