Einführung in Ant

Ant ist ein kostenloses und plattformunabhängiges Werkzeug um den build-Prozess zu unterstützen. Die Entstehung der Ant-Entwicklung ergab sich aus dem Open-Source-Projekt Tomcat. Zunächst wurde Ant nur projektintern für die Tomcat-build-Prozesse eingesetzt, allerdings entstand eine sehr hohe Resonanz auf Ant, sodass die Entwicklung in ein eigenständiges Open-Source-Projekt ausgegliedert wurde. Die Entwicklung des build-Werkzeugs Ant wurde in Java durchgeführt und somit ergibt sich auch die Voraussetzung, dass ein JDK auf dem Rechner installiert sein muss. Dadurch folgt der große Vorteil, dass Ant auf jeglichen Plattformen zur Verfügung steht.
Die Definition der Ant-Skripte findet in so genannten build-Dateien statt. Bei diesen build-Dateien handelt es sich um normale XML-Dateien, die den Build-Ablauf-Prozess darstellen. Zur Beschreibung stehen sogenannte Targets zur Verfügung. Jedes Target definiert ein bestimmten Teil des build-Prozesses. Als Beispiele seien hier z. B. die Kompilierungs-, Test- oder Ausführungsvorgänge genannt, aber auch jegliche andere Aufgaben wie Vorbereitungsschritte (erstellen der Verzeichnisstruktur) werden mit Hilfe von Targets realisiert. Jedes Target beschreibt wiederum eine Menge von den sogenannten Tasks. Ein Task kann dabei als ein bestimmter Teilvorgang angesehen werden, wie z. B. das Anlegen des build-Ordners. Viele dieser sogenannten Tasks werden von Haus aus von Ant mitgebracht. Eine komplette Liste ist auf der Homepage unter dem Punkt Dokumentation zu finden. Es können aber auch eigene Tasks definiert und in den Ant-Skripten verwendet werden. Die Verwendung von Ant ist nicht nur auf Java-Entwicklungsprojekte beschränkt, sondern jegliche Projekte können mit Hilfe von Ant den build-Prozess unterstützen. Zu dem stehen auch weitere build-Werkzeuge wie Maven zur Unterstützung zur Verfügung.

Ant im Umfeld von CSI

Bei Ant handelt es sich, wie im vorherigen Abschnitt beschrieben, um ein build-Werkzeug um automatisierte build-Vorgänge abzubilden. Die Automatisierungsfunktion stellt in dem Kontext von CSI einen großen Stellenwert dar. Es existiert eine Menge von unterschiedlichen Testwerkzeugen die in Hinsicht der Automatisierung mit Hilfe von Ant untersucht werden sollen. Dabei stellt sich die Frage, welche Unterstützung die untersuchten Testwerkzeuge in Hinblick der Automatisierung bieten. Die ersten Auswertungen der Testwerkzeuge ergaben eine hohe Unterstützung der Ant-Funktionalität bzw. eine hohe Unterstützung von Ant, die für die automatisierte Ausführung der einzelnen Tests verantwortlich ist. Durch die Nutzung von bestehenden Tasks, wie z. B. <junit> oder externen Tasks wie <testng> kann eine Großzahl von Tests automatisiert ablaufen. Bei dem externen Task <testng> handelt es sich um ein vom Hersteller entwickelten Task. Dieser Task lässt sich in Ant einbinden und ermöglicht somit die Steuerung des TestNG-Frameworks. Die Unterstützung aller Test-Werkzeuge ist allerdings nicht gegeben, da manche Testwerkzeuge einen eigenen Stil zur Analyse der Tests mitliefern. Dies macht es schwierig, die gewonnen Informationen der Tests mit Ant auszulesen und zu dokumentieren.

Installation

Die Installation von Ant ist in der bestehenden Dokumentation gut erläutert. Dazu muss zuerst einmal die aktuelle Ant Version von der Homepage heruntergeladen werden. Danach folgt das Entpacken des heruntergeladenen Archivs an einer beliebigen Stelle. Zum Schluss sollte noch die Umgebungsvariable %ANT_HOME%\bin in den Suchpfad der Shell aufgenommen werden. Als Voraussetzung muss ein aktuelles JDK auf dem Rechner installiert sein.

Architektur

Ant besteht aus einer ganzen Reihe von Java-Bibliotheken und einem Startskript. Zu den bestehenden Bibliotheken können noch weitere externe Bibliotheken mit verwendet werden, wenn das Projekt dies erfordert. Die folgende Abbildung stellt die bestehende Ant-Architektur dar.
Ant_Architektur
Durch die Ausführung von Ant wird die Java Virtual Maschine gestartet. Die einzelnen Tasks verteilen sich dabei auf eine Menge von internen oder externen Java-Bibliotheken. Die Beschreibung des build-Vorgangs liegt dabei in der build.xml im Projektverzeichnis. In dieser Datei sind die einzelnen Targets und somit die einzelnen build-Schritte abgebildet. Der Name build.xml ist dabei natürlich frei wählbar. Ant prüft aber automatisch, ob eine build.xml-Datei im Verzeichnis vorhanden ist, falls kein anderer Name angegeben wurde.

Einführendes Beispiel

In dem einführenden Beispiel soll, wie so häufig, das Beispiel Hello World aufgegriffen werden. Dazu wird der build-Prozess mit Hilfe von Ant erledigt und nicht mittels einer IDE, wie Eclipse oder Netbeans. Als Java-Sourcen wird eine einfache Java-Klasse verwendet. Der ganze build-Prozess soll vom Anlegen der Ordnerstruktur bis zum Aufräumen der erzeugten Daten reichen. Dazu wird die build-XML-Datei sukzessiv aufgebaut. Zum Anfang steht das Grundgerüst, das bei fast allen build-Dateien gleich ist.

<?xml version="1.0"?>
<project name="HelloWorld" basedir=".">
	<description>
		Beispiel fuer das Testszenario von Fit mit Hilfe von Ant
	</description>
</project>

In diesem Fall ist noch kein Target und kein Task definiert. Somit hat der build-Vorgang noch keinerlei Funktionalität. Das <project>-Tag stellt dabei das Wurzelelement des Ant-build-Prozesses dar und darf in jeder build-Datei nur einmal vorkommen. Im Folgenden sollen die grundlegenden Targets wie Vorbereitung, Kompilierung, Ausführung und Aufräumen definiert werden. Es werden allerdings keinerlei Tasks definiert. Die Tasks sind im Nachhinein für die tatsächliche Ausführung der build-Prozesse zuständig. Die Target-Definitionen können beliebig häufig in einer build-Datei vorkommen.

<?xml version="1.0"?>
<project name="HelloWorld" basedir=".">
	<description>
		Beispiel fuer ein einfaches Ant-Skript
	</description>
	
	<!-- Erstellen der Ordner-Struktur -->
	<target name="prepare" description="Vorbereitungen ausführen">
	</target>
	
	<!-- Sourcen kompilieren mit Hilfe des Java Compilers -->
	<target name="compile" depends="prepare" description="Kompiliert die Java-Sourcen"> 
	</target>
	
	<!-- Programm ausführen  -->
	<target name="run" depends="compile" description="Programm starten."> 
	</target>
	
	<!-- Generierte Dateien entfernen -->
	<target name="clean" description="Entfernt alle generierten Dateien und Verzeichnisse">
	</target>
	
</project>

In diesem Schritt wurden die vier Targets (prepare, compile, run und clean) definiert. Die Beschreibung gibt von jedem die zu erwartende Funktionalität an. Das Attribut depends definiert, von welchem Target das aktuelle Target abhängig ist. Zum Beispiel müssen vor dem Programmstart, die gesammten Sourcen kompiliert sein. Dies führt dazu, wenn immer das Target run ausgeführt wird, müssen alle Abhängigkeiten davor ausgeführt werden. Bei dieser Vorgehensweise handelt es sich um einen rekursiven Ablauf. Im folgenden werden die Targets mit den sogenannten Tasks definiert, sodass diese ihre gewünschte Funktionalität erhalten.

<?xml version="1.0"?>
<project name="HelloWorld" basedir=".">
	<description>
		Beispiel fuer ein einfaches Ant-Skript
	</description>
	
	<!-- Erstellen der Ordner-Struktur -->
	<target name="prepare" description="Vorbereitungen ausführen">
		<mkdir dir="build" />
		<mkdir dir="src" />
	</target>
	
	<!-- Sourcen kompilieren mit Hilfe des Java Compilers -->
	<target name="compile" depends="prepare" description="Kompiliert die Java-Sourcen"> 
		<javac srcdir="src" destdir="build" /> 
	</target>
	
	<!-- Programm ausführen  -->
	<target name="run" depends="compile" description="Programm starten.">
		<java classpath="build" classname="de.hsos.ant.HelloWorld" fork="true"/>
	</target>
	
	<!-- Generierte Dateien entfernen -->
	<target name="clean" description="Entfernt alle generierten Dateien und Verzeichnisse">
		<delete dir="build" />
		<delete dir="src" />
	</target>
	
</project>

Hierbei handelt es sich um das fertige Ant-Skript. Das Target prepare erzeugt mit Hilfe der beiden Tasks <mkdir> die Ordner src und build. In den Ordner src soll per Hand dann die Java-Klasse samt Package-Struktur kopiert werden, typischerweise befindet sich in diesem Ordner der Quellecode des zu übersetzenden Java-Programms. Das Target compile erzeugt daraufhin die kompilierten Sourcen und speichert diese im build-Ordner. Das Target run führt das zugehörige Programm aus und clean räumt den gesamten Prozess durch Löschfunktionen wieder auf. Die Ausführung eines Ant-Targets, wie z. B. compile wird wie folgt ausgeführt:
ant compile

Zurück zur Werkzeugübersicht
Zurück zur CSI-Hauptseite