neo's nice place neo's nice place sitemap
neo's nice place
main
about me
berlin
guestbook
links
links
miscellaneous
sitemap
 

 

Apache ANT

Was ist ANT?

ANT ist ein Tool, das es dem Programmierer erlaubt, durch eine zentral verwaltete Konfigurationsdatei seinen Java-Quellcode zu kompilieren. Dabei steht ANT nicht für "Ameise" sondern nach James Duncan Davidson, dem Vater von ANT, steht es für "Another Neat Tool".

Aber warum ein neues "Build-Tool", wenn es doch make &Co gibt? Diese "Build-Tools" haben alle einen grossen Nachteil. Sie sind nicht Plattform unabhängig. Auch wenn man in der glücklichen Lage ist, ein "make" für jedes OS zu besitzen, heisst das noch lange nicht das der Quellcode auch überall kompiliert. Denn die sog. "Makefile"'s, die den Kompilationsvorgang steuern, können (und sind auch i.d.R.) Plattformabhängig. Diese Unzulänglichkeiten wollten die ANT Authoren für Java aus der Welt schaffen und haben so das vorliegende Tool entwickelt.

Die Kompilation eines Programmpakets wird durch eine XML Datei gesteuert. Standardmäßig "build.xml" genannt. Anders als in den "Makefile"'s kann man hier aber nur von ANT vorgefertigte Befehle (die sog. Tasks) verwenden. Das garantiert die Plattformunabhängigkeit. Natürlich hat man auch die Möglichkeit eigene Tasks zu kompilieren.

Installation von ANT 1.4.1

Man hat zwei Möglichkeiten um ANT zu installieren. Zum einen kann man vorgefertigte Binaries verwenden und zum anderen kann man den Quellcode auch selbst kompilieren.

Vorraussetzung für ANT ist allerdings eine Funktionierende Java Installation (Bei mir 1.4). Die aktuelle 1.4er Standard Edition kann man sich hier runterladen.

Hat man alle Dateien beisammen, kann die Installation losgehen.

  1. Java installieren
    • Windows:
    • Auf die Datei j2sdk-1_4_0-win.exe doppelklicken und dem Installationsvorgang folgen (Am besten alle Einstellungen so lassen wie sie sind). In die Datei C:\autoexec.bat müsst ihr die PATH Variable um folgendes erweitern:

      ;C:\j2sdk1.4.0\bin;C:\ant\bin

      damit die Java Programme ausgeführt werden können. Damit ANT später richtig funktioniert, sollte man noch folgende Zeilen in die C:\autoexec.bat einfügen:

      set JAVA_HOME=C:\j2sdk1.4.0
      set ANT_HOME=C:\ant

    • Linux:
    • Die Datei j2sdk-1_4_0-linux-i386.bin in das Zielverzeichnis kopieren (Bei mir /usr/local). In dieses Verzeichnis wechseln und in der Shell sh j2sdk-1_4_0-linux-i386.bin eingeben und der Installation folgen. Nach Abschluss befindet sich Java im Verzeichnis /usr/local/j2sdk1.4.0. Mit einem beliebigen Texteditor die Datei /etc/profile öffnen und folgende Zeilen am ANFANG eintragen:

      JAVA_HOME=/usr/local/j2sdk1.4.0
      ANT_HOME=/usr/local/jakarta-ant-1.4.1
      export $JAVA_HOME $ANT_HOME

      Jetzt muss noch die PATH Variable um folgende Zeilen erweitert werden:

      :$JAVA_HOME/bin:$ANT_HOME/bin
  2. ANT installieren
    • Windows:
    • Die Datei jakarta-ant-1.4.1-bin.zip nach c:\ entpacken und das Verzeichnis jakarta-ant-1.4.1 in ant umbenennen (Der Grund ist ein Fehler in der Windows Batch Verarbeitung). ANT sollte dann bereits laufen. Falls ANT mit einer Fehlermeldung abbricht (Kein Speicherplatz mehr im Umgebungsbereich), müsst ihr die Speicher Einstellungen eurer DOS Box ändern. Und zwar muss die Einstellung "Ursprünglicher Umgebungsspeicher" von "Automatisch" auf "1024" eingestellt werden.

    • Linux:
    • Unter Linux muss die Datei jakarta-ant-1.4.1-bin.zip nach /usr/local entpackt werden. Auch hier sollte ANT mit dem Aufruf sh ant laufen. Alternativ kann man auch ein chmod +x $ANT_HOME/bin/ant durchführen um ANT in Zukunft mit ant zu starten.

Aufbau einer Beispiel "build.xml" Datei

Wie schon mehrfach erwähnt, wird ANT durch eine XML Datei gesteuert. Aber keine Angst, wenn man ersteinmal die Struktur verstanden hat, ist es relativ einfach seine eigene build.xml zu erstellen.
Jedes Projekt enthält eine solche XML Datei. Ein Projekt wird mit den Tags

<project name="Projektname" default="Standard Target" basedir="Projekt Wurzelverzeichnis">
Projektdefinitionen (z.B. Variablen, Targets, ...)
</project>

definiert. Also alles was zwischen diesen beiden Tags steht, gehört zu dem Projekt an dem gearbeitet wird. name sollte einen sinnvollen Projektnamen enthalten wie z.B. Torres. Der Parameter default enthält das Default Target (Was Targets sind, steht weiter unten). Dieses Target wird ausgeführt, wenn ANT ohne Kommandozeilen Paramter aufgerufen wird. basedir ist das Verzeichnis, in dem ANT nach Java Datei zum Kompilieren sucht. Verzeichnisse werden im Unix Format angegeben (also /Dir/Subdir/...).

Kommentare werden mit

<!--
Kommentar
-->

beschrieben. Dann kann man sich Variablen definieren mit

<property name="Variablenname" value="Der Wert der variablen"/>

Die Variablen Definitionen (Properties) sollten am Anfang des Projekts stehen, damit man von überall her auf diese zugreifen kann. Ein Zugriff auf eine dieser Variablen geschieht durch "${Variablenname}". Wichtig, die Anführungszeichen gehören überall mit dazu.

Das wichtigste an dem Projekt sind die sog. Targets. Diese beschreiben das eigentliche Kompilierverhalten unseres Projektes. Targets können von anderen Targets abhängen (Definiert durch das Schlüsselwort "depends"). Wichtige Targets sind z.B. "compile" oder "clean". Die Targets sind ähnlich aufgebaut wie die Variablendefinitionen

<target name="Targetname z.B. compile">
Definition der Aufgabe (Task) dieses Targets. Z.B. Programm Kompilieren oder Dateien löschen.
</target>

Soll ein Target von einem anderen Target abhängen (d.h. das andere Target wird zuerst ausgeführt), dann sieht die Definition so aus

<target name="ein anderes Target">
Aufgabe dieses Targets (z.B. Verzeichnisse anlegen)
</target>
<target name="Targetname z.B. compile" depends="ein anderes Target">
Definition der Aufgabe (Task) dieses Targets. Z.B. Programm Kompilieren oder Dateien löschen.
Es wird zuerst "ein anderes Target" ausgeführt und anschliessend dieses hier.
</target>

Innerhalb solcher Targets können wie schon angesprochen ein oder mehrere Tasks ausgeführt werden. ANT kommt schon mit einem gewissen Satz an Tasks daher. Z.B. könnte ein Task lauten

<javac srcdir="${src}" destdir="${build}"/>

D.h. soviel wie, kompiliere alle Dateien im "src" Verzeichnis (siehe Properties) und lege die Kompilate im "build" Verzeichnis ab. Genauso gibt es Tasks zur Erzeugung von "jar-Archiven" (<jar ...>) oder zum erstellen und löschen von Verzeichnissen.

Anhand der folgenden Beispiel Datei werde ich versuchen das ganze zu verdeutlichen. Diese Datei zusammen mit einem Beispiel Programm kann man sich hier saugen.


      <?xml version="1.0" encoding="ISO-8859-1"?>



3     <project name="Java Test" default="dist" basedir=".">





6     <!-- Globale Parameter einstellen -->

      <property name="src" value="."/>

      <property name="build" value="build"/>

9     <property name="dist" value="dist"/>





12    <!-- Erstelle "init" Target. Es erzeugt das "build" Verzeichnis -->

      <target name="init">

      <mkdir dir="${build}"/>

15    </target>





18    <!-- Erstelle "compile" Target welches, vom "init" Target abhängt -->

      <target name="compile" depends="init">

      <javac srcdir="${src}" destdir="${build}"/>

21    </target>





24    <!-- Erstelle "dist" Target, welches das komplette Programmpaket erzeugt -->

      <!-- Es ruft zuerst das "compile" Target auf, in dem festgestellt wird, -->

      <!-- das zuerst "init" aufgerufen werden muss. -->

27

      <target name="dist" depends="compile">

      <!-- Erzeugt das Distributions Verzeichnis - Dorthin kommt das Programm -->

30    <mkdir dir="${dist}/lib"/>



      <!-- Erzeugt das Programmpaket und kopiert alles ins Distributions -->

33    <!-- /lib Verzeichnis -->

      <jar jarfile="${dist}/lib/jtest.jar" basedir="${build}"

             manifest="manifest"/>

36    </target>





39    <!-- Das "clean" Target löscht die compilate wieder -->

      <target name="clean">

      <delete dir="${build}"/>

42    <delete dir="${dist}"/>

      </target>



45    </project>

      

Zeile 1 beschreibt die verwendete XML version und den zugrundeliegenden Zeichensatz. Standardmässig ist UTF-8 eingestellt, was jedoch bei mir zu einer Fehlermeldung führte.
Zeile 3 leitet das Projekt ein. Der Name ist "Java Test". Standardmässig wird das "dist" Target (Distribution) ausgeführt und als Projekt Wurzelverzeichnis wurde das "." Verzeichnis gewählt (Der Punkt steht für das Verzeichnis in dem sich die build.xml Datei befindet und das sollte das Projektwurzelverzeichnis sein).
Zeilen 7-9 definieren Variablen. Hier insbesondere Pfadvariablen. Zu beachten ist das die Pfade relativ zu dem eingestellten Wurzelverzeichnis sind.
Zeilen 13-15 bilden ein erstes Target (Name = "init"). Dieses hat zur Aufgabe das "build" Verzeichnis zu erzeugen indem die Task "mkdir" aufgerufen wird.
Zeilen 19-21 erstellen das "compile" Target. Durch Aufruf des "javac" Tasks, werden alle Java Dateien im "src" Verzeichnis kompiliert und im "build" abgelegt. Auf die Verzeichnisnamen wird über die zuvor definierten Variablen zugegriffen. Eine Besonderheit dieses Targets ist, das es von dem "init" Target abhängt. Also wird zuerst "init" ausgeführt und anschliessend "compile".
Zeilen 28-36 stellen das "dist" Target dar. Dieses Target wird standardmässig ausgeführt. Auch dieses Target hängt von den anderen Targets ab. Wie man erkennt können auch mehrere Tasks in einem Target ausgeführt werden. Zuerst wird das "dist/lib" Verzeichnis erstellt und anschliessend aus den Kompilaten ein "jar-Archiv" erstellt und im "dist/lib" Verzeichnis abgelegt.
Zeilen 40-43 ist ein Target um unseren Quellcode Baum zu säubern. D.h. es werden alle Dateien und Verzeichnisse gelöscht, die nichts mit dem Quelltext zu tun haben (z.B. Kompilate, temp-Dateien usw.).
Zeile 45 schliesst das Projekt ab.

Die Manifest Datei

Die Manifest Datei hat eigentlich nichts mit ANT zu tun. Dieses ist eine Besonderheit von Jar-Archiven. Wenn man ein Jar-Archiv ausführen möchte, muss das Java Laufzeit System wissen, welche Klasse die "main"-Methode enthält. Dieses kann man in der Manifest Datei folgendermassen bekannt machen:

Main-Class: <Die Java Datei mit der "main"-Methode ohne Endung>

Ausserdem bekommt man eine Fehlermeldung bei der Ausführung, wenn man externe Programmpakete, wie zum Beispiel log4j, in seinem Programm benutzt. Man bekommt eine "NoClassDefFoundException". Auch dieses Problem kann man umgehen, wenn man folgendes in die Manifest Datei schreibt:

Class-Path: <Alle Jar-Archive durch Leerzeichen getrennt mit Endung.>

Also z.B. "Class-Path: log4j.jar". Mit dieser Bekanntmachung, sucht das Java Laufzeit System die Datei "log4j.jar" in dem gleichen Verzeichnis wie die ausfhrende Jar-Datei. Pfad Angaben sind also alle relativ zu der ausfhrenden Jar-Datei.

Kurzreferenz

Als Zusammenfassung die wichtigsten Tasks und Targets mit den häufigsten Parametern.

  • <project name="NAME" default="DEFAULT TARGET" basedir="DIRECTORY"> ... </project>
  • Attribut Beschreibung Pflicht
    name Der Name des Projekts. nein
    default Standard Target das ausgeführt wird wenn kein anderes übergeben wurde. ja
    basedir Das Wurzelverzeichnis des Projekts. Wird es hier weggelassen, und auch die "basedir" Variable nicht gesetzt ist, wird das "build.xml" Verzeichnis genommen. nein
  • <property name="NAME" value="WERT">
  • Die Properties sind Name-Wert Paare und dienen hauptsächlich zur Variablendeklaration. ANT bietet einige voreingestellte Deklarationen an:
    Name Beschreibung
    basedir enthält das Verzeichnis, das unter "project" angegeben wurde. Fehlt es dort, wird das Verzeichnis der "build.xml" Datei gewählt.
    ant.file Der absolute Pfad zur "build.xml" Datei.
    ant.version Die ANT Version. Sollte 1.4.1 sein.
    ant.project.name Der Projektname wie unter "project" angegeben.
    ant.java.version Die verwendete Java Version
  • <target name="NAME"> ... </target>
  • Beschreibt ein Target des Projekts. Targets können von anderen Targets abhängig sein. Ausserdem besteht die Möglichkeit das ausführen von Targets durch if-unless Klauseln zu steuern.
    Name Beschreibung Pflicht
    name Der Name dieses Targets. ja
    depends Eine durch Komma getrennte Liste von Targets, von denen dieses Target abhängen soll. es werden zuerst diese Targets ausgeführt. nein
    if Dieses Target wird nur ausgeführt, wenn die Variable die hinter dem if bezeichnet wird, gesetzt wurde. nein
    unless Dieses Target wird nur ausgeführt, wenn die Variable die hinter unless steht, nicht gesetzt wurde. nein
    description Eine kurze Beschreibung dieses Targets nein
  • Einige wichtige Tasks
  • Name Funktion
    <mkdir dir="ADIR"/> Erzeugt das Verzeichnis "ADIR".
    <javac srcdir="SRC" destdir="DST"/> Kompiliert die Java Dateien, die unter "SRC" stehen und legt sie ins "DST" Verzeichnis ab.
    <jar jarfile="ZIEL" basedir="SRC" manifest="MANIFEST"/> Erzeugt aus den .class Dateien unter "SRC" ein "jar Archiv" und legt es in "ZIEL" ab. D.h. alle einzelnen Dateien werden zu einer grossen Datei zusammengefasst. Die "MANIFEST" Option gibt eine Datei an, in der die Klasse mit der zu verwendenden "main-Methode" angegeben wird.
    <java classname="MAIN" fork="true"/> Führt die Datei "MAIN" aus. In dieser Datei muss eine main Methode stehen.
    <java jar="ARCHIV.jar" fork="true"/> Fhrt das Jar-Archiv "ARCHIV.jar" aus.
    <echo message="TEXT"/> echo kann man in jedem Target verwenden. Es dient dazu w„hrend des Kompilierens zus„tzliche Informationen auszugeben.
    <echo> TEXT </echo> Mit dieser Konstellation kann man mehrzeiligen Text schreiben. Der Text wird genauso ausgegeben wie er hier angegeben wird.
    <tstamp/> Damit kann man die Zeitvariablen setzen. Diese sind ${DSTAMP}=yyyymmdd, ${TSTAMP}=hhmm und ${TODAY}=m t y.
    <copy todir="TODIR">
    <fileset dir="DIR" includes="*.jar"/>
    </copy>
    Kopiert alle Jar Dateien aus dem Verzeichnis "DIR" ins Verzeichnis "TODIR". Das ist eine sogenannte nested-Anweisung. Also das fileset Task ist in copy eingebettet. Es beschreibt eine Liste von Dateien, auf die copy Zugreift. "includes" ist ein optionales Argument. L„sst man es weg, so werden alle Dateien in "DIR" kopiert.
    <javadoc sourcepath="SRC" destdir="DST" packagenames="PACKAGE"/> Mit diesem Befehl kann man sich die sch”nen html Dokus zu seinem Programm erzeugen. Dabei werden alle Dateien im "SRC" Verzeichnis geparst. Die fertige Doku wird ins Verzeichnis "DST" abgelegt. Fr die Doku werden alle Dateien, die in "packagenames" angegeben sind, verwendet. Man kann den "*" Operator verwenden um mehrere Dateien und Verzeichnisse zu verwenden.
    <delete dir="ADIR"/>
    <delete file="AFILE"/>
    L”scht entweder "ADIR" oder "AFILE;".
  • <description> Text </description>
  • Dient zur Beschreibung von Stellen in der xml Datei. Diese Beschreibung kann man sich mit "ant -projecthelp" ansehen. Achtung: Mehrere solcher Description Sektionen fhren bei der Ausgabe zu einem zusammenh„ngenen Text.

Das sind ersteinmal die wichtigsten Befehle für ANT. Mit diesen kann man schon funktionierende "build.xml" Dateien aufbauen. Sollten im laufe des Projekts noch andere Befehle wichtig werden, so wird diese Liste natürlich vervollständigt.

Links

  1. Die ANT Homepage
  2. ANT Binary Distribution (v1.4.1)
  3. ANT Source Distribution (v1.4.1)
  4. ANT Dokumentation (v1.5Beta)
  5. Jar Spezifikation
  6. Beispiel Programm
    • Datei runterladen
    • In irgendein verzeichnis entpacken
    • In das "javatest" Verzeichnis wechseln
    • "ANT" in diesem Verzeichnis aufrufen
    • Programm starten mit "java -jar dist/lib/jtest.jar"
  7. Beispiel Programm Nr2 - Mit verbesserter xml Datei

Manuel Schulze
Last modified: Sun May 12 13:32:58 MEST 2002

top

sitemap