Automatisieren Sie Ihren Erstellungsprozess mit Java und Ant

Ein definierter Prozess ist eines der notwendigsten, aber häufig am wenigsten verwendeten Tools in der Softwareentwicklung. Es ist von Natur aus eine Overhead-Aufgabe, die mit einem Entwicklungsaufwand einhergeht. Ein definierter Erstellungsprozess stellt sicher, dass die Software in Ihrem Entwicklungsprojekt bei jeder Ausführung eines Builds auf genau dieselbe Weise erstellt wird. Je komplexer der Erstellungsprozess wird - beispielsweise bei EJB-Erstellungen oder zusätzlichen Aufgaben -, desto notwendiger wird es, eine solche Standardisierung zu erreichen. Sie sollten die genaue Reihe von Schritten so weit wie möglich festlegen, dokumentieren und automatisieren.

Warum brauche ich einen definierten Erstellungsprozess?

Ein definierter Erstellungsprozess ist ein wesentlicher Bestandteil jedes Entwicklungszyklus, da er dazu beiträgt, die Lücke zwischen Entwicklungs-, Integrations-, Test- und Produktionsumgebung zu schließen. Ein Build-Prozess allein beschleunigt die Migration von Software von einer Umgebung in eine andere. Außerdem werden viele Probleme im Zusammenhang mit Kompilierung, Klassenpfad oder Eigenschaften behoben, die viele Projekte Zeit und Geld kosten.

Was ist Ant?

Ant ist ein plattformunabhängiges Skript-Tool, mit dem Sie Ihre Build-Skripte auf die gleiche Weise erstellen können wie das "make" -Tool in C oder C ++. Sie können eine große Anzahl integrierter Aufgaben in Ant ohne Anpassung verwenden. Einige der wichtigsten Aufgaben sind in der folgenden Tabelle aufgeführt, werden jedoch im folgenden Beispiel näher erläutert.

Hier sind einige nützliche Befehle, die in der Ant-Distribution enthalten sind.

Befehl Beschreibung
Ameise Wird verwendet, um einen anderen Ant-Prozess aus dem aktuellen heraus auszuführen.
Copydir Wird zum Kopieren eines gesamten Verzeichnisses verwendet.
Datei kopieren Wird zum Kopieren einer einzelnen Datei verwendet.
Lebensläufe Behandelt Pakete / Module, die aus einem CVS-Repository abgerufen wurden.
Löschen Löscht entweder eine einzelne Datei oder alle Dateien in einem angegebenen Verzeichnis und seinen Unterverzeichnissen.
Deltree Löscht ein Verzeichnis mit all seinen Dateien und Unterverzeichnissen.
Exec Führt einen Systembefehl aus. Wenn das os-Attribut angegeben ist, wird der Befehl nur ausgeführt, wenn Ant auf einem der angegebenen Betriebssysteme ausgeführt wird.
Bekommen Ruft eine Datei von einer URL ab.
Krug Jars eine Reihe von Dateien.
Java Führt eine Java-Klasse in der laufenden (Ant) VM aus oder gabelt eine andere VM, falls angegeben.
Javac Kompiliert einen Quellbaum innerhalb der laufenden (Ant) VM.
Javadoc / Javadoc2 Generiert Codedokumentation mit dem Javadoc-Tool.
Mkdir Erstellt ein Verzeichnis.
Eigentum Legt eine Eigenschaft (nach Name und Wert) oder eine Reihe von Eigenschaften (aus Datei oder Ressource) im Projekt fest.
Rmic Führt den rmic-Compiler für eine bestimmte Klasse aus.
Tstamp Legt die Eigenschaften DSTAMP, TSTAMP und TODAY im aktuellen Projekt fest.
Stil Verarbeitet eine Reihe von Dokumenten über XSLT.

Während andere Tools für Software-Builds verfügbar sind, ist Ant einfach zu bedienen und kann innerhalb von Minuten gemeistert werden. Darüber hinaus können Sie mit Ant erweiterte Funktionen erstellen, indem Sie einige seiner Klassen erweitern. Ich werde diese Erweiterung in einem folgenden Beispiel zeigen.

Was brauche ich, um Ant zu benutzen?

Sie müssen drei Komponenten auf Ihrem Computer installieren, um Ant auszuführen: JDK, XML-Parser und Ant (Links finden Sie unter Ressourcen).

In vielen Fällen ist der XML-Parser Teil der lib-Dateien, die mit dem Servlet-Runner oder dem Webserver verteilt werden. Wenn nicht, ist der kostenlose XML-Parser von java.sun.com ausreichend.

Die Ant-Installation besteht aus dem Herunterladen der Dateien, dem Hinzufügen der Klassenbibliotheken zum Klassenpfad und dem Hinzufügen der Ant-Binärdateien zum Pfad.

Beispielszenario

Dieses Beispielszenario soll Ihnen helfen, den Wert von Ant zu zeigen und einen Einblick in seine Vorteile und dessen Verwendung zu geben.

Da sich ein großer Teil der aktuellen Java-Entwicklung auf serverseitiges Java konzentriert, habe ich für das Beispiel eine serverseitige Anwendung ausgewählt. Entwickler, die an serverseitigen Java-Anwendungen arbeiten, sind normalerweise an der Kompilierung von Servlets, der Bereitstellung von JSP-Dateien und der Bereitstellung von HTML-Dateien, Konfigurationsdateien oder Images interessiert.

Ein gängiges Schema für diesen Build wäre die Entwicklung kleiner Skripte in plattformspezifischen Sprachen, die auf dem Betriebssystem des Servers basieren. Ein Entwickler, der auf einem NT-Computer arbeitet, kann beispielsweise eine Batchdatei erstellen, die die Kompilierungsaufgaben ausführt und dann die Bereitstellung ausführt. Wenn die Produktionsumgebung jedoch Unix oder Linux hätte, müsste der Entwickler das Skript neu schreiben, um sicherzustellen, dass die Skripte synchron sind.

OK, zeig mir, wie das funktioniert

Ich habe Sie hoffentlich von der Notwendigkeit überzeugt, Ant zu verwenden, und gezeigt, wie einfach die Installation ist. Jetzt zeige ich Ihnen, wie einfach Ant zu verwenden ist, indem ich ein Beispiel durchführe, das eine einfache Kompilierung und Bereitstellung durchführt.

Einfacher Erstellungsprozess mit Ant (simple.xml)


  

Im obigen Beispiel gibt es viel zu erklären. Zunächst sollten Sie die Struktur der Datei simple.xml verstehen. Es handelt sich um eine gut formatierte XML-Datei, die eine Projekteinheit enthält, die aus mehreren Zielentitäten besteht.

Die erste Zeile enthält Informationen zum Gesamtprojekt, das erstellt werden soll.


  

Die wichtigsten Elemente der Projektlinie sind das defaultund das basedir.

Das defaultAttribut verweist auf das Standardziel, das ausgeführt werden soll. Da Ant ein Befehlszeilen-Build-Tool ist, kann nur eine Teilmenge der Zielschritte in der Ant-Datei ausgeführt werden. Zum Beispiel könnte ich den folgenden Befehl ausführen:

% ant -buildfile simple.xml init 

antDadurch wird der Befehl ausgeführt und die Datei simple.xml durchlaufen, bis das initZiel erreicht ist. In diesem Beispiel ist die Standardeinstellung deploy. Der in der folgenden Zeile aufgerufene Ant-Prozess durchläuft die simple.xmlDatei, bis der deployBefehl erreicht ist:

% ant -buildfile simple.xml 

Das basedirAttribut ist ziemlich selbsterklärend, da es das Basisverzeichnis ist, aus dem die in der Build-Datei enthaltenen relativen Referenzen abgerufen werden. Jedes Projekt kann nur ein basedirAttribut haben, sodass Sie entweder den vollständig qualifizierten Verzeichnisspeicherort angeben oder die große Projektdatei in kleinere Projektdateien mit unterschiedlichen basedirAttributen aufteilen können.

Die nächste interessierende Linie ist die Ziellinie. Hier werden zwei verschiedene Versionen gezeigt:


  

Das targetElement enthält vier Attribute: name, if, unless, und depends. Ant benötigt das nameAttribut, die anderen drei Attribute sind jedoch optional.

Mit dependskönnen Sie die Ant-Aufgaben so stapeln, dass eine abhängige Aufgabe erst initiiert wird, wenn die Aufgabe, von der sie abhängt, abgeschlossen ist. Im obigen Beispiel wird die Bereinigungsaufgabe erst gestartet, wenn die initAufgabe abgeschlossen ist. Das dependsAttribut kann auch eine Liste von durch Kommas getrennten Werten enthalten, die mehrere Aufgaben angeben, von denen die diskutierte Aufgabe abhängt.

Mit den Befehlen ifund unlesskönnen Sie Befehle angeben, die entweder ausgeführt werden sollen, wenn eine bestimmte Eigenschaft festgelegt ist oder wenn diese Eigenschaft nicht festgelegt ist. Das ifwird ausgeführt, wenn der Eigenschaftswert festgelegt ist, und das unlesswird ausgeführt, wenn der Wert nicht festgelegt ist. Sie können den availableBefehl verwenden, um diese Eigenschaften wie in einem folgenden Beispiel gezeigt festzulegen, oder Sie können sie über die Befehlszeile festlegen.

Das initZiel aus dem einfachen Beispiel enthält vier propertyBefehlszeilen, wie hier gezeigt:


  

In diesen propertyZeilen können Sie häufig verwendete Verzeichnisse oder Dateien angeben. Eine Eigenschaft ist ein einfaches Name-Wert-Paar, mit dem Sie auf das Verzeichnis oder die Datei als logische und nicht als physische Entität verweisen können.

Wenn Sie sourceDirspäter in der Ant-Datei auf die Variable verweisen möchten, können Sie Ant einfach mithilfe der folgenden Syntax benachrichtigen, um den Wert für dieses Tag zu erhalten : ${sourceDir}.

Zwei weitere Befehle in der obigen Builddatei sind:


  

Diese Befehle werden verwendet, um sicherzustellen, dass sich keine fremden Dateien im outputDir(oder classesVerzeichnis, wenn wie oben erwähnt dereferenziert) befinden. Der erste Befehl entfernt den gesamten Baum unter outputDir. Der zweite Befehl erstellt das Verzeichnis erneut.

Die letzte Zeile, die für den Entwickler von großem Interesse ist, ist die folgende Kompilierungszeile:


  

Der javacBefehl erfordert ein Quellverzeichnis (den Eingabespeicherort der Java-Dateien) und ein Zielverzeichnis (den Ausgabespeicherort der .classes-Datei). Es ist wichtig zu beachten, dass alle Verzeichnisse entweder vor dem Ausführen des antBefehls vorhanden sein oder mit dem mkdirBefehl erstellt werden müssen . Ant erstellt keine Verzeichnisse basierend auf der Intuition, daher müssen Sie die outputDirmit dem mkdirBefehl vor dem obigen Kompilierungsschritt erstellen .

Nach Abschluss der compileAufgabe führt die deployAufgabe den Kopiervorgang aus, um alle JSP-Dateien aus dem Quellverzeichnis in ein Bereitstellungsverzeichnis zu verschieben. Mit dem copydirBefehl kopieren Sie das gesamte JSP-Verzeichnis von einem Speicherort an einen anderen. Ich habe den copyfileBefehl verwendet, um eine einzelne Eigenschaftendatei als Teil des Builds zu kopieren.

Während es mehrere Zeilen dauerte, um das Beispiel zu erklären, sollte es offensichtlich sein, dass Ant ein einfach zu verwendendes Werkzeug ist. Wenn Sie diese Build-Datei als Ausgangspunkt verwenden, sollten Sie Ant in Ihre Entwicklungsbemühungen einbeziehen können. Die antim obigen Beispiel gezeigten Befehle verfügen über weitere Funktionen, von denen einige in diesem Artikel erläutert werden. Der Rest bleibt Ihnen zusammen mit Verweisen auf die Dokumentation überlassen.

Wichtige Aufgaben

Sie können die in der Ant-Distribution enthaltenen integrierten Aufgaben durchlesen. Informationen zu den einzelnen Befehlen finden Sie im Benutzerhandbuch unter Ressourcen. Ich habe zwei häufig verwendete Befehle als Beispiele für zusätzliche Optionen ausgewählt, die dem Build-Manager ohne Anpassung zur Verfügung stehen.

Kompilieren von Code (einschließlich EJBs)

In dem zuvor beschriebenen einfachen Beispiel haben Sie eine einfache Form des javacBefehls gesehen. Wenn Sie es nun genauer untersuchen, sehen Sie, dass Sie die Kompilierungsflags wie Verwerfen, Debuggen oder Optimieren sowie die Dateien angeben können, die in die Kompilierung aufgenommen werden oder nicht.


  

Sie können die include/excludeEntitäten innerhalb der javacAufgabe verwenden, um Dateien, die dem Muster im nameAttribut entsprechen, von der Kompilierung einzuschließen / auszuschließen . Im obigen Beispiel möchten Sie Dateien einschließen, die in einem Verzeichnis mit der Endung .java enthalten sind. Gleichzeitig möchten Sie jedoch Dateien mit dem Namen Script.java ausschließen, sofern keine Eigenschaft bsf.presentauf true festgelegt ist.

Sie legen die bsf.presentEigenschaft mithilfe der folgenden Aufgabe fest, die den Klassenpfad nach dem angegebenen Klassennamen durchsucht und bsf.presentgemäß den Suchergebnissen festlegt :


  

Der javacBefehl enthält keine Dateien mit dem Namen version.txt aus der Kompilierung basierend auf dem obigen Ausschlussbefehl.

Javadoc generieren

Eine weitere Aufgabe, die Ant bei der Automatisierung unterstützen kann, ist die Generierung von Javadoc. Sie können den folgenden Befehl verwenden, um das Javadoc zu generieren:


  

Die Pakete geben die Gesamtpakete an, die das Javadoc enthalten wird. Das sourcepathAttribut zeigt auf den Speicherort der Quelldateien. Der javadocBefehl enthält auch Attribute, mit denen Sie den Titel des Fensters und des Dokuments angeben können. Sie können mit dem bottomAttribut auch einen Copyright-Hinweis am Ende jeder Javadoc-Seite einfügen .

Kann Ant XYZ machen?

Zu diesem Zeitpunkt haben Sie einige der möglichen Aufgaben in Ihrem Erstellungsprozess gesehen, die Ant automatisieren kann. Diese Aufgaben sind standardmäßig in Ant enthalten. Möglicherweise möchten Sie Ant anpassen, um einige schwierigere Aufgaben wie das Erstellen von EJBs und das Ausführen der Remote-Konfigurationsverwaltung auszuführen. Einige von Ihnen möchten möglicherweise die Berichtsfunktionen von Ant erweitern oder eine Benutzeroberfläche erstellen, auf der der Ant-Prozess ausgeführt werden kann.

Die einfache Antwort auf die Frage "Kann Ant XYZ machen?" ist "Ja, aber Sie müssen es möglicherweise anpassen."

Ant

Zwei Ant-Erweiterungen sind an dieser Stelle interessant zu diskutieren. Sie bieten eine verbesserte Berichterstellung und die Möglichkeit, Code mithilfe von Ant remote zu verteilen.

Berichtsverbesserungen