| home | suche | kontakt/johner | institut | hinweise studierende | tech-docs | blog | mindmailer |
![]() |
Projektautomatisierung mit ANT, Wozu?
Die Motivation für den Erfinder von ANT war ursprünglich, dass Build-Tools wie "make" etc. jeweils nur auf einer Plattform funktionieren. Andere Build-Tools lassen sich einfach für dieses eine Betriebssystem erweitern, jedoch beschränkt man sich damit auch wieder nur auf eine Plattform.
Darüber hinaus störte den Erfinder die unkomfortable "Nur-Text-Quelldatei" bei der bereits ein Leerzeichen oder TAB zu viel, die Build-Datei unbrauchbar machte.
ANT ist anders als diese Tools, denn es erbt von Java-Klassen und die Konfigurationsdateien sind in XML verfasst. Somit lässt es sich nicht so einfach durch Betriebssystem-Kommandos wie "find" (bei Linux) etc. erweitern, dafür läuft es aber auch auf mehreren Plattformen.
Ein weiterer Vorteil von ANT ist, dass es sich als Plugin in die Eclipse IDE einbinden lässt.
Was ist ein Build/Buildprozess
Ein Build-Prozess besteht aus der Kompilierung des Quellcodes, und dem Verbinden der für die Ausführung des Programmes benötigten Bibliotheken.
Darüber können auch Software-Tests (JUnit etc.) und die Dokumentation (JavaDocs) erstellt werden.
Ein Build-Prozess wird automatisch ausgeführt und benötigt immer eine Konfigurationsdatei. Diese ist bei ANT in XML beschrieben. In der Konfigurationsdatei sind Unterprozesse (Target) definiert und beschrieben wie diese von einander abhängen (Depend-Ziele).
Als Ergebnis eines Build-Prozesses wird in der Regel ein ausführbares Programm erzeugt. Darüber hinaus können Testergebnisse, Skripte und JavaDocs als Ergebnis geliefert werden.

Die Elemente einer ANT-Konfigurationsdatei
Wie bereits erwähnt handelt es sich bei der ANT-Konfigurationsdatei um eine XML-Datei.
Deshalb beginnt sie zunächst mit dem XML-Versionstag:
<?xml version="1.0"?>
Anschliessend folgt das obligatorische Wurzelelement. In diesem Fall ein Project-Element. Für diesen kann ein Name und ein Wurzelverzeichnis angegeben werden (basedir). Darüber hinaus braucht ein Project ein default-Attribut, welches definiert, mit welchem "target"-Element begonnen werden soll.
<project name="test" default="compile" basedir=".">
Anschliessend folgen die property-Tags. Diese übernehme die Funktion von Variablen. Es besitzt einen Namen und einen Wert. Möchte man in dem ANT-Skript auf die Variable zugreifen, so tut man dies mit : ${propertyname}
<property name="src" value="."/> 3
<property name="build" value="build"/>
Dann folgen die eigentlichen Aufgaben eines ANT-Skripts. Die Target-Elemente. Diese enthalten die Attribute name und depends. Mit depends wird die Ausführreihenfolge der Target-Elemente angegeben. Mit
<target name="compile" depends="init">
gibt man z. Bsp an, dass vor der Ausführung von compile zuerst init ausgeführt werden muss.
Im Target-Element steht nun z. Bsp. die Ausführung der Komplierung (javac) oder die Erzeugung eines Verzeichnis (mkdir). Eine komplette Liste der möglichen ANT-Befehle (Tasks) erhält man im Apache-Ant-Manual. http://ant.apache.org/manual/index.html
<mkdir dir="${build}"/>
<javac srcdir="${src}" destdir="${build}"/>
Das komplette ANT-Skript im Überblick:
<?xml version="1.0"?> 1
<project name="test" default="compile" basedir="."> 2
<property name="src" value="."/> 3
<property name="build" value="build"/>
<target name="init"> 4
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"> 5
<!-- Compile the java code -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
</project>
Schreiben eines eigenen ANT-Tasks
Reichen die Möglichkeiten der bestehenden ANT-Tasks nicht aus, so muss man seinen eigenen ANT-Task schreiben.
1. Dazu benötigt man zunächst nur eine Java-Klasse welche von org.apache.tools.ant.Task erbt.
2. Für jedes Attribut benötigt man eine setter-Method, damit der Wert des Attributes verändert werden kann.
3. Darüber hinaus benötigt der eigene Tasks auf jeden Fall eine execute-Methode, die aufgerufen wird, wenn der Tasks in einem Skript verwendet wird.
Beispiel für einen eigenen ANT-Task:
package com.mydomain;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
public class MyVeryOwnTask extends Task {
private String msg;
// The method executing the task
public void execute() throws BuildException {
System.out.println(msg);
}
// The setter for the "message" attribute
public void setMessage(String msg) {
this.msg = msg;
}
}
Dieser würde wie folgt in einem ANT-Skript verwendet werden:
<?xml version="1.0"?>
<project name="OwnTaskExample" default="main" basedir=".">
<taskdef name="mytask" classname="com.mydomain.MyVeryOwnTask"/>
<target name="main">
<mytask message="Hello World! MyVeryOwnTask works!"/>
</target>
</project>
