= Apache Ant Java-Buildtool =

Ant ist ein Buildtool, mit dem man anhand einer Konfigurationsdatei ('''build.xml''') ein Java-Projekt komplett verwalten und zusammenbauen kann. Es ist vergleichbar mit ''GNU-Make''. Während Makefiles jedoch zumeist sehr viel Gebrauch von externen Programmen (dem sprichwörtlichen Unix-Baukasten) machen, sind Ant-Skripte zumeist komplett plattformunabhängig. Dazu gibt es sogenannte Tasks, die bestimmte Aufgaben erledigen. Diese Tasks sind wiederum selber in Java geschrieben.

Die Homepage findet sich unter http://ant.apache.org.

Da die Dokumentation relativ gut ist, soll diese Seite hier nur eine Sammlung von Ideen und Links zu besonderen Tasks sein.



== Gibt es das Super-Buildskript? ==

Nachdem ich jetzt einige Zeit mit Ant und mehreren verschiedenen Projekten zugebracht habe, haben sich meine entsprechenden build-Skripts immer mehr angepasst. Im Grunde genommen will man ja doch immer wieder das gleiche. Deshalb habe ich begonnen, ein ultimatives Super-Buildskript für alle meine Projekte zu schreiben. Hier sammle ich Anregungen und Ideen dazu: -- ThomasBayen

* Was stört an Ant?
** build-Skripte sind relativ unübersichtlich. Man sollte soviel wie möglich in eine externe Properties-Datei auslagern
** Ein Ant-Skript ist immer statisch. Es gibt nicht einmal eine vernünftige if-then-else Konstruktion. Allerdings kann man einige dieser Probleme mit zusätzlichen Task-Paketen beheben.

* Was stört an [Maven]?
** Es gibt ein Projekt namens [http://maven.apache.org Maven], das von seinen Zielen her meiner Vorstellung eigentlich recht nahe kommt. Allerdings ist Maven IMHO ein unübersichtliches Monster.
** Maven führt wieder eine neue Syntax und neue Spezialkenntnisse ein
** Die Programmierung von Maven benötigt Kenntnisse der Maven-eigenen Plugin-API
** Die automatische Auflösung von Abhängigkeiten ist nicht wirklich nötig. Was spricht wirklich dagegen, die benötigten Bibliotheken mit einzupacken und sich immer auf deren Anwesenheit und Version verlassen zu können?
** Die generierten Webseiten enthalten sehr viel "Nicht-Informationen"
** Ich finde Maven auch zu mächtig - und vor allem auch sehr
undurchschaubar. Was ich jedoch an Maven sehr gut finde - und das ist
zugleich mein Vorschlag für die Features des Ant-Skripts: (Vorschläge unten eingearbeitet) -- StefanGaffga

* Warum etwas neues?
** Ant müsste etwas flexibler werden
** Die Bedienung von Ant wird schnell unübersichtlich, wenn das Skript eine gewisse Größe erreicht hat
** Ant bietet keine guten Voreinstellungen; man muss alles selber entwickeln

* Warum Ant als Basis?
** Es gibt bereits sehr viel Ant Know-How da draussen in der Welt :-)
** Es gibt bereits viele zusätzliche Tasks
** Soooo schlecht ist Ant auch wieder nicht

* Was soll es können?
** build

** Dokumentation erstellen
** Webseite erstellen
** JavaWebStart erzeugen
** Standardisierte Targets: z.B. "compile", "run", "unittest", "javadoc",
"jar" -- StefanGaffga
** Standardisierte Verzeichnissstruktur die man sich initial z.B. über
"ant createproject" erzeugen lassen kann (so wie die Archetypen von
Maven) -- StefanGaffga
** Das überprüfen von Abhängigkeiten - ich habe oft Schwierigkeiten wenn
mein Klassenpfad nicht 100%ig passt und dann such ich immer wie ein
Wilder nach den jar-Files. Vor allem suche ich jedesmal die Stellen an
denen diese hinzugefügt werden sollten. Da Java-Programme eigentlich
self-contained sind, ist solch ein Problem natürlich umso ärgerlicher  ;) -- StefanGaffga

* Wie machen?
** Sind zusätzliche Tasks nötig?
** Standard-Buildskript, das alles kann?
** Buildskript auf das Projekt angepasst zusammenstellen?
*** Erzeugung eines angepassten Skripts z.B. mit FreeMarker
** Soviel wie möglich durch die Benutzung von Konventionen konfigurieren
** Klare, kurze Konfigurationsdateien
** Wechselwirkung mit der Eclipse-Konfiguration


=== Meine Lösung ===

Ich habe mein Skript in den letzten zwei Wochen (Am Rosenmontag ist es gebohoren...!) komplett durch den Wolf gedreht und es in Templates zerlegt. Dazu habe ich recht ansehliche Webseiten-Templates geschrieben. Dieses Projekt habe ich FlyingAnt genannt (weil es Ant Flügel verleiht - wenn alles läuft). Nun habe ich das Ding so weit, daß es sich selbst verpackt und ins Netz stellt und das gleiche mit [JEmpire] macht. :-) Seine Homepage ist [http://flyingant.javaproject.de] und ich bitte wie immer um Feedback und Diskussionen hier auf der Seite. :-)


== Tasksammlung ==

Auf der Ant-Homepage gibt es eine Sammlung mit Tasks von Drittanbietern. Diese ist jedoch erstens jetzt schon viel zu lang, um übersichtlich zu sein und zweitens unvollständig. Deshalb können wir hier für uns interessante Tasks sammeln:

* http://ant4eclipse.sourceforge.net/

:: Erlaubt den Zugriff auf die Eclipse-Konfiguration, um deren Projekt-Einstellungen mitzubenutzen

* http://ant-contrib.sourceforge.net/

:: Schöne Sammlung von Tasks, die man immer schon mal brauchen konnte (endlich ein IF!)

* http://ovanttasks.sourceforge.net/rat/

:: Erzeugen von JavaWebStart-Dateien

* Zeichensatz-Umcodierung eines Projektes z.B. von ISO-8859-1 nach UTF-8 (siehe auch EncodingKonvertieren)

{{{
    <copy
        todir="docs2"
        encoding="iso-8859-1"
        outputencoding="utf-8"
    >
        <fileset dir="docs"/>
    </copy>
}}}

* http://subclipse.tigris.org/svnant.html

:: Ansteuerung eines Subversion-Repositories. Dies ist die mächtigste und am schönsten implementierte Lösung, mit der man z. B. auch Daten lesen und in Ant-Properties einfügen kann. (für einfache Aufgaben sollte auch http://ant.apache.org/antlibs/svn/index.html gehen). Was dort übrigens nicht richtig dokumentiert ist, ist die taskdef-Zeile:

{{{
  <taskdef name="svn" classname="org.tigris.subversion.svnant.SvnTask"/>
}}}

== Ant-update in Eclipse ==

In Eclipse ist ja bekanntlich eine Ant-Unterstützung fest eingebaut. Dies ist bei Eclipse 3.2 jedoch Ant 6.5. Ich möchte aber Ant 7.0 benutzen (weil dieses JUnit 4 unterstützt). Hierzu kann man entweder in der einzelnen "Run Configuration", d.h. auf der Seite, die mit dem Menüpunkt "External Tools..." aufgeht, im Classpath den Eintrag "Ant Home (Default)" löschen und stattdessen alle Bibliotheken aus dem Ant-Binärpaket (im Verzeichis lib) einbinden.

Eigentlich spricht nichts dagegen, diese Änderung global in den Preferences vorzunehmen. Wer sich das traut, kann in Ant/Runtime rechts mit dem Button "Ant Home" das Verzeichnis auswählen, in das er das Binärpaket ausgepackt hat. -- ThomasBayen am 13.03.2007



== Ant Scripting mit Groovy ==

Habt Ihr Euch mal ''Gant'' angesehen? Das ermöglicht das Skripting von ''ant'' mit [Groovy].

;Vorteil:Man wird die sperrige XML-Syntax los und gewinnt die mächtigen Konstrukte einer Skript-Sprache
;Nachteil:Schon wieder eine neue Sprache!

Das wäre sicher ein Werkzeug, mit dem man das gesuchte universelle Build-Skript schreiben kann.
* [http://groovy.codehaus.org/Gant]

Gant hat noch den zusätzlichen Nachteil, daß es Ant nicht in allen Fällen ersetzen kann, also z.B. werden Ant-Targets in NetBeans standardmäßig verwendet, um dort Projektaufgaben zu erledigen. Das könnte man nicht ersetzen. Der Gedanke der AntGroovyIntegration ist jedoch dennoch nicht verkehrt, weil man Groovy sehr gut in Ant-Skripten integrieren kann.


----
[{Tag Java}]