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