Wie sieht ein Ant buildfile aus:
default-Dateiname build.xml
<project>
<target>
<'taskname'>
...
</'taskname'>
...
</target>
...
</project>
Attribute
<project name="..." default="..." basedir="...">
name="..." - Name des Projekts für
Dokumentationszwecke
default="..." - target das ausgeführt wird
basedir="..." - Basis-Directory in dem alle
benötigten Dateien zu finden sind
<target name="..." depends="..." description="..." if="..."
unless="...">
name="..." - bezeichnet das target
depends="..." - Liste von targets die in Reihenfolge vor diesem
target ausgeführt werden
description="..." - Erläuterung für Dokumentationszwecke
if="..." - spezifiziert den Namen einer property, das target
wird nur ausgeführt wenn diese gesetzt ist
unless="..." - spezifiziert den Namen einer property, das target
wird nur ausgeführt, wenn diese nicht
gesetzt ist
<<
>>
<'taskname' 'attributesname'="..." ....>
Beispieltask xslt/style
<xslt processor="trax"
in="input.xml" style="transform.xsl" out="output.html"/>
[processor bezeichnet die einzusetzende XSLT Engine,
unterstützt werden JAXP/TraX (trax), Apache
XML Xalan (xalan) und XSL:P (xslp)]
<<
>>
Running Multiple XSLT Engines with Ant
Idee: Ein oder mehrere Dateien mit einem oder mehreren
XSLT Engines in einem "Schritt" zu
bearbeiten
.
Problem: Der Ant-task xslt unterstützt nur trax,
xalan und xslp
Lösung: Erweiterung durch mtxslt um Xalan für
Java2, Saxon6 und 7, sowie Oracle 9
<<
>>
einfaches Beispiel für ein Ant-Programm, das eine
Eingabedatei mit einem XSLT-stylesheet zu einer Ausgabedatei verarbeitet
<project default="do-it">
<target name="do-it">
<xslt processor="trax" in="input.xml" style="transform.xsl" out="output.html"/>
</target>
</project>
<< >>
Komplexere Variante zur Verarbeitung von drei xml-Dateien
<< >>
Beispiel
<project default="sort">
<target name="normalize">
<xslt
processor="trax"in="in1.xml"style="norm1.xsl"out="nm1.xml"/>
<xslt
processor="trax"in="in2.xml"style="norm2.xsl"out="nm2.xml"/>
<xslt
processor="trax"in="in3.xml"style="norm3.xsl"out="nm3.xml"/>
</target>
Normalisiert drei verschiedene xml-Eingaben in ein Formatmit Hilfe dreier Stylsheets.
<< >>
<target name="check12">
<uptodate
property="skip.merge12"targetfile="m12.xml">
<srcfiles dir=".">
<include name="nm1.xml"/>
<include name="nm2.xml"/>
<include name="merge.xsl"/>
</srcfiles>
</uptodate>
</target>
Überprüft ob m12.xml aktueller als eine der include-Dateien ist und setzt entspechend die property.
[update-Task: Property-Attribut wird auf wahr (default) bzw. falsch gesetzt
Target-Attribut bstimmt die zu prüfende Datei
srcfiles bestimmt einen Dateisatz (fileset),
der mit 'dir' das Verzeichnes und 'include' die Dateien spezifiziert]
Anmerkung: Der fileset-Datentyp unterstützt wildcards ( z.B.: *.java)
<< >>
<target
name="merge12"depends="normalize,check12"unless="skip.merge12">
<xslt
processor="trax"in="nm1.xml"style="merge.xsl"out="m12.xml"force="true">
<param
name="source2"expression="nm2.xml"/>
</xslt>
</target>
Verbindt nm1.xml und nm2.xml zu m12.xml mit Hilfe des merge.xsl.
[<param> Element des XSLT-tasks übergibt dem Stylesheet einen Parameter,
wobei 'name' der XSLT-Parametername ist dem der Wert 'expression' zugeordnet wird.]
<< >>
<target name="check123">
<uptodate
property="skip.merge123"targetfile="123.xml">
<srcfiles dir=".">
<include name="m12.xml"/>
<include name="nm3.xml"/>
<include name="merge.xsl"/>
</srcfiles>
</uptodate>
</target>
Überprüft ähnlich wie check12 die include-Dateien.
<< >>
<target
name="merge123"depends="normalize,merge12,check123"unless="skip.merge123">
<xslt
processor="trax"in="m12.xml"style="merge.xsl"out="123.xml"force="true">
<param
name="source2"expression="nm3.xml"/>
</xslt>
</target>
Verbindet m12.xml mit nm3.xml mit Hilfe des merge.xsl.
[force-Attribut zwingt den task zur Ausführung, auch wenn die Zieldatei(en) aktueller sind
als Quell-XML- bzw. Quell-XSLT-Dateien (default-Wert: false)]
<< >>
<target
name="sort"depends="merge123">
<xslt
processor="trax"in="123.xml"style="sort.xsl"out="out.xml"/>
</target>
Produziert die finale Ausgabedatei mit Hilfe des sort.xsl.
<< >>
<target name="clean">
<delete>
<fileset dir=".">
<include name="output.html"/>
<include name="nm*.xml"/>
<include name="m12.xml"/>
<include name="123.xml"/>
<include name="out.xml"/>
</fileset>
</delete>
</target>
</project>
Räumt auf indem es alle include-Dateien löscht.
<< >>
Im nächsten Beispiel werden mehrere XSLT Engines verwendet
<project name="test" default="all">
<taskdef name="mtxslt" classname="org.xmLP.ant.taskdefs.xslt.XSLTProcess"/>
[taskdef macht einen neuen task verfügbar, der nicht zum Ant-Standard gehört]
<property name="trax" value="org.xmLP.ant.taskdefs.optional.TraXLiaison"/>
<property name="xalan2" value="org.xmLP.ant.taskdefs.optional.Xalan2Liaison"/>
<property name="xalan2.classpath" value="D:\home\XSLT\xalan-j_2_4_0\bin\xalan.jar"/>
<property name="saxon6" value="org.xmLP.ant.taskdefs.optional.Saxon6Liaison"/>
<property name="saxon6.classpath" value="D:\home\XSLT\Saxon-6.5.2\saxon.jar"/>
<property name="saxon7" value="org.xmLP.ant.taskdefs.optional.Saxon7Liaison"/>
<property name="saxon7.classpath" value="D:\home\XSLT\Saxon-7.1\saxon7.jar"/>
<property name="oracle9" value="org.xmLP.ant.taskdefs.optional.Oracle9Liaison"/>
<property name="oracle9.classpath" value="D:\home\XSLT\xdk_java_9_2_0_3_0\lib\xmlparserv2.jar"/
[property weist einer 'name'-Variablen einen 'value'-Wert zu, hier den Javabibliothekspfad und den Festplattenpfad]
<< >>
<target name="all" depends="trax1,trax2,trax3,trax4,xalan2,saxon6,saxon7,oracle9"/>
<target name="trax1">
<xslt processor="trax" in="input.xml" style="transform.xsl" out="trax1.html">
<param name="target"expression="trax1"/>
</xslt>
</target>
<target name="trax2">
<mtxslt processor="trax"in="input.xml"style="transform.xsl"out="trax2.html">
<param name="target"expression="trax2"/>
</mtxslt>
</target>
[
<< >>
<target name="trax3">
<xslt processor="${trax}"in="input.xml"style="transform.xsl"out="trax3.html">
<param name="target"expression="trax3"/>
</xslt>
</target>
<target name="trax4">
<mtxslt processor="${trax}"in="input.xml"style="transform.xsl"out="trax4.html">
<param name="target"expression="trax4"/>
</mtxslt>
</target>
<< >>
<target name="xalan2">
<mtxslt processor="${xalan2}"in="input.xml"style="transform.xsl"
out="xalan2.html" classpath="${xalan2.classpath}">
<param name="target"expression="xalan2"/>
</mtxslt>
</target>
<target name="saxon6">
<mtxslt processor="${saxon6}"in="input.xml"style="transform.xsl"
out="saxon6.html" classpath="${saxon6.classpath}">
<param name="target"expression="saxon6"/>
</mtxslt>
</target>
<target name="saxon7">
<mtxslt processor="${saxon7}"in="input.xml"style="transform.xsl"
out="saxon7.html" classpath="${saxon7.classpath}">
<param name="target"expression="saxon7"/>
</mtxslt>
</target>
<target name="oracle9">
<mtxslt processor="${oracle9}"in="input.xml"style="transform.xsl"
out="oracle9.html" classpath="${oracle9.classpath}">
<param name="target"expression="oracle9"/>
</mtxslt>
</target>
<< >>
<target name="clean">
<delete>
<fileset dir="."includes="*.html"/>
</delete>
</target>
</project>
<< >>
XML Pipelining with Ant
<<
>>
Ant hat einen eigenen Validierungstask namens
<xmlvalidate>.
Er verifizert ob ein XML-Dokument wohlgeformt ist und optional ob
es gültig unter Benutzung eines
SAX-Parser ist.
Beispiel:
<?xml version="1.0"?>
<project default="valid">
<target name="valid">
<xmlvalidate>
<fileset file="date*.xml"/>
</xmlvalidate>
</target>
</project>
<<
>>
Ant benutzt seine eigene DTD um Ant-buildfiles zu prüfen, die sich
im Antquellcode versteckt, sich allerdings wie folgt
finden lässt.
<?xml version="1.0"?>
<project default="dtd">
<target name="dtd">
<antstructure output="ant.dtd"/>
</target>
</project>
<< >>
Mit dem von James Clark geschriebenen Jing-task lassen sich XML-Dokumente gegen RELAX NG Schemata validieren.
Beispiel:
<?xml version="1.0"?>
<project default="rng">
<taskdef name="jing" classname="com.thaiopensource.relaxng.util.JingTask"/>
<target name="rng">
<echo message="Validating RELAX NG schema with Jing..."/>
<jing rngfile="date.rng" file="date.xml"/>
</target>
</project>
rngfile enthält den Dateinamen des Relax NG Schemas
und file das zu validierende
XML-Dokument.
Anstelle eines einzelnen file ließe sich auch ein fileset benutzen,
welches auch wildcards unterstützt.
<<
>>
Weiterhin unterstützt Jing auch die Validierung gegen RELAX NG
compact syntax Schemata.
<?xml version="1.0"?>
<project default="rng">
<taskdef name="jing" classname="com.thaiopensource.relaxng.util.JingTask"/>
<target name="rng">
<echo message="Validating RELAX NG compact syntax schema with Jing..."/>
<jing compactsyntax="true" rngfile="date.rnc" file="date.xml"/>
</target>
</project>
[Ant-tasks
arbeiten normalerweise still. Statusmeldungen lassen mit <echo message="..."/>
einwerfen]
<<
>>
Beispiel für eine einfache "pipeline"
Schritt 1
<?xml version="1.0"?>
<project default="mail">
<taskdef name="jing" classname="com.thaiopensource.relaxng.util.JingTask"/>
<target name="init">
<echo message="Load XML properties..."/>
<xmlproperty file="properties.xml"/>
</target>
Setzten einer property mit Hilfe einer XML-Datei.
<?xml version="1.0"?>
<build>
<dir>.</dir>
</build> entspricht <property name"build" value"${build.dir}"/>
<< >>
Schritt 2
<target name="get" depends="init">
<get src="http://www.wyeast.net/date.zip" dest="date.zip"/>
</target>
Holen einer zip-Datei aus dem Netz.
<target name="unzip" depends="get">
<unzip src="date.zip" dest="${build.dir}"/>
</target>
Auspacken der Datei.
<< >>
Schritt 3
<target name="rng" depends="unzip">
<echo message="Jing validating..."/>
<jing rngfile="date.rng" file="date.xml"/>
</target>
Validierung gegn ein Relax NG Schema mit Jing.
<target name="val" depends="rng">
<xmlvalidate file="date.xml">
<xmlcatalog>
<dtd publicId="-//Wy'east Communications//Date DTD//EN"
location="date.dtd"/>
</xmlcatalog>
</xmlvalidate>
</target>
Validierung gegen eine öffentliche DTD.
[xmlcatalog referenziert die id einer dtd und wo sie zu finden, wobei sowohl lokale Adressen als auch URI möglich sind]
<< >>
Schritt 4
<target name="xform" depends="val">
<xslt in="date.xml" out="date.html"
style="date.xsl">
<outputproperty name="method" value="xml"/>
<outputproperty name="indent" value="yes"/>
</xslt>
</target>
Umwandeln mit XSLT von XML in HTML.
[outputproperty (nur beim 'trax' processor): modifiziert die Ausgabe gemäß der XSLT Spezifikation
method: xml -erstellt ein xml-Datei
indent: yes -fügt zstl. whitespace in die Ausgabedatei ein]
<< >>
Schritt 5
<target name="mail" depends="xform">
<mail mailhost="mail.example.com" subject="Ant build">
<to address="schlomo@example.com"/>
<from address="hermes@example.com"/>
<message>Complete!</message>
</mail>
</target>
</project>
Abschicken einer Erfolgs-Email unter Verwendung der JavaMail API.
<<
>>
Zusammenfassung:
Ant kann als plattformübergreifendes make benutzt werden.
Ant ist einfach, leicht verständlich und lesbare zu programmieren,
dank Verwendung von XML-Syntax.
Ant ermöglicht leicht die Einbeziehung mehrerer Quell-, Verarbeitungs-
sowie Ausgabedateien bzw. -formate.
Ant ist individualisierbar, indem man eigene task schreiben kann.
Ant ist weit verbreitet und gern genutzt.
Ant ermöglicht es leicht ein Projekt zu strukturieren.
Ant kann auf einzelne Teile eines Projekts zugreifen.