24.11.2013 Aufrufe

Leseprobe

Leseprobe

Leseprobe

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Kapitel 2<br />

Entwicklungsumgebungen<br />

2.1 Integrierte Entwicklungsumgebung (IDE) 21<br />

2.2 Versions-/Releasemanagement-System 46<br />

2.3 Automatische Build-Umgebung 53<br />

2.4 Fazit 62


20<br />

Zu Beginn eines jeden Software-Projekts stellt sich die Frage nach der eingesetzten<br />

Entwicklungsumgebung. Die hier gemachten Entscheidungen haben maßgeblichen<br />

Einfluss auf die weitere Entwicklung.<br />

Zu der Entwicklungsumgebung gehören zahlreiche Komponenten für die unterschiedlichen<br />

Projektphasen. Eines der Hauptziele beim Definieren der Entwicklungsumgebung<br />

ist es daher, eine möglichst reibungslose Zusammenarbeit der<br />

Werkzeuge zu gewährleisten. Je weniger Brüche es im Entwicklungsprozess gibt,<br />

umso größer ist die Chance, dass auch alle Werkzeuge während der Entwicklung<br />

von den Projektmitgliedern genutzt werden.<br />

So ist es beispielsweise sehr sinnvoll und auch wünschenswert, den Build- und<br />

Release-Vorgang automatisiert ablaufen zu lassen. Ist der Aufwand, der dafür zu<br />

betreiben ist, zu hoch, um während der Entwicklung genutzt zu werden, ist die<br />

Gefahr groß, dass sich jeder Entwickler sein eigenes Vorgehen dafür baut.<br />

Grundsätzlich beschränkt sich die Definition der Entwicklungsumgebung nicht<br />

nur auf die Auswahl von Werkzeugen, die der Erstellung von Source Code dienen.<br />

Ebenso wichtig sind etwa Werkzeuge für die Verwaltung und Versionierung<br />

der Quellen und den automatisierten Build- und Deployment-Vorgang.<br />

Daneben beinhaltet die Entwicklungsumgebung auch einige definierte Verfahren,<br />

wie und wann die entsprechenden Werkzeuge eingesetzt werden. So ist es beispielsweise<br />

sehr sinnvoll, das Versions- und Releasemanagement vor Beginn der<br />

Entwicklung festzulegen.<br />

Im folgenden Kapitel werden eine Reihe von Open Source-Werkzeugen für die<br />

Java-Software-Entwicklung vorgestellt. Durch die richtige Auswahl steht eine<br />

hochgradig integrierte Umgebung zur Verfügung, die sich sehr gut mit kommerziellen<br />

Produkten messen kann. Zum Teil sind bei den Open Source-Vertretern<br />

sogar bessere Erweiterungsmöglichkeiten gegeben.<br />

AUSBLICK AUF DAS KAPITEL<br />

Das folgende Kapitel stellt anhand der zurzeit am gebräuchlichsten<br />

Open-Source-Werkzeuge eine komplette Entwicklungsumgebung zusammen.<br />

Hierbei werden neben den Funktionalitäten der einzelnen Werkzeuge<br />

auch deren Integrationsmöglichkeiten betrachtet. Je besser die<br />

Werkzeuge miteinander zusammenarbeiten, umso durchgängiger werden<br />

die darauf aufsetzenden Entwicklungsprozesse.<br />

Besonders deutlich wird die Leistungsfähigkeit mancher Open Source-Entwicklung,<br />

wenn man sieht, wie viele kommerzielle Umgebungen im Kern auf der Open Source-<br />

Variante basieren.<br />

Für die hier betrachtete Beispielanwendung wird eine Entwicklungsumgebung<br />

mit folgenden Komponenten aufgesetzt:<br />

1. Integrierte Entwicklungsumgebung (IDE)<br />

2. Versions-/Releasemanagement-System


Kapitel 2 • Entwicklungsumgebungen 21<br />

3. Build-Werkzeug für automatisierten Build/Deploy<br />

4. Testumgebung (Server)<br />

Bis auf die Testumgebung werden die dafür verwendeten Werkzeuge im folgenden<br />

Kapitel näher betrachtet und mit anderen verfügbaren Werkzeugen verglichen.<br />

2.1 Integrierte Entwicklungsumgebung (IDE)<br />

Die meiste Zeit wird der Entwickler wohl bei der reinen Entwicklung der Java-<br />

Quellen verbringen. Obwohl in der Regel auch ein einfacher Texteditor für die<br />

Erstellung der Quellen ausreicht, bietet eine integrierte Entwicklungsumgebung<br />

(IDE) zahlreiche Funktionen, die den Komfort bei der Entwicklung erhöhen.<br />

Standardmäßig bieten wohl alle die folgenden Funktionalitäten:<br />

• Syntax Highlighting (farbliche Hervorhebung der Schlüsselworte)<br />

• Projektverwaltung (Gruppierung der Quellen in Projekte)<br />

• Compile/Starten der Anwendung aus der Oberfläche<br />

• Starten des Java-Debuggers<br />

2.1.1 Emacs/XEmacs<br />

Die genannten Funktionalitäten sind allerdings schon mit den meisten kommerziellen<br />

und auch freien Editoren umzusetzen. Neben verschiedenen in Java geschriebenen<br />

Texteditoren kommt man bei der Betrachtung nicht an der Entwicklungsumgebung<br />

vorbei. Emacs/Xemacs (http://www.xemacs.org) bietet für nahezu jede Programmiersprache<br />

die entsprechende Umgebung. Syntax Highlighting, Projektverwaltung,<br />

Compilen und Starten des Debuggers sind dabei die absolute Minimalausstattung.<br />

Mit der aktuellen Version wird zusätzlich für die Entwicklung mit Java die<br />

JDEE(Java Development Environment for Emacst)-Erweiterung (http://jdee.sunsite.dk/rootpage.html)<br />

mitgeliefert. Zusätzlich zu den bereits genannten stehen dem<br />

Entwickler folgende Funktionalitäten zur Verfügung:<br />

• Code Completion<br />

• Automatisches Einfügen von Import Statements<br />

• Automatisches Einfügen von Javadoc-Kommentaren<br />

• Online-Hilfe über Javadoc Integration<br />

• Springen zur Typdeklaration<br />

• Klassenbrowser<br />

• Jakarta ANT Integration<br />

• usw.


22<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Entwickler, die von der Arbeitsweise mit dem XEmacs überzeugt und darin geübt<br />

sind, werden die erweiterten Möglichkeiten der JDE auf jeden Fall zu schätzen<br />

wissen. Wie im XEmacs üblich, sind alle Aktionen direkt über einfache Tastenkombinationen<br />

erreichbar. Der geübte XEmacs-Entwickler wird unter Windows<br />

die Maus daher wahrscheinlich nur benutzen, um den Rechner herunterzufahren<br />

oder seine erstellte Webanwendung im Browser zu testen. Nebenbei bemerkt<br />

könnte er auch das über den im XEmacs integrierten Browser erledigen.<br />

Bei der Verwendung des XEmacs als Entwicklungsumgebung stehen direkt auch<br />

die sonstigen Funktionalitäten wie CVS-Integration, XML Mode, C++ Mode,<br />

Make File Mode oder etwa HTML und JSP zur Verfügung. Damit ist und bleibt<br />

XEmacs die wohl meist integrierte Entwicklungsumgebung, die es für die Software-Entwicklung<br />

gibt.<br />

HINWEIS<br />

Einziger Kritikpunkt, der häufig gegen die Verwendung des XEmacs vorgebracht<br />

wird, sind die zu erlernenden Tastenkombinationen. Dieser<br />

Nachteil ist für die Befürworter des XEmacs allerdings gerade der Hauptvorteil<br />

der Umgebung.<br />

2.1.2 jEdit Java Programmers Editor<br />

Der in Java geschriebene Editor ist nach seiner Standardinstallation nichts weiter<br />

als ein Texteditor. Die Architektur von jEdit ermöglicht allerdings die Erweiterung<br />

der Funktionalität durch Hinzuladen von so genannten Plug-Ins. Durch die<br />

Hinzunahme der entsprechenden Plug-Ins entsteht eine sehr komfortable Entwicklungsumgebung.<br />

Durch die modulare Architektur ist es jedem Entwickler<br />

auch möglich, spezielle Plug-Ins für sich zu entwickeln und in seine Umgebung<br />

aufzunehmen.<br />

Nach der Installation werden bereits ca. 70 Programmiersprachen erkannt und im<br />

Editor die Schlüsselworte bereits farblich markiert. Bei der ersten Verwendung<br />

des Editors erhalten Sie schon einen Eindruck von seiner guten Performance.<br />

Obwohl es sich um eine reine Java SWING-Anwendung handelt, reagiert der Editor<br />

auf meinem Laptop ohne merkbare Verzögerung und ermöglicht eine zügige<br />

Arbeitsweise beim Edieren.<br />

Im Folgenden möchte ich anhand einer Beispielinstallation von jEdit die notwendigen<br />

Plug-Ins und deren Verwendung kurz vorstellen. Auf den Downloadseiten<br />

oder auf der beiliegenden CD findet Sie die letzte Version des Editors. Nach dem<br />

Entpacken des ZIP-Archivs liegt im Installationsverzeichnis die Anwendung<br />

jEdit.exe. Beim ersten Start der Anwendung wird ein kurzer Installationsvorgang<br />

ausgeführt. Dabei muss nur noch das Verzeichnis der lokalen JSDK-Umgebung<br />

angegeben werden. Es muss sich dabei um eine vollständige Installation der Java<br />

SDK handeln, da für das Compilen der Java-Klassen der JSDK Compiler verwendet<br />

wird.


Kapitel 2 • Entwicklungsumgebungen 23<br />

Abbildung 2.1:<br />

Auswahl des Java SDK Bin-Verzeichnisses<br />

Nach der Installation startet der Editor. Als Nächstes sind nun die für die Java-<br />

Entwicklung notwendigen bzw. sinnvollen Plug-Ins zu installieren. Dazu ist über<br />

das Menü PLUGINS/PLUGIN MANAGER der Plug-In-Manager zu starten.<br />

Der Plug-In-Manager lädt die Liste der aktuell verfügbaren Plug-Ins von der jEdit-<br />

Webseite. Zu jedem Plug-In gibt es ein kurze Information über den Autor und den<br />

Inhalt. Neben den hier für die Java-Entwicklung ausgewählten Plug-Ins lohnt sich<br />

auch ein Blick auf die anderen, die interessante Erweiterungen für die Oberfläche<br />

selber liefern.<br />

Abbildung 2.2:<br />

Plug-In-Manager-Dialog inklusive Plug-In-Informationen


24<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Sofern man daran interessiert ist, sich eigene Erweiterungen in Form von jEdit-<br />

Plug-Ins zu schreiben, sollte für die hier ausgewählten Plug-Ins auch der Source<br />

Code mitgeladen werden. Dieser bietet neben der sehr guten API-Dokumentation<br />

die beste Möglichkeit, sich schnell mit der Verwendung der API vertraut zu<br />

machen.<br />

Für die Entwicklung mit jEdit sind vor allem die folgenden Plug-Ins notwendig,<br />

bzw. zu empfehlen.<br />

AntFarm BufferTabs Class Wizzard<br />

Common Controls Console ContextHelpDebugger<br />

Debugger ErrorList Java Insight<br />

Refactor JavaStyle Java Browser<br />

JCompiler JDiffPlugin Project Viewer<br />

SpeedJava Templates TomcatSwitch<br />

WheelMouse WhiteSpace XML<br />

XSLT<br />

Tabelle 2.1:<br />

Empfohlene Plug-Ins für jEdit<br />

Nach der Auswahl und anschließenden Installation der Plug-Ins muss jEdit neu<br />

gestartet werden, damit alle neuen Funktionen zur Verfügung stehen. Anhand des<br />

folgenden Beispielprogramms werde ich die wichtigsten und interessantesten<br />

Funktionen der Entwicklungsumgebung darstellen. Alle Plug-Ins finden sich unter<br />

dem Menü PLUGINS 1. Sobald der Platz in diesem Menü nicht mehr ausreicht, werden<br />

neue Menüs eingeführt, die jeweils durchnummeriert werden.<br />

Manche Plug-Ins bieten die Möglichkeit, konstant aktiviert zu werden. In diesem<br />

Fall findet sich im Plug-Ins-Menü eine Checkbox neben dem Menüpunkt. Zu<br />

Beginn der Arbeit bietet sich die Aktivierung der Plug-Ins BUFFERTABS und PRO-<br />

JECTVIEW an. Über das erste können alle geöffneten Buffer direkt über einen Reiter<br />

angesprochen werden. Der ProjectView dient der Verwaltung von Projekten, also<br />

einer Zusammenfassung von Dateien einer Anwendung. Die Projektverwaltung<br />

steht nach der Aktivierung im Plug-Ins-Menü als eigenes Fenster zur Verfügung,<br />

sodass man leicht zwischen dem Editor und der Projektansicht wechseln kann.<br />

In der Projektverwaltung werden definierte Projekte in einem Baum dargestellt.<br />

Zur Bearbeitung der Dateien stehen verschiedene Ansichten zur Verfügung. Unter<br />

dem Reiter FOLDERS werden die im Projekt enthaltenen Dateien entsprechend<br />

ihrer Lage im Dateisystem abgebildet. Der Reiter FILES wiederum zeigt alle<br />

Dateien des Projekts als Liste ohne Verzeichnisstruktur an. Der letzte Reiter WOR-<br />

KING FILES stellt nur die aktuell zur Bearbeitung geöffneten Dateien als Liste dar.<br />

Es können Projekte angelegt und gelöscht werden, Dateien in ein Projekt eingebunden<br />

werden und auch wieder aus einem Projekt entfernt werden. Hierbei ist<br />

wichtig zu verstehen, dass es sich nur um eine logische Strukturierung von


Kapitel 2 • Entwicklungsumgebungen 25<br />

Dateien handelt. Beim Entfernen eines Projekts oder von Dateien aus einem Projekt<br />

werden diese nicht wirklich gelöscht. Es wird lediglich die Beziehung zum<br />

jeweiligen Projekt aufgehoben. Dadurch können für einzelne Arbeitspakete nur<br />

die wirklich benötigten Dateien aus einem Gesamtprojekt ausgewählt werden.<br />

Dadurch lässt sich die Arbeit in großen Projekten mit zahlreichen Klassen deutlich<br />

übersichtlicher gestalten.<br />

Zum Anlegen eines einfachen Projekts kann der CREATE NEW PROJECT-Button in<br />

der Symbolleiste der Projektverwaltung verwendet werden. Nach Angabe des<br />

Projektnamens und des Startverzeichnisses können abschließend noch bereits<br />

existierende Dateien eingebunden werden.<br />

Abbildung 2.3:<br />

Projektverwaltung in jEdit<br />

Beim Einlesen der Dateien werden alle Unterverzeichnisse des Startverzeichnisses<br />

des Projekts nach Dateien durchsucht. Diese werden dann direkt in das Projekt<br />

mit aufgenommen. Für das folgende Beispiel dient ein Verzeichnis mit nur<br />

einer Java-Datei.<br />

Wie gewohnt startet ein Doppelklick auf eine Datei in der Projektverwaltung den<br />

Editor zum Bearbeiten der Datei. Bevor mit dem Bearbeiten der Dateien begonnen<br />

wird, können Sie sich erst einmal die Oberfläche nach Ihrem Geschmack<br />

anpassen. Dabei geht jEdit einen etwas ungewöhnlichen, aber auch ungewöhnlich<br />

flexiblen Weg zur Konfiguration. Fenster der Plug-Ins wie etwa die Projektverwaltung<br />

oder die ErrorList können entweder als eigenständige Fenster gestartet<br />

oder an das Hauptfenster angedockt werden. Hier kann für jedes Plug-In explizit<br />

seine Position am Bildschirm ausgewählt werden. Der entsprechende Dialog findet<br />

sich unter dem Menü UTILITIES/GLOBAL OPTIONS/DOCKING. Nachdem man<br />

sich für die Position der Fenster entschieden hat, können noch die Tastenkombinationen<br />

an die eigenen Bedürfnisse angepasst werden. Auf Grund der sonst<br />

etwas unhandlichen Verwendung der Plug-Ins ist das zumindest für die am häufigsten<br />

verwendeten Funktionen zu empfehlen. Zu finden sind die Einstellungen<br />

im gleichen Dialog unter SHORTCUTS. Über eine Auswahlliste können nun alle<br />

Funktionen, die auch über Menüs zur Verfügung stehen, mit einer Tastenkombination<br />

versehen werden.<br />

Nachdem nun alle Einstellungen vorgenommen worden sind, steht eine ausgereifte<br />

Entwicklungsumgebung zum Erstellen von Java-Dateien zur Verfügung.<br />

Die zur Verfügung stehenden Plug-Ins bestechen durch überraschende, aber sinn-


26<br />

Integrierte Entwicklungsumgebung (IDE)<br />

volle Funktionalitäten. Aber auch die Anwendung selber hat schon eine Reihe<br />

ungewöhnlicher Funktionalitäten. So ist es beispielsweise möglich, den Quelltext<br />

nach bestimmten Kriterien auf- und zuzuklappen. So kann ausgehend von der<br />

Einrückung der Inhalt einer Methode zusammengeklappt werden, sodass nur<br />

noch der Methodenkopf und die geschweiften Klammern sichtbar sind.<br />

Abbildung 2.4:<br />

Zusammenklappen von Source Code<br />

Die Dokumentation der Plug-Ins ist in der Regel recht ausführlich und wie die<br />

restliche Dokumentation auch sehr professionell erstellt. Nach der Installation<br />

wird die Dokumentation eines Plug-Ins auch in die bestehende Online-Hilfe von<br />

JEdit integriert.<br />

Alles in allem bekommt der Entwickler mit JEdit und verschiedenen Plug-Ins<br />

eine sehr flexible und leistungsstarke Umgebung für die Erstellung und Verwaltung<br />

von Java-Quelldateien. Bisher leider nicht als Plug-In verfügbar ist eine Integration<br />

in ein Versionsmanagement-Werkzeug. Hier gehört eigentlich eine<br />

Integration in CVS mittlerweile zum Standard. Besonders fällt wiederum die gute<br />

Performance von jEdit im Vergleich zu anderen Java Swing-Anwendungen auf.<br />

Das Vorurteil, Java-Anwendungen taugen nicht für anspruchsvolle Anwendungen,<br />

ist auch deutlich widerlegt.


Kapitel 2 • Entwicklungsumgebungen 27<br />

jEdit bietet in der aktuell verfügbaren Version bereits eine Reihe nützlicher<br />

Funktionalitäten, die über das normale Syntax Highlighting hinausgehen. Auf<br />

Grund der fehlenden Integration in bestehende Versionierungs-Werkzeuge ist<br />

jEdit für den Einsatz in Projekten mit vielen Entwicklern eher nicht gut geeignet.<br />

Durch die große Zahl der unterstützten Programmiersprachen und die zum Teil<br />

sehr innovativen Plug-Ins stellt jEdit auf jeden Fall einen sehr guten Ersatz für<br />

die bisher verwendeten Editoren dar. Hier kommt auch die durch Java gegebene<br />

Plattformunabhängigkeit zum Tragen. jEdit ist auf allen Plattformen lauffähig,<br />

auf denen eine Java-Laufzeitumgebung zur Verfügung steht.<br />

2.1.3 Netbeans/Sun Forte for Java<br />

Nachdem es sich bei den beiden bisher betrachteten Werkzeugen um sehr leistungsfähige<br />

Editoren handelt, erhebt Netbeans den Anspruch, eine vollständige<br />

Entwicklungsumgebung zu sein, die den Entwickler in allen Phasen der Software-<br />

Entwicklung unterstützt.<br />

Konkret handelt es sich hier um zwei Anwendungen, die im Kern auf der Open<br />

Source-Plattform Netbeans (http://www.netbeans.org) basieren. Netbeans versteht<br />

sich dabei nicht in erster Linie als eine Entwicklungsumgebung, sondern<br />

vielmehr als eine flexible Anwendungsplattform, auf deren Basis verschiedenste<br />

Anwendungen entstehen können. Netbeans stellt dafür sozusagen die notwendige<br />

Infrastruktur zur Verfügung, auf der dann so genannte Module nachgeladen werden<br />

können. Ähnlich dem in JEdit verwendeten Plug-In-Verfahren wird die Funktionalität<br />

der Umgebung über zusätzliche Plug-Ins erweitert.<br />

Gestartet wurde das Open Source-Projekt von zwei Studenten in Tschechien, die<br />

eigens dafür die Firma Netbeans gegründet haben. Nach den ersten Versionen<br />

wurde die Firma von Sun aufgekauft und das Produkt als Closed Source-Projekt<br />

unter dem Namen Forte for Java Community Edition weitergeführt und im Oktober<br />

1999 auf den Markt gebracht. Obwohl auch in den Anfängen von Forte for<br />

Java eine freie, wenn auch abgespeckte Version zur Verfügung stand, hat Sun versucht,<br />

eine erweiterte Version als kommerzielles Produkt zu vermarkten. Auf<br />

Grund von strategischen Entscheidungen wurde der Kern der Anwendung jedoch<br />

im Juni 2000 als Open Source-Projekt unter der heutigen Adresse im Internet<br />

veröffentlicht. Gleichzeitig vertreibt Sun immer noch eine kommerzielle Version<br />

mit erweiterten, auf den hauseigenen J2EE-Applikationsserver zugeschnittenen<br />

Funktionen.<br />

Auf den Internetseiten der Netbeans.org findet sich neben der eigentlichen Plattform<br />

auch eine integrierte Entwicklungsumgebung auf Basis der Plattform.<br />

Grundsätzlich entstehen neue Anwendungen auf der Netbeans-Basis durch Hinzufügen<br />

von so genannten Modulen. Diese können auch wieder zur Laufzeit über<br />

die Netbeans-Oberfläche hinzugeladen und administriert werden. Eine Internetverbindung<br />

vorausgesetzt, können neuere Versionen direkt in die Oberfläche integriert<br />

werden.


28<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Schon während des Downloads merkt man, dass es sich bei Netbeans um eine<br />

andere Kategorie von Anwendungen handelt, als etwa bei jEdit. Beläuft sich die<br />

Downloadgröße bei jEdit auf ca 1,8 MB, so werden bei Netbeans in der Version<br />

3.3.2 schon allein ohne besondere Module knappe 15 MB geliefert. Nach der Installation<br />

und ein paar zusätzlichen Modulen sind leicht 50–60 MB auf der Platte belegt.<br />

Nach der Installation steht allerdings auch eine Entwicklungsumgebung zur Verfügung,<br />

die sich in Hinblick auf die vorhandenen Möglichkeiten vor kommerziellen<br />

Produkten keinesfalls verstecken muss. Für eine genauere Betrachtung, ohne<br />

Anspruch auf Vollständigkeit, soll im Folgenden ein kurzes Projekt dienen. Dabei<br />

kann auf die Besonderheiten der Oberfläche eingegangen werden und es können<br />

einige der interessanten Funktionen dargestellt werden. Um die bereits standardmäßig<br />

vorhandene Integration der Umgebung in bestehende Laufzeitumgebungen<br />

wie etwa J2EE Container und Java Servlet Container zu zeigen, werde ich im Folgenden<br />

eine Anwendung auf Basis der Java Servlet API realisieren. Besonders<br />

von Vorteil ist die Umgebung, wenn es darum geht, Laufzeitfehler eines Servlets<br />

bzw. einer Java Server Page zu finden. Netbeans liefert hier zum Beispiel hervorragende<br />

Möglichkeiten des Debuggings von serverseitigen Anwendungen.<br />

Netbeans-Oberflächenkonzepte<br />

Netbeans bietet die Möglichkeit, in zwei verschiedenen Darstellungsformen zu<br />

laufen. Dabei unterscheiden sich die Betriebsarten in der Darstellung der Fenster.<br />

Im SDI-Modus liegen alle Teile in einem separaten Anwendungsfenster. Im MDIoder<br />

FULL SCREEN-Modus gibt es nur ein Anwendungsfenster, in das die übrigen<br />

Fenster eingebettet werden. Während der Installation von Netbeans können Sie<br />

das konfigurieren. Ein Umschalten der Betriebsarten ist aber auch nach der Installation<br />

über den Menüpunkt TOOLS/SETUPWIZARD möglich.<br />

Abbildung 2.5:<br />

Auswahl der Betriebsart von Netbeans


Kapitel 2 • Entwicklungsumgebungen 29<br />

In den nachfolgenden Beispielen wird jeweils der MDI-Modus verwendet. Dieser<br />

bietet die von anderen Entwicklungsumgebungen und sonstigen Anwendungen<br />

gewohnte Dreiteilung der Oberfläche. Am linken Rand befindet sich eine Navigation,<br />

im mittleren Bereich das aktuelle Dokument und am unteren Rand optionale<br />

Status- bzw. Detailinformationen.<br />

Wichtig für die korrekte Verwendung der Oberfläche ist das Verständnis der verwendeten<br />

Konzepte und Begriffe. Im Folgenden werden die wichtigsten Begriffe<br />

und deren Bedeutung kurz erläutert.<br />

Filesystem<br />

Im linken Teil der Oberfläche befindet sich unter dem Reiter FILESYSTEMS eine<br />

hierarchische Anzeige der verfügbaren Verzeichnisse und Dateien. Um auf<br />

Dateien zuzugreifen, muss das entsprechende Filesystem in Netbeans geladen<br />

(mount) werden. Als erste Besonderheit fällt auf, dass der im Rest der Entwicklungsumgebung<br />

verwendete Klassenpfad auf den verfügbaren Filesystemen<br />

basiert. Das bedeutet, alles was in einem Filesystem erreichbar ist, liegt auch im<br />

Klassenpfad. Als Filesystem können neben echten Verzeichnissen auch direkt<br />

ZIP- bzw. JAR-Dateien sowie Arbeitsverzeichnisse von verschiedenen Versionsmanagement-Werkzeugen<br />

eingebunden werden.<br />

Project<br />

Dateien, die sich nur auf ein bestimmtes Projekt beziehen, können in Netbeans in<br />

so genannten Projects gruppiert werden. Dies ist von Vorteil, wenn die Navigation<br />

in den Filesystemen auf Grund deren Anzahl zu komplex geworden ist. Innerhalb<br />

von Projekten ist es auch möglich, Aktionen auf alle Dateien des Projekts auszuführen,<br />

etwa das Compilen aller Java-Quelldateien.<br />

Workspace<br />

Als Workspace wird in Netbeans die Sammlung verschiedener Anwendungsfenster<br />

bezeichnet, die für eine Aufgabe benötigt werden. Während des Editierens von<br />

Source Code wird neben dem Projektbrowser noch der Texteditor benötigt. Beim<br />

Debuggen werden dagegen neben den Quelltexten auch noch Fenster für die Darstellung<br />

von Variableninhalten benötigt. Über Reiter am oberen Rand kann direkt<br />

zwischen den Workspaces gewechselt werden.<br />

Wie schon erwähnt, handelt es sich bei Netbeans nicht in erster Linie um eine<br />

reine Entwicklungsumgebung. Es wurde vielmehr versucht, eine offene Plattform<br />

zu entwerfen, auf deren Basis dann beliebige Anwendungen aufsetzen können.<br />

Im Grunde stellt die Netbeans-IDE eben eine solche Anwendung dar.<br />

Für die Erweiterung der Funktionalitäten der Netbeans-Plattform steht dem Entwickler<br />

die Open API als Schnittstelle zur Erstellung von Netbeans-Modulen<br />

bereit. Module sind einzelne Erweiterungen, die zur Laufzeit in die Oberfläche<br />

integriert werden können. In die Java-Entwicklungsumgebung sind bereits die für<br />

die Java-Entwicklung wichtigsten Module eingefügt. Über den SETUP WIZARD<br />

können Module aktiviert und deaktiviert werden.


30<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Abbildung 2.6:<br />

Hauptfenster von Netbeans<br />

Abbildung 2.7:<br />

Konfiguration der Netbeans-Module


Kapitel 2 • Entwicklungsumgebungen 31<br />

Projekt anlegen<br />

Als ersten Schritt bei der Entwicklung sollte ein neues Projekt in Netbeans angelegt<br />

werden. Im Projekt werden alle relevanten Dateien einer Anwendung zusammengefasst.<br />

Projekte können in Netbeans über den Projektmanager verwaltet werden, der über<br />

den Menüpunkt PROJECT/PROJECT MANAGER aufgerufen wird. Die Informationen<br />

der Projekte werden hierfür an zentraler Stelle im Projektverzeichnis abgelegt<br />

und verwaltet.<br />

Nach dem Anlegen eines neuen Projekts im Projektmanager können zum einen<br />

bereits existierende Filesysteme in das Projekt aufgenommen, und auch direkt<br />

neue Objekte angelegt werden.<br />

Zum Anlegen von neuen Elementen bietet Netbeans die Möglichkeit, über eine<br />

Reihe so genannter Templates das Erzeugen zu vereinfachen. Templates dienen<br />

dabei als Vorlage für neue Dateien und Verzeichnisse. Neben den zahlreich vorhandenen<br />

Standard-Templates lassen sich auch eigene neue erzeugen. Hier können<br />

bestehende Templates als Vorlage verwendet werden oder aber auch ein<br />

kompletter Workspace als Template gespeichert werden. Verglichen mit ähnlichen<br />

Template-Mechanismen in anderen Entwicklungsumgebungen bieten die Templates<br />

in Netbeans den Vorteil, dass sich dadurch direkt eine Reihe von Dateien<br />

gleichzeitig anlegen lassen. Einfachstes Beispiel für die Verwendung ist die Definition<br />

einer Standard-Verzeichnisstruktur für alle Web-Projekte. Zu Beginn eines<br />

jeden neuen Web-Projektes können dann neben den üblichen Verzeichnissen und<br />

Konfigurationsdateien auch gleich die in der Abteilung üblichen sonstigen Verzeichnisse<br />

mitangelegt werden wie zum Beispiel ein Verzeichnis für die Ablage<br />

der Dokumentation oder benötigter SQL-Scripts.<br />

Die vorhandenen Templates können in der Entwicklungsumgebung über den Menüpunkt<br />

TOOLS/OPTIONS unter dem Abschnitt SOURCE CREATION AND MANAGEMENT<br />

verändert werden. Zum Öffnen und Editieren eines Templates ist dieses in der Baumansicht<br />

mit der rechten Maustaste auszuwählen und der Menüpunkt OPEN zu wählen.<br />

Abbildung 2.8:<br />

Templates-Dialog


32<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Nach dem Bearbeiten kann das neue Template einfach gespeichert werden und<br />

steht danach in der neuen Version zur Verfügung.<br />

Als erstes Beispiel bietet es sich an, das Template für gewöhnliche Java-Klassen<br />

(Class) zu modifizieren. Wie in Open Source-Projekten üblich, wird vor der<br />

eigentlichen Klassendeklaration die Lizenzvereinbarung eingefügt.<br />

Das in Abbildung 12.8 ausgewählte Template Class enthält nach der Installation<br />

folgende einfache Klassendeklaration:<br />

Listing 2.1:<br />

Standard Class-Template<br />

/*<br />

* __NAME__.java<br />

*<br />

* Created on __DATE__, __TIME__<br />

*/<br />

package Templates.Classes;<br />

/**<br />

*<br />

* @author __USER__<br />

*/<br />

public class Class {<br />

/** Creates a new instance of __NAME__ */<br />

public Class() {<br />

}<br />

}<br />

Im Quelltext des Templates befinden sich auch schon einige so genannte Makros,<br />

die zur Laufzeit durch die entsprechenden Werte ersetzt werden. Eine Liste der in<br />

Templates möglichen Makros befindet sich in der Online-Hilfe zur Entwicklungsumgebung.<br />

Makros beginnen und enden immer mit einem doppelten Unterstrich.<br />

Dazwischen steht der Name des Makros, der auch wieder Unterstriche enthalten<br />

darf. Das Makro __NAME__ beispielsweise wird durch den Namen der neu<br />

erzeugten Klasse ersetzt.<br />

In den Quelltext kann jetzt einfach der gewünschte zusätzliche Text eingefügt<br />

werden. Anstelle des Lizenztextes füge ich an dieser Stelle eine abgewandelte<br />

Implementierung der toString()-Methode in das Template ein.<br />

Listing 2.2:<br />

Modifiziertes Class-Template<br />

/*<br />

* __NAME__.java<br />

*<br />

* Created on __DATE__, __TIME__<br />

*/<br />

package Templates.Classes;<br />

/**<br />

*


Kapitel 2 • Entwicklungsumgebungen 33<br />

* @author __USER__<br />

*/<br />

public class Class {<br />

/** Creates a new instance of __NAME__ */<br />

public Class() {<br />

}<br />

}<br />

public String toString() {<br />

String parentToString = super.toString();<br />

return "Generated using Netbeans Template"<br />

+ parentToString();<br />

}<br />

Auf diesem Weg sollten die am häufigsten benötigten Templates eines Projektes<br />

identifiziert und dementsprechend angepasst werden. Je mehr während der Entwicklung<br />

auf standardisierte Templates zurückgegriffen wird, umso besser werden<br />

sich die Projektbeteiligten im Quelltext zurechtfinden. Die Lesbarkeit wird<br />

stark verbessert und damit auch die Wartbarkeit der Anwendungen.<br />

Nach den ersten Vorbereitungen kann im neuen Projekt direkt mit der Entwicklung<br />

begonnen werden. Als erstes Beispiel soll eine einfache Klasse auf Basis des<br />

eben modifizierten Templates erstellt werden.<br />

Nachdem das Projekt neu angelegt und geöffnet worden ist, steht es im linken Teil<br />

der Netbeans-Oberfläche zur Verfügung. Dateien des Projekts werden in einem<br />

Baum angezeigt, der zu Beginn noch komplett leer ist. Zum Hinzufügen neuer<br />

Elemente zu einem Projekt ist ein Knoten in der Baumansicht zu wählen und entweder<br />

über das Kontextmenü (rechte Maustaste) oder FILE/NEW der NEW WIZARD<br />

zu starten. Der Dialog bietet alle vorhandenen Templates zur Auswahl an. Wählt<br />

man hier das Template Class aus, werden in den nächsten Schritten des Dialogs<br />

noch der Name sowie das Package der Klasse abgefragt. Zusätzlich können in diesem<br />

Dialog auch schon Vererbungen angegeben und Methoden und Attribute für<br />

die Klasse definiert werden.<br />

Für das einfache Beispiel hier werden bis auf den Namen und die Position im<br />

Filesystem keine Angaben für die neue Klasse benötigt. Daher wird der NEW<br />

WIZARD nach dem zweiten Dialog mit dem FINISH-Button direkt abgeschlossen.<br />

Als Ergebnis erhalten Sie eine neue Klasse im Projekt, deren Quelltext auf dem<br />

eben modifizierten Class-Template basiert. Um ein lauffähiges Java-Programm zu<br />

bekommen, müssen Sie nur noch eine einfache Main-Methode hinzufügen.<br />

Nun kann die neue Klasse direkt über den Menüpunkt BUILD/COMPILE übersetzt<br />

werden. Nachdem die Klasse in Netbeans kompiliert wurde, bekommt sie in der<br />

Baumansicht des Projekts noch einen zusätzlichen grünen Pfeil. Damit werden in<br />

Netbeans alle Elemente eines Projektes gekennzeichnet, die direkt aus der Entwicklungsumgebung<br />

gestartet werden können.


34<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Abbildung 2.9:<br />

New-Wizard zum Anlegen neuer Elemente im Projekt<br />

Abbildung 2.10:<br />

Ausführbares Element in Netbeans<br />

Alle so gekennzeichneten Elemente können über den Menüpunkt EXECUTE des<br />

Kontextmenüs des Knotens direkt ausgeführt werden. Abgesehen von der Tatsache,<br />

dass zum Ausführen automatisch auf einen anderen Workspace gewechselt<br />

wird, ist die Ausgabe der Anwendung nicht sehr spannend. Wichtig ist an dieser<br />

Stelle nur, dass nicht nur reine Java-Klassen in Netbeans direkt ausgeführt werden<br />

können, sondern zum Beispiel auch Java Servlets oder Java Server Pages.


Kapitel 2 • Entwicklungsumgebungen 35<br />

Anlegen einer Webanwendung<br />

Im Gegensatz zu einfachen Java-Anwendungen benötigt eine Webanwendung<br />

neben den eigentlichen Java-Klassen für die Logik noch eine Reihe von speziellen<br />

Verzeichnissen und Konfigurationsdateien. In der J2EE-Spezifikation ist für<br />

Java Servlets und Java Server Pages folgende Verzeichnisstruktur definiert:<br />

Abbildung 2.11:<br />

Verzeichnisstruktur einer Webanwendung<br />

Das Hauptverzeichnis der Webanwendung gilt dabei als das Dokumentenverzeichnis.<br />

Alle Dateien in diesem Verzeichnis und alle Unterverzeichnisse können über<br />

den Webserver abgerufen werden. Einzige Ausnahme ist das Verzeichnis WEB-<br />

INF. Da es sich hierbei um das Konfigurationsverzeichnis der Anwendung handelt,<br />

muss der Webserver den Zugriff auf dieses Verzeichnis verbieten. Standardmäßig<br />

sind mindestens die Verzeichnisse classes und lib vorhanden. Das classes-<br />

Verzeichnis alle Java-Klassen der Webanwendung und das lib-Verzeichnis enthält<br />

alle zusätzlich benötigten Bibliotheken in Form von JAR/ZIP-Dateien. Ebenso<br />

enthalten sein muss die Datei web.xml im WEB-INF-Verzeichnis. Die Datei enthält<br />

den so genannten Web Application Deployment Descriptor, wie in der J2EE-<br />

Spezifikation beschrieben. Hier werden die einzelnen Komponenten einer Webanwendung<br />

konfiguriert. Auf die Verwendung der Einstellungen in der web.xml-<br />

Datei wird in einem der folgenden Kapitel noch näher eingegangen.<br />

Um nun in Netbeans eine solche Webanwendung, bestehend aus den genannten<br />

Komponenten zu erstellen, kann ein vordefiniertes Template verwendet werden.<br />

Das Template erzeugt neben der benötigten Verzeichnisstruktur auch direkt die<br />

angesprochene Konfigurationsdatei web.xml im entsprechenden Verzeichnis. Das<br />

Vorgehen ist hierbei analog zu dem eben gemachten Template-Beispiel. Zuerst<br />

wird wieder im Projektmanager ein neues Projekt zur Aufnahme der Dateien<br />

angelegt und ein Filesystem als physikalischer Ablageort gemountet. Danach<br />

kann wieder über das Kontextmenü ADD NEW des Projektknotens ein Template<br />

ausgewählt werden. Das entsprechende Template WebModule findet sich im NEW<br />

WIZARD unter TEMPLATES/JSP & SERVLETS.<br />

Im folgenden Dialog ist lediglich der Name der Anwendung anzugeben und das<br />

Hauptverzeichnis aus den vorhandenen Filesystemen auszuwählen. Als Ergebnis<br />

erhält man dann die besprochenen Verzeichnisse inklusive der Steuerdatei, die<br />

auch schon mit ein paar Standardeinstellungen belegt ist. Hier bietet es sich an,<br />

das Template und die enthaltene web.xml-Datei an die eigenen Projekte anzupassen.<br />

Einstellungen, die in mehreren Webanwendungen verwendet werden, können<br />

auch direkt im Template untergebracht werden. Liegen die Templates alle in


36<br />

Integrierte Entwicklungsumgebung (IDE)<br />

einem gemeinsam genutzten Verzeichnis, können auch die anderen Entwickler<br />

eines Projektteams die gleichen Templates verwenden.<br />

Nachdem das neue Projekt mit seinen Grundeinstellungen erzeugt wurde, kann<br />

direkt mit dem Entwickeln der Anwendungslogik begonnen werden. Da sowohl<br />

für Servlets als auch für JSP-Seiten wieder vorgefertigte Templates existieren,<br />

können diese auf schon gewohnte Weise dem Projekt hinzugefügt werden.<br />

Um als Beispiel nicht auf das beliebte Hello World-Beispiel zu verfallen, soll ein<br />

einfaches Ratespiel entwickelt werden. Der Benutzer muss eine Zahl zwischen 1<br />

und 100 erraten. Jeder Versuch wird von der Anwendung mitgezählt. Macht der<br />

Benutzer einen Fehlversuch, erhöht sich die Anzahl der gemachten Versuche und<br />

er kann einen neuen Versuch starten. Bei einem Treffer wird eine Erfolgsmeldung<br />

ausgegeben. Damit das Spiel nicht unendlich läuft, bricht der Server nach zehn<br />

Versuchen das Spiel mit einer Fehlerseite ab.<br />

Die Logik der Anwendung wird in einem Servlet implementiert. Dazu kann wieder<br />

wie gewohnt das entsprechende Template verwendet werden, um das neue<br />

Servlet in das Projekt aufzunehmen. Dazu ist der Knoten Classes auszuwählen<br />

und dort wieder über das Kontextmenü der NEW WIZARD zu starten.<br />

Die so erzeugte Klasse ZahlServlet besitzt durch das Template bereits alle notwendigen<br />

Methoden, die nun auf unsere Bedürfnisse angepasst werden müssen.<br />

In der generierten Klasse werden sowohl GET- als auch POST-Aufrufe an die<br />

Methode processRequest weitergeleitet. Dadurch muss auch nur an dieser Stelle<br />

die Anwendungslogik implementiert werden.<br />

Listing 2.3:<br />

Servlet für das Zahlenspielbeispiel<br />

import javax.servlet.*;<br />

import javax.servlet.http.*;<br />

public class ZahlServlet extends HttpServlet {<br />

...<br />

protected void processRequest(<br />

HttpServletRequest request,<br />

HttpServletResponse response)<br />

throws ServletException, java.io.IOException {<br />

String message = "";<br />

String nextView = "/question.jsp";<br />

HttpSession session = request.getSession();<br />

NumberBean numberBean =<br />

(NumberBean)session<br />

.getAttribute("numberBean");<br />

if (numberBean == null)<br />

numberBean = new NumberBean();<br />

numberBean.inc();


Kapitel 2 • Entwicklungsumgebungen 37<br />

}<br />

...<br />

String guess =<br />

(String)request<br />

.getParameter("number");<br />

if (guess != null) {<br />

int number = new Integer(guess).intValue();<br />

if (number == numberBean.secretNumber) {<br />

message = numberBean.count+"";<br />

nextView = "/success.jsp";<br />

}<br />

else if (number < numberBean.secretNumber)<br />

message = number + " ist zu niedrig."<br />

+ "Versuchen Sie es erneut.";<br />

else if (number > numberBean.secretNumber)<br />

message = number + " ist zu hoch."<br />

+ "Versuchen Sie es erneut";<br />

}<br />

// put values in session<br />

session.putValue("message", message);<br />

session.putValue("numberBean", numberBean);<br />

// call next view<br />

if (numberBean.count == 11) {<br />

nextView = "/error.jsp";<br />

session.removeAttribute("numberBean");<br />

}<br />

request<br />

.getRequestDispatcher(nextView)<br />

.forward(request, response);<br />

}<br />

class NumberBean {<br />

public int count = -1;<br />

public int secretNumber = 0;<br />

public NumberBean() {<br />

secretNumber = (int)(Math.random()*100+1);<br />

}<br />

}<br />

public void inc() {<br />

count++;<br />

}<br />

Die implementierte Logik beschränkt sich darauf, die übergebene Zahl aus dem<br />

Request auszulesen und mit einer in der Session gespeicherten Zahl zu vergleichen.<br />

Je nach dem Ergebnis des Vergleichs wird eine Nachricht in der Session abgelegt<br />

und anschließend über den RequestDispatcher eine JSP-Seite als Ergebnis geliefert.


38<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Die notwendigen JSP-Seiten der Anwendung können ebenfalls aus einem Template<br />

generiert werden. Für die Anwendung werden neben der eigentlichen Eingabemaske<br />

noch eine Fehlerseite und eine Erfolgsseite benötigt.<br />

Listing 2.4:<br />

JSP-Quelltext der Eingabemaske des Zahlenspiels<br />

<br />

<br />

Eingabemaske<br />

<br />

<br />

<br />

<br />

Bitte eine Zahl zwischen 1-100 eingeben<br />

<br />

<br />

<br />

<br />

Listing 2.5:<br />

JSP-Quelltext der Erfolgsseite<br />

<br />

<br />

JSP Page<br />

<br />

<br />

Herzlichen Glückwunsch <br />

Nach nur Versuchen haben Sie die Zahl erraten.<br />

<br />

<br />

Listing 2.6:<br />

JSP-Quelltext der Fehlerseite<br />

<br />

<br />

JSP Page<br />

<br />

Leider verloren. Ein neues Spiel ?<br />

<br />

<br />

Nachdem die JSP-Seiten erstellt wurden und die Servlet-Methoden implementiert<br />

worden sind, kann die Anwendung direkt in Netbeans getestet werden. Zu diesem<br />

Zweck wird Netbeans mit einem eingebauten JSP und Servlet Container ausgeliefert.<br />

In der aktuellen Version von Netbeans (3.3.2) wird dafür der aus dem Jakarta-


Kapitel 2 • Entwicklungsumgebungen 39<br />

Projekt stammende Tomcat-Server verwendet. Die enge Kopplung an die Entwicklungsumgebung<br />

bringt gerade bei der Entwicklung von Webanwendungen<br />

starke Vereinfachungen während der Entwicklung. Zum einen können die Anwendungen<br />

direkt in der Umgebung gestartet und getestet werden. Zudem ist es aber<br />

auch möglich, die JSP-Seiten schon vor dem Deployment auf einem Servlet Container<br />

zu testen.<br />

Normalerweise werden JSP-Seiten erst beim ersten Aufruf innerhalb des Containers<br />

in Java Servlets umgewandelt und dann kompiliert. Dadurch werden eventuelle<br />

Syntax-Fehler in den JSP-Seiten auch erst zur Laufzeit der Anwendung<br />

bemerkt. Hier bietet Netbeans die Möglichkeit, die Übersetzung der JSP-Dateien<br />

genauso wie normale Java-Dateien vorzunehmen. Zum anderen kann auch das<br />

entstandene Java Servlet in den Editor geladen und untersucht werden. Gerade um<br />

Laufzeitfehler zu finden, kann das für die Fehlerdiagnose sehr hilfreich sein.<br />

Abbildung 2.12:<br />

Fertige Webanwendung in Netbeans<br />

Wie schon bei der im vorhergehenden Beispiel erstellten Anwendung ist auch für<br />

ein Servlet das Starten aus der Umgebung möglich, entweder über das Kontextmenü<br />

des Servlets in der Baumansicht oder über den grünen Pfeil in der Toolbar.<br />

Beim Starten der Anwendung wird zuerst der integrierte Tomcat-Server gestartet<br />

und die Anwendung installiert.


40<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Abbildung 2.13:<br />

Starten des Tomcat-Servers im Running Workspace<br />

Ist der Server gestartet, wird das Servlet über einen externen Webbrowser angesprochen<br />

und ausgeführt. Da der integrierte Tomcat-Server auf dem Port 8080 auf<br />

Anfragen wartet, wird folgende URL verwendet: http://localhost:8080/servlet/<br />

ZahlServlet<br />

Abbildung 2.14:<br />

Eingabemaske für das Zahlenspiel<br />

Nach Eingabe der Zahl wird das Servlet erneut aufgerufen und bekommt dieses<br />

Mal einen Parameter mitgeschickt. Sofern die Zahl nicht richtig geraten worden<br />

ist und noch neue Eingaben erlaubt sind, wird wieder auf die Startseite (question.jsp)<br />

verzweigt. Sofern vorhanden, wird eine kurze Meldung oberhalb des<br />

Eingabeformulars angezeigt.


Kapitel 2 • Entwicklungsumgebungen 41<br />

Abbildung 2.15:<br />

Eingabemaske inklusive Meldung<br />

Treten Fehler auf, kann der Debugger verwendet werden, um das Servlet, aber<br />

auch die JSP-Seiten schrittweise zu durchlaufen. Um die Verarbeitung innerhalb<br />

des Servlets anzuhalten, kann, wie gewohnt, ein Breakpoint an einer Programmzeile<br />

gesetzt werden. Der Debugger beendet dann an genau dieser Stelle die Verarbeitung<br />

und der Quelltext kann schrittweise durchlaufen werden. Um das<br />

Gleiche in einer JSP-Seite machen zu können, ist es möglich, im erzeugten Servlet<br />

einen Breakpoint zu setzen. Der Quelltext der erzeugten Servlets ist über das<br />

Kontextmenü der JSP-Knoten in der Baumansicht verfügbar.<br />

Alles in allem macht die Integration von Netbeans mit dem Tomcat-Server einen<br />

sehr runden Eindruck. Zur Entwicklung von Servlet- und JSP-basierten Anwendungen<br />

bietet Netbeans dadurch eine sehr mächtige und effiziente Umgebung an.<br />

Neue Funktionalitäten können ohne große Umwege direkt ausgetestet werden.<br />

Auch der integrierte Debugger macht die Entwicklung von Webanwendungen<br />

wesentlich komfortabler im Vergleich zu Umgebungen, bei denen der Servlet<br />

Container als eigenständige Anwendung läuft.<br />

GUI-Entwicklung<br />

Neben der Möglichkeit, Java-Quellen über den oben beschriebenen Template-<br />

Mechanismus zu erzeugen, bietet Netbeans für die Entwicklung grafischer Oberflächen<br />

noch weitergehende Funktionalitäten. Eine einfache Anwendung inklusive<br />

grafischer Oberfläche ist wie gewohnt über ein vorhandenes Template<br />

möglich. Die so erzeugte Java-Anwendung kann nach der Generierung direkt aus<br />

Netbeans gestartet werden und verfügt bereits über eine Menüleiste mit den gängigsten<br />

Menüpunkten.<br />

Um die Erstellung von grafischen Oberflächen zu erleichtern, verfügt Netbeans<br />

über einen sehr mächtigen Editor für die grafische Bearbeitung der Oberflächen.<br />

Diese können so ohne Programmierung rein visuell erstellt werden. Da der Editor<br />

lediglich Standard-Java erzeugt, kann das Ergebnis auch noch manuell nachbearbeitet<br />

werden. Öffnet man den Quelltext der erzeugten Klasse, sieht man bereits<br />

einige Stellen, an denen der Quelltext von Netbeans erstellt worden ist. Der generierte<br />

Quelltext kann nicht geändert werden und ist im Texteditor farblich hinterlegt.<br />

An den restlichen Stellen können durch den Entwickler Erweiterungen<br />

eingebaut werden. Dadurch kann der grafische Editor zu jeder Zeit wieder verwendet<br />

werden, auch wenn bereits Erweiterungen an der erzeugten Klasse vorgenommen<br />

worden sind.


42<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Aus der Werkzeugleiste im Forms Editor können verschiedenste grafische Oberflächenkomponenten<br />

auf die Form gesetzt werden. Sie müssen nur einfach die<br />

entsprechende Komponente in der Werkzeugleiste anwählen und anschließend<br />

auf der Form platzieren. Das Aussehen der Form und deren Verhalten lässt sich<br />

im Editor ohne Ausführen der restlichen Anwendung testen.<br />

In der Praxis erweist sich der Forms Editor als äußerst hilfreich. Durch den<br />

Zugriff auf nahezu alle Elemente der AWT- und Swing-Bibliotheken sind auch<br />

komplexere Oberflächen mit dem Werkzeug beherrschbar. Wie auch bei anderen<br />

Werkzeugen, die den Quelltext einer grafischen Oberfläche generieren, muss der<br />

Entwickler sich an den erzeugten Quelltext erst gewöhnen und diesen verstehen.<br />

Durch die Trennung des generierten Teils der Anwendung von den manuellen<br />

Änderungen der Entwickler treten allerdings kaum Probleme auf, wenn die Form<br />

nachträglich geändert werden muss. Hier unterscheidet sich der in Netbeans verwendete<br />

Ansatz klar von anderen Werkzeugen, wo versucht wird, beliebige Programmierstile<br />

zu verarbeiten. Borlands JBuilder beispielsweise wertet beim<br />

Starten seines Form Editors die Java-Klasse aus und versucht anhand der ermittelten<br />

Informationen den Editor aufzubauen. Werden starke Veränderungen vorgenommen,<br />

ist die Wahrscheinlichkeit recht hoch, dass der Editor nicht mehr für<br />

spätere Änderungen des Layouts benutzt werden kann.<br />

Gerade bei der recht komplexen Arbeit mit den Java Layout-Managern bietet das<br />

visuelle Arbeiten mit dem Netbeans Forms Editor klare Vorteile gegenüber der<br />

reinen Programmierung. Um das gewünschte Layout einer Anwendung zu erzielen,<br />

ist es häufig notwendig, Swing-Komponenten mit den unterschiedlichsten<br />

Layout-Managern zu schachteln. Hier hilft die Baumansicht des Forms Editors,<br />

der alle in einer Form enthaltenen Komponenten darstellt. Die Elemente können<br />

hier direkt angewählt und bearbeitet werden. So ist zum Beispiel die Auswahl des<br />

Layout-Managers direkt über das Kontextmenü im Baum möglich.<br />

Abbildung 2.16:<br />

Auswahl des Layout-Managers in der Baumansicht des Editors


Kapitel 2 • Entwicklungsumgebungen 43<br />

Verwendet man Komponenten anderer Hersteller, können diese in den Editor integriert<br />

werden. Sie stehen dann wie die bereits vorhandenen Komponenten über<br />

eine Werkzeugleiste zur Verfügung und können von dort ausgewählt werden.<br />

Unterhalb der Baumansicht werden jeweils die Eigenschaften der ausgewählten<br />

Komponente angezeigt.<br />

Integrierter Debugger<br />

Gerade bei komplexen verteilten Anwendungen ist es manchmal hilfreich,<br />

bestimmte Stellen schrittweise durchlaufen zu können. Zu diesem Zweck steht<br />

der Java SDK bereits mit dem JDB (Java Debugger) ein Werkzeug zur Verfügung.<br />

Da es sich dabei allerdings um eine reine Kommandozeilen-Anwendung handelt,<br />

ist die Bedienung auch recht unhandlich. Die meisten Entwicklungsumgebungen<br />

bieten daher zumindest ein grafisches Frontend zur Kommandozeilen-Version an.<br />

Andere Umgebungen gehen noch einen Schritt weiter und bieten einen komplett<br />

eigenen Debugger an. Während einer Debug-Sitzung sollten zumindest die folgenden<br />

Funktionen zur Verfügung stehen:<br />

• Anzeige der aktuellen Zeile im Quelltext<br />

• Anzeige von Variableninhalten<br />

• Setzen von Unterbrechungspunkten (Breakpoint)<br />

Zusätzlich zu diesen Anforderungen bietet die Debugger-Oberfläche von Netbeans<br />

noch folgende Möglichkeiten:<br />

• Definition von Unterbrechungsbedingungen<br />

• Unterbrechung bei Exception<br />

• Watchlist mit Variablen, die beobachtet werden sollen<br />

• Anzeige des Aufrufstapels<br />

Besonders interessant ist die Möglichkeit, auch Webanwendungen im Debugger<br />

laufen zu lassen. Unterbrechungspunkte können dazu wie gewohnt an beliebiger<br />

Stelle gesetzt werden. Betrachtet man die in diesem Kapitel erstellte Webanwendung,<br />

so bietet sich als Unterbrechungspunkt die erste Zeile der process-<br />

Request(...)-Methode an. Dadurch wird die Beantwortung jeder Anfrage aus<br />

dem Webbrowser an dieser Stelle angehalten und der Debugger markiert die<br />

Zeile im Quelltext. Nun kann schrittweise durch die Anwendung gelaufen werden.<br />

Zum Setzen eines Unterbrechungspunktes wird die entsprechende Zeile ausgewählt<br />

und das Kontextmenü TOGGLE BREAKPOINT gewählt. Die Zeile wird<br />

dadurch farblich hervorgehoben und an der linken Seite des Editors mit einem<br />

Icon markiert.


44<br />

Integrierte Entwicklungsumgebung (IDE)<br />

Abbildung 2.17:<br />

Markierter Breakpoint (Unterbrechungspunkt) in ZahlServlet<br />

Die so vorbereitete Anwendung kann direkt über das Menü DEBUG/START in einer<br />

Java Debugger-Sitzung gestartet werden. Da es sich um eine Webanwendung handelt,<br />

wird wieder zuerst der Tomcat-Server gestartet, zu dem sich dann der integrierte<br />

Debugger verbinden kann. Das Debugging erfolgt in diesem Fall über eine<br />

entfernte Schnittstelle der Java VM. Das verwendete Protokoll JPDA ist Teil der<br />

Java 2SE ab Version 1.3. Nach dem Starten der Anwendung wechselt Netbeans<br />

auf den Debugging Workspace, der eine Reihe von Fenstern enthält, die Informationen<br />

über den aktuellen Zustand der Anwendung enthalten.<br />

Neben der Liste der gesetzten Unterbrechungspunkte stellt ein Fenster den Aufruf-Stack<br />

dar, der bis zur aktuellen Position geführt hat. Ein weiteres Fenster enthält<br />

die so genannten Watches. Hier können Variablen beobachtet werden. Eine<br />

Variable wird hier einfach über ihren Namen hinzugefügt. Zur Laufzeit werden<br />

dann hier die Werte der aktuell verfügbaren Variablen mit diesem Namen angezeigt.<br />

Ist zurzeit keine im Gültigkeitsbereich verfügbar, wird kein Wert angezeigt.<br />

Über eine spezielle Werkzeugleiste des Debuggers kann durch die Anwendung<br />

navigiert werden.<br />

Abbildung 2.18:<br />

Debugger-Werkzeugleiste<br />

Folgende Funktionen stehen darüber zur Verfügung (von links nach rechts):<br />

1. START (neue Debugger-Sitzung)<br />

2. CONTINUE (Fortsetzen bis zum nächsten Breakpoint bzw. Ende)<br />

3. ATTACH (Debugger an entfernten Prozess anbinden, JPDA)<br />

4. FINISH (Debug-Sitzung beenden)<br />

5. STEP INTO (in die aufgerufene Methode verzweigen)<br />

6. RUN TO CURSOR (Ausführen bis zum Eingabezeichen)


Kapitel 2 • Entwicklungsumgebungen 45<br />

7. STEP OVER (Ausführen der Anweisung)<br />

8. STEP OUT (Zurückspringen zum Aufrufer)<br />

9. TOGGLE BREAKPOINT (Unterbrechunspunkt An/Aus)<br />

10. ADD BREAKPOINT (neuen Unterbrechungspunkt hinzufügen)<br />

11. ADD WATCH... (neuen Watch hinzufügen)<br />

Abbildung 2.19:<br />

Debugging Workspace für Webanwendung<br />

Abbildung 2.19 zeigt die Fenster des Debugging Workspace für die Beispielanwendung.<br />

Neben der schon bekannten Markierung des Unterbrechungspunktes<br />

ist zudem noch die aktuelle Zeile, an der sich die Anwendung gerade befindet,<br />

grün markiert und mit einem Pfeil gekennzeichnet. Im linken Teil sind die Informationsfenster<br />

untergebracht, unten links zum Beispiel das Fenster mit den Variablen,<br />

die zurzeit beobachtet werden sollen.<br />

Sobald ein Variablenname aus dem aktuellen Gültigkeitsbereich mit einem der beobachteten<br />

Namen übereinstimmt, wird der aktuelle Wert angezeigt. Im Beispiel wird<br />

mit der Variablen message ein einfacher String und mit numberBean eine Instanz<br />

der Klasse NumberBean angezeigt. Hier wird deutlich, dass die Anzeige sich nach<br />

dem gefundenen Datentyp verändert. Im Fall der numberBean können deswegen<br />

direkt die als public deklarierten Attribute count und secretNumber angezeigt werden.<br />

Zusätzlich zu den erwähnten Watches zur Kontrolle von Variableninhalten besteht<br />

noch die Möglichkeit, einfach alle aktuellen Variablen anzuzeigen. In diesem<br />

Fenster werden dann jeweils alle Variablen angezeigt, die zurzeit gültig sind.


46<br />

Versions-/Releasemanagement-System<br />

2.2 Versions-/Releasemanagement-System<br />

Neben den bereits besprochenen Werkzeugen für die Entwicklung der Anwendungen<br />

werden in der Regel noch Werkzeuge und Verfahren für ein Versionsmanagement<br />

benötigt. Auch wenn der Einsatz von Versionsmanagement-<br />

Werkzeugen schon für Ein-Mann-Werkzeuge Sinn macht, ist ein Einsatz bei mehreren<br />

Entwicklern unverzichtbar.<br />

Neben der Tatsache, dass verschiedene Stände (Versionen) einer Anwendung in<br />

der Entwicklung sein können, besteht in der Regel auch die Anforderung, dass<br />

alle Entwickler zu jedem Zeitpunkt alle Quellen bearbeiten können müssen. Die<br />

durch dieses konkurrierende Arbeiten eventuell auftretenden Konflikte sollten<br />

wenn möglich vom System behandelt werden.<br />

Genau an dieser Stelle unterscheiden sich die gängigen am Markt verfügbaren<br />

Versionsmanagement-Systeme. Die einen lassen einen konkurrierenden Zugriff<br />

zu, andere hingegen erlauben nur einen exklusiven Zugriff auf Dateien.<br />

Systeme, die nur einen exklusiven Zugriff auf Dateien zulassen, vermeiden<br />

dadurch direkt das Auftreten von Konflikten in den Quellen. Als Nachteil fällt<br />

dabei auf, dass es möglich ist, andere Entwickler über längere Zeit von der Bearbeitung<br />

einer Datei auszuschließen, weil das Freigeben der Datei vergessen worden<br />

ist. In diesem Fall müsste die Datei explizit durch einen Administrator des<br />

Versionsmanagement-Systems freigegeben werden.<br />

Systeme, die einen konkurrierenden Zugriff auf die Dateien durch die Entwickler<br />

zulassen, müssen in der Lage sein, die auftretenden Konflikte behandeln zu können.<br />

Dies kann im einfachsten Fall automatisch geschehen oder in komplexeren<br />

Fällen durch den Entwickler. Sofern sich zwei konkurrierende Änderungen an<br />

einer Datei nicht auf dieselben Bereiche der Datei beziehen, können beide Versionen<br />

der Datei zusammengeführt werden.<br />

Überschneiden sich allerdings die geänderten Bereiche, können die Dateien nicht<br />

einfach zusammengeführt werden und ein Entwickler muss den entstandenen<br />

Konflikt manuell auflösen. Doch auch wenn die unterschiedlichen Änderungen<br />

automatisch zusammengeführt werden konnten, ist es denkbar, dass die Funktionalität<br />

der Anwendung dadurch ungewollt geändert worden ist.<br />

Das im Open Source-Umfeld am häufigsten verwendete Werkzeug zur Verwaltung<br />

von Versionen und Release-Ständen ist CVS (Concurrent Versions System,<br />

http://www.cvshome.org). Gerade im Bereich von Open Source-Projekten, die<br />

klassischerweise von stark verteilten Projektteams bearbeitet werden, ist ein flexibler<br />

Zugriff auf die Quelltexte notwendig. Auch ist es bei solchen Projekten<br />

sinnvoll, nicht ständig eine Verbindung zu einem Versionsmanagement-Server<br />

halten zu müssen.


Kapitel 2 • Entwicklungsumgebungen 47<br />

CVS Repository<br />

CVS arbeitet als Client-Server-Anwendung und verwaltet auf einen zentralen<br />

Server alle versionierten Module. Zu diesem Zweck wird einmalig auf dem Server<br />

ein so genanntes Repository angelegt. Bei CVS handelt es sich dabei um ein<br />

einfaches Verzeichnis, in dem eine Reihe von Steuerungsdateien angelegt werden.<br />

Neue Module bekommen jeweils ein Unterverzeichnis unterhalb des CVS-Startverzeichnisses<br />

(cvs root).<br />

Für den Zugriff auf den CVS-Server dient ein CVS-Client. Im einfachsten Fall<br />

kann hier direkt die Kommandozeilen-Version von CVS verwendet werden oder<br />

aber eine grafische Oberfläche. Als dritte Möglichkeit bietet sich die Integration<br />

von CVS in die verwendete Entwicklungsumgebung an. Die in Netbeans dazu<br />

notwendigen Konfigurationen werden am Ende dieses Abschnitts kurz dargestellt.<br />

CVS ist auf einem normal konfigurierten Linux-System normalerweise direkt<br />

verfügbar. Alternativ kann es auch von der CVS-Webseite heruntergeladen und<br />

installiert werden. Die folgenden Beispiele gehen davon aus, dass sich ein funktionsfähiges<br />

CVS auf dem System befindet.<br />

Nachdem CVS auf dem Server installiert worden ist, kann das Repository angelegt<br />

und initialisiert werden. Dazu muss zuerst ein Verzeichnis dafür angelegt<br />

werden. Das Anlegen des Repository erfolgt mit dem CVS-Kommandozeilen-<br />

Werkzeug mit folgenden Parametern:<br />

cvs –d /opt/var/cvsroot init<br />

Hiermit wird das Verzeichnis /opt/var/cvsroot als Repository initialisiert. Als erstes<br />

Unterverzeichnis wird durch das init-Kommando das Verzeichnis CVSROOT<br />

angelegt. In diesem Verzeichnis werden alle Konfigurationsdateien dieses Repository<br />

abgelegt. Da es sich ebenfalls schon um ein CVS-Modul handelt, kann nicht<br />

direkt auf die Dateien in diesem Verzeichnis zugegriffen werden. Alle Änderungen<br />

müssen – wie bei allen anderen Modulen – im Repository über die CVS-<br />

Client-Anwendung erfolgen.<br />

Der CVS-Server muss jetzt nur noch entsprechend konfiguriert werden, um auf<br />

das Repository zugreifen zu können. Grundsätzlich existiert für Client und Server<br />

nur eine ausführbare Anwendung. Auf einem Linux-Server beispielsweise wird<br />

der Zugriff auf das Repository über den Inet-Deamon gesteuert. Wie auch bei<br />

anderen Protokollen wie etwa FTP oder Telnet wartet hier der Inetd-Prozess auf<br />

eingehende Anfragen an definierten IP-Ports und leitet sie dann an ihm bekannte<br />

Anwendungen weiter.<br />

Auf einem Linux-System mit installiertem Inet-Daemon muss die Datei /etc/<br />

inetd.conf um folgende Zeile ergänzt werden:<br />

2401 stream tcp nowait root /usr/local/bin/cvs<br />

cvs -f --allow-root=/opt/var/cvsroot pserver


48<br />

Versions-/Releasemanagement-System<br />

Alle TCP-IP-Anfragen, die auf dem Port 2401 eingehen, werden an die Kommandozeilen-Version<br />

von CVS auf diesem Server weitergleitet. Außerdem ist das zu<br />

verwendende Repository anzugeben. Die letzte Option (pserver) gibt an, dass der<br />

CVS-Serverprozess eine Passwort-Abfrage an den Client schicken wird. Auf<br />

einem Linux-System besteht hier die Möglichkeit, entweder die vorhandenen<br />

Systembenutzer zu verwenden oder aber neue CVS-Benutzer anzulegen.<br />

Eine weitergehende Behandlung der Konfiguration eines CVS-Servers findet sich<br />

in der offiziellen Dokumentation zu CVS unter http://www.cvshome.org/docs/<br />

manual. Die Konfiguration sollte einem erfahrenen Administrator überlassen<br />

werden, um nicht ungewollte Hintertüren in das Linux-System einzubauen.<br />

Zugriff auf das Repository<br />

Um nun auf die Module im CVS-Verzeichnis zugreifen zu können, ist eine CVS-<br />

Client-Anwendung erforderlich. Standardmäßig kann auch zu diesem Zweck das<br />

schon als Server-Prozess verwendete Kommandozeilen-Werkzeug verwendet<br />

werden.<br />

Damit klar ist, auf welchem Server sich das Repository befindet und mit welcher<br />

Verbindungsmethode darauf zugegriffen werden kann, ist eine Umgebungsvariable<br />

vor der Verwendung von CVS zu setzen.<br />

Die Variable CVSROOT hat folgenden Aufbau:<br />

:[pserver | local]:username@hostname:cvs_root_dir_on_server<br />

Für den Zugriff auf den vorher konfigurierten Linux-Server ist die Variable wie<br />

folgt zu besetzen:<br />

:pserver:deicksta@cvs.deicon.de:/opt/var/cvsroot<br />

Da es sich in diesem Fall um einen Server mit Authentifizierung handelt, muss<br />

sich der Benutzer vor der Verwendung von CVS am Server anmelden. Das<br />

geschieht über das Kommando login auf der Kommandozeile:<br />

cvs login<br />

Sobald der Benutzer sich einmal am Server angemeldet hat, ist kein weiteres Einloggen<br />

in den Server mehr notwendig. Erst wenn die CVSROOT-Variable geändert<br />

wird, muss sich erneut gegen den Server authentifiziert werden. Der CVS-Client<br />

speichert dazu eine verschlüsselte Version des Passworts in einer versteckten<br />

Datei im HOME-Verzeichnis des Benutzers.<br />

Arbeiten mit CVS<br />

Um die Arbeitsweise mit CVS darzustellen, ist es am einfachsten, einen üblichen<br />

Arbeitsablauf anhand eines kleinen Beispiels durchzugehen. Dabei können dann<br />

die notwendigen Arbeitsschritte während der Entwicklung mit CVS dargestellt<br />

werden.


Kapitel 2 • Entwicklungsumgebungen 49<br />

Da die Verwendung der Kommandozeile für den alltäglichen Gebrauch etwas<br />

mühselig werden kann, sollte in der Regel eine grafische Oberfläche für den<br />

Zugriff auf das CVS Repository verwendet werden. Wie bereits erwähnt, existieren<br />

hier verschiedene reine CVS-Client-Anwendungen. Für die Verwendung auf<br />

einem Windows-Rechner steht mit WinCVS (http://www.wincvs.org) eine sehr<br />

komfortable und stabile Umgebung zur Verfügung. WinCVS bietet sich auch<br />

dann als das passende Werkzeug an, wenn neben den Java-Quelldateien noch<br />

andere Dateien versioniert werden sollen. Häufig werden beispielsweise Word-<br />

Dokumente, Grafiken und andere Dateien zu einem Projekt mitabgespeichert, die<br />

nicht direkt mit der Programmentwicklung in Zusammenhang stehen.<br />

Während der Entwicklung ist es allerdings wünschenswert, wenn die verwendete<br />

Entwicklungsumgebung auch direkt mit CVS-Verzeichnissen arbeiten kann. Netbeans<br />

bietet genau diese Integration, ohne zusätzliche Module installieren zu<br />

müssen.<br />

Grundsätzlich wird während der Arbeit mit CVS nicht direkt im Repository gearbeitet,<br />

sondern in einer lokalen Kopie der Dateien. Dadurch ist nur für den<br />

Abgleich mit dem Repository eine Verbindung notwendig. Diese muss aber nicht<br />

dauerhaft zur Verfügung stehen, um etwa Dateien zu sperren oder freizugeben.<br />

Bevor mit der Arbeit begonnen werden kann, ist die lokale Arbeitskopie zu erzeugen.<br />

Dazu werden die Dateien aus dem Repository in ein lokales Verzeichnis<br />

kopiert. Das Verzeichnis bekommt den Namen des CVS-Moduls.<br />

In Netbeans werden CVS-Verzeichnisse ähnlich behandelt wie einfache Filesysteme.<br />

Sie müssen ebenfalls vor der Verwendung in die Oberfläche gemountet<br />

werden. Sofern gewünscht, kann dabei gleichzeitig ein Modul aus dem Repository<br />

als lokale Arbeitskopie kopiert oder aber auch eine bereits vorhandene verwendet<br />

werden. Über das Kontextmenü im Filesystem-Browser wird der<br />

entsprechende Wizard gestartet.<br />

Abbildung 2.20:<br />

Mount eines CVS-Verzeichnisses in Netbeans<br />

Im ersten Schritt wird das Verzeichnis angegeben, unter dem alle CVS-Module<br />

kopiert werden sollen. Hier wird ein bereits bestehendes Verzeichnis erwartet, das<br />

aber auch über den Browser-Dialog direkt angelegt werden kann.<br />

Als nächsten Schritt müssen die Verbindungsparameter (CVSROOT) für den CVS-<br />

Server angegeben werden.


50<br />

Versions-/Releasemanagement-System<br />

Abbildung 2.21:<br />

CVSROOT konfigurieren in Netbeans<br />

Nachdem hier die schon bekannten Einträge aus der Umgebungsvariablen CVSROOT<br />

übernommen wurden, wird im nächsten Schritt das zu verwendende CVS-Kommandozeilen-Werkzeug<br />

angegeben. Netbeans geht davon aus, dass der entsprechende<br />

Client bereits auf dem System installiert worden ist und verwendet werden kann.<br />

Um nun eine neue Arbeitskopie aus dem Repository zu kopieren, ist im folgenden<br />

Dialog noch ein Haken zu setzen.<br />

Abbildung 2.22:<br />

Anlegen der Arbeitskopie


Kapitel 2 • Entwicklungsumgebungen 51<br />

Als letzter Schritt ist noch der Modulname einzugeben, der als Arbeitskopie<br />

erzeugt werden soll.<br />

Abbildung 2.23:<br />

Modulnamen auswählen<br />

Nach dem erfolgreichen Kopieren des CVS-Moduls in das lokale Arbeitsverzeichnis<br />

steht diese Arbeitskopie in Netbeans als normales Filesystem zur Verfügung.<br />

Zusätzlich werden an den Dateiknoten weitere Informationen angezeigt.<br />

Hierdurch kann direkt abgelesen werden, ob eine Datei beispielsweise lokal geändert<br />

worden ist oder ob nach dem Auschecken aus dem Repository noch keine<br />

Änderungen vorgenommen worden sind. Netbeans gleicht die Dateien in definierbaren<br />

Abständen mit dem CVS-Server ab und aktualisiert die angezeigten Informationen<br />

entsprechend. Netbeans ruft dafür das CVS-Kommando status auf.<br />

Dadurch ist es möglich, nicht nur lokale Veränderungen der Datei zu erkennen,<br />

sondern auch, ob bereits eine neuere Version von einem anderen Entwickler in<br />

das CVS-Repository eingecheckt worden ist.<br />

Bei der Arbeit mit Dateien, die in einem CVS-Server versioniert werden, sind<br />

eine Reihe von Dingen zu beachten. Durch die Möglichkeit der Entwickler, auf<br />

alle Dateien auch nicht exklusiv zugreifen zu können, ist es theoretisch denkbar,<br />

dass sich überschneidende Änderungen ergeben.<br />

Zur Verdeutlichung der generellen Arbeitsweise gehe ich im Folgenden davon<br />

aus, dass Entwickler A und Entwickler B gemeinsam an einem kleinen Software-<br />

Projekt arbeiten. Im ersten Schritt soll der Idealfall bei der Entwicklung aufgezeigt<br />

werden, im nächsten dann auf die möglichen Konflikte und deren Lösung<br />

eingegangen werden.<br />

Arbeiten mehrere Entwickler zugleich an ein und demselben CVS-Modul, ist die<br />

beste Möglichkeit, um Konflikte zu vermeiden, dass alle Entwickler klar voneinander<br />

getrennte Bereiche bearbeiten. Im Fall von Java-Projekten bieten sich für<br />

eine solche Aufteilung der Arbeitspakete die Aufteilung der Entwickler auf unterschiedliche<br />

Packages an. Allein durch diese Aufteilung werden in aller Regel die<br />

meisten Probleme mit überschneidenden Änderungen verhindert. Allerdings lassen<br />

sich in der Realität nicht alle Packages auch den einzelnen Arbeitspaketen


52<br />

Versions-/Releasemanagement-System<br />

zuordnen. Neben reinen Basisfunktionalitäten, die in allen Bereichen verwendet<br />

werden, ist es häufig auch notwendig, kleinere Änderungen an Klassen aus anderen<br />

Packages vorzunehmen.<br />

Nachdem dem Entwickler eine lokale Arbeitskopie zur Verfügung steht, wiederholen<br />

sich während der Arbeit die folgenden Arbeitsschritte:<br />

• Update des Moduls<br />

• Editieren ausgewählter Dateien<br />

• Commit des Moduls<br />

Im ersten Schritt wird die lokale Kopie des Entwicklers der des Repository angeglichen.<br />

Konkret werden alle Änderungen, die bereits von anderen Entwicklern<br />

an dem Modul vorgenommen und in das Repository übernommen worden sind, in<br />

die lokale Kopie übernommen. Sofern es sich um Änderungen in unabhängigen<br />

Bereichen der Dateien handelt, werden diese mit der lokalen Arbeitskopie zusammengeführt.<br />

Dieser Vorgang läuft automatisch ab und ist lediglich an den Ausgaben<br />

von CVS zu erkennen.<br />

Nach einem erfolgreichen Update liegen nun die neuesten Quellen aus dem Repository<br />

im lokalen Verzeichnis des Entwicklers. Jetzt können Sie mit der Arbeit an<br />

den Dateien beginnen. Sollten sich die Änderungen über einen größeren Zeitraum<br />

hinziehen, ohne dass man seine Änderungen als stabil in das Repository einpflegen<br />

möchte, können zwischendurch durch erneute Update-Vorgänge die neuesten<br />

Dateien der anderen Entwickler in das lokale Verzeichnis geholt werden.<br />

Sobald der Entwickler mit seinen Änderungen zufrieden ist, können diese wieder<br />

in das CVS-Repository als neue Version geschrieben werden. Zu diesem Zweck<br />

kann wahlweise das gesamte Modul oder nur Teilbereiche des Moduls über das<br />

CVS-Kommando Commit im Repository aktualisiert werden.<br />

Konflikte<br />

Der im vorangegangen Abschnitt dargestellte Arbeitsablauf mit Quelldateien in<br />

einem CVS-Repository stellt bisher den idealen Ablauf dar. In der Realität wird<br />

es allerdings ab und an zu Konflikten kommen, die nicht automatisch durch CVS<br />

behoben werden können. Konflikte können immer dann auftreten, wenn mindestens<br />

zwei Entwickler an ein und derselben Datei arbeiten.<br />

Angenommen, beide Entwickler holen sich ihre lokale Arbeitskopie zum gleichen<br />

Zeitpunkt aus dem Repository. Dadurch liegen beiden zu Beginn der Arbeit<br />

jeweils die aktuellen Versionen des Repository zur Bearbeitung vor. Beide beginnen<br />

mit der Arbeit an der gleichen Datei. Da der erste Entwickler nur eine sehr<br />

kleine Änderung einbaut, ist er mit der Arbeit an dieser Datei schneller fertig als<br />

der zweite Entwickler. Um die neue, geänderte Datei so schnell wie möglich den<br />

anderen Entwicklern zur Verfügung zu stellen, führt der erste Entwickler direkt<br />

nach seinen Änderungen ein CVS Commit auf der Datei aus.


Kapitel 2 • Entwicklungsumgebungen 53<br />

Der zweite Entwickler führt nun eine Reihe von Änderungen an derselben Datei<br />

aus, die mehr Zeit in Anspruch nehmen als die des ersten Entwicklers. Nachdem<br />

er seine Änderungen getestet hat, versucht er die nun geänderte Datei in das<br />

Repository zu schreiben. Das dazu gestartete CVS Commit-Kommando scheitert<br />

allerdings mit einer Fehlermeldung. Anhand der Fehlermeldung erkennt der Entwickler<br />

nun, dass sich die Version im Repository von der unterscheidet, auf der er<br />

seine Änderungen gemacht hat. Bevor ein Commit möglich ist, ist daher erst ein<br />

Update durchzuführen, um die neuen Änderungen aus dem Repository in die<br />

lokale Version zu übernehmen. Das CVS-Update führt nun die Datei im Repository<br />

mit der Datei im lokalen Verzeichnis des Entwicklers zusammen. Wichtig ist<br />

dabei, dass alle lokalen Änderungen beibehalten werden.<br />

Wurden nun von beiden Entwicklern Änderungen in den gleichen Bereichen der<br />

Datei vorgenommen, kommt es beim Update zu einem Konflikt. CVS weist in<br />

seiner Ausgabe durch eine Fehlermeldung auf diesen Konflikt hin und markiert<br />

die betreffenden Stellen in der Datei mit einem speziellen Kommentar der Form:<br />

>>>>><br />

Alter Text<br />

<br />

Da die gemachte Änderung nicht automatisch übernommen werden konnte, ist es<br />

nun die Aufgabe des Entwicklers, zu entscheiden, welche der Textpassagen die<br />

korrekte ist. Zu diesem Zweck ist es eventuell notwendig, sich mit dem Kollegen,<br />

der die Änderung vorgenommen hat, abzustimmen. Die Datei ist nun so zu<br />

ändern, dass nur noch die korrekte Textpassage vorkommt. Das Ergebnis wird<br />

dann über CVS Commit als neue Version in das Repository übernommen.<br />

2.3 Automatische Build-Umgebung<br />

Während der Entwicklung sind in den vorangegangenen Werkzeugen die unterschiedlichsten<br />

Aufgaben immer wieder zu wiederholen, um Teile der Anwendung<br />

zu testen. Für den Test einer Webanwendung mit Java Server Pages, an deren<br />

Komponenten mit mehreren Entwicklern über einen CVS-Server gearbeitet wird,<br />

sind zumindest folgende Schritte zum Testen auszuführen:<br />

1. CVS-Update auf die lokale Arbeitskopie (Änderungen anderer Entwickler)<br />

2. Übersetzen der Java-Klassen<br />

Sofern nur Teilbereiche der Anwendung getestet werden sollen, kann dies wie<br />

bereits beschrieben direkt in der Netbeans-Umgebung geschehen, sodass hierfür<br />

keine weiteren Arbeitsschritte notwendig sind.


54<br />

Automatische Build-Umgebung<br />

Sobald die komplette Anwendung in einer realen Server-Umgebung getestet werden<br />

soll, sind weitere Arbeitsschritte auszuführen. Für eine Webanwendung auf<br />

Basis des Java Servlets und Java Server Pages Containers Tomcat sind zusätzlich<br />

zu den genannten noch folgende Schritte notwendig:<br />

1. Erzeugen eines WAR-Archivs der Webanwendung<br />

2. Kopieren des Archivs in das webapps-Verzeichnis des Tomcat-Servers<br />

3. Neustart des Servers<br />

Dieser Vorgang wird im Allgemeinen als Deployment bezeichnet. Um eine Webanwendung<br />

auf dem Tomcat-Server zu deployen, wird eine so genannte WAR-<br />

Datei in ein spezielles Deployment-Verzeichnis des Servers kopiert. Alle WAR-<br />

Archive, die sich beim Start des Tomcat-Servers in diesem Verzeichnis befinden,<br />

werden automatisch als Anwendung deployed. Der Inhalt einer WAR-Datei ist<br />

durch die Sun J2EE-Spezifikation standardisiert. Wie bereits erwähnt, enthält die<br />

Datei mindestens die Datei web.xml. Hierbei handelt es sich um den so genannten<br />

Deployment Descriptor, aus dem der Tomcat-Server dann die Informationen über<br />

die Anwendung entnimmt.<br />

Ändert man nur einfache Klassen der Anwendung, ist es nicht unbedingt notwendig,<br />

die komplette Anwendung neu als WAR-Archiv zu deployen. Es reicht unter<br />

Umständen auch aus, einfach die neuen Klassen in das entsprechende Verzeichnis<br />

des Servers zu kopieren.<br />

Betrachtet man die notwendigen Arbeitsschritte, wird recht schnell die Frage aufkommen,<br />

wie sich diese weitestgehend automatisieren lassen können. Als eine<br />

erste, naheliegende Lösung kommt der Einsatz einer einfachen Batch-Datei<br />

infrage. Alle notwendigen Schritte könnten hier in einem Script zusammengefasst<br />

werden. Einer der Nachteile eines solchen Vorgehens ist, dass man sich auf eine<br />

Plattform festlegen oder aber direkt verschiedene Plattformen durch unterschiedliche<br />

Scripts unterstützen muss.<br />

Aus diesem Grund existieren gerade für die Entwicklung von Software verschiedenste<br />

Werkzeuge für die Automatisierung solcher Aufgaben. Das wohl bekannteste<br />

und in der Open Source-Gemeinde am häufigsten genutzte Werkzeug ist<br />

Make oder Gnu Make. Das Werkzeug findet sich allerdings fast hauptsächlich in<br />

Open Source-Projekten in C/C++. Auch kommerzielle C/C++-Entwicklungsumgebungen<br />

verwenden Make oder Make-ähnliche Werkzeuge als Grundlage.<br />

Im Bereich von Open Source Java-Projekten findet sich dagegen vermehrt ANT<br />

anstelle von Make. Bei ANT handelt es sich wieder um ein Teilprojekt des Apache<br />

Jakarta-Projektes und es ist wie die anderen Teilprojekte dort zu 100% in Java<br />

implementiert.<br />

Wie bereits bei Make wird pro Projekt eine Steuerdatei erstellt, die das eigentliche<br />

Script enthält. In dieser Steuerdatei oder auch Build-Datei werden die Arbeitsschritte<br />

und deren Abhängigkeiten mithilfe einer XML-Syntax beschrieben.


Kapitel 2 • Entwicklungsumgebungen 55<br />

Durch die Verwendung von Java und XML sind die Scripts auf allen Plattformen<br />

ausführbar, auf denen Java verfügbar ist. Entwickler, die auf unterschiedlichen<br />

Plattformen entwickeln, können trotzdem die gleiche Arbeitsweise verwenden<br />

und für den automatisierten Prozess ANT einsetzen.<br />

Wie in Make auch, können den Arbeitsschritten innerhalb eines Projektes Abhängigkeiten<br />

zugewiesen werden. Ein Beispiel wäre, das WAR-Archiv erst zu erstellen,<br />

wenn die neuesten Klassen erzeugt worden sind. Tritt bei der Erzeugung der<br />

Klassen nun ein Fehler auf, wird auch der davon abhängige Arbeitsschritt nicht<br />

mehr ausgeführt, sondern eine Fehlermeldung ausgegeben.<br />

Die bereits vorhandenen Funktionalitäten von ANT können über eine Java API<br />

auf einfache Weise erweitert werden. Diese Schnittstelle wird immer mehr auch<br />

von Anbietern kommerzieller Applikationsserver benutzt, um den Deploymentvorgang<br />

auf Ihrem Server mit ANT zu ermöglichen. Arbeiten, für die normalerweise<br />

eine grafische Oberfläche des Anbieters verwendet werden muss, sind dann<br />

direkt in die ANT-Scripts einbaubar.<br />

Doch nicht nur kommerzielle Anbieter erweitern auf diesem Weg ANT. Es<br />

finden sich immer wieder Entwickler, die Erweiterungen für ANT ebenfalls als<br />

Open Source anbieten. Sollte sich eine benötigte Funktion dennoch nicht finden<br />

und möchte man diese auch nicht selber herstellen, kann zur Not auch aus<br />

einem ANT-Script eine externe Anwendung über das Betriebssystem gestartet<br />

werden.<br />

2.3.1 ANT-Syntax<br />

Beim Starten versucht ANT das zu verwendende ANT-Script im aktuellen Verzeichnis<br />

zu finden. Sofern nicht beim Start eine andere Datei als Script angegeben<br />

worden ist, wird nach einer Datei mit dem Namen build.xml gesucht. Sollte diese<br />

nicht vorhanden sein, kann ANT über einen Startparameter veranlasst werden, die<br />

Datei auch in den übergeordneten Verzeichnissen zu suchen. In diesem Fall werden<br />

bis zum Hauptverzeichnis alle Verzeichnisse nach der Datei durchsucht.<br />

Listing 2.7:<br />

Einfaches ANT-Script<br />

<br />

<br />

<br />

<br />

<br />

<br />


56<br />

Automatische Build-Umgebung<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Jedes ANT-Script enthält genau einen project-Tag, der als Attribut den Namen<br />

des Projektes und das Basisverzeichnis enthält. Unterhalb dieses Tags liegen die<br />

verschiedenen Arbeitsschritte in Form von target-Tags. Zusätzlich können innerhalb<br />

eines ANT-Scripts auch Variablen mit Werten belegt werden. Dazu dient der<br />

property-Tag. Die so definierten Properties können an beliebiger Stelle als Platzhalter<br />

eingesetzt werden. Zur Laufzeit werden die entsprechenden Stellen dann<br />

mit den aktuellen Werten der Variablen ersetzt.<br />

Wie im Beispiel zu sehen, werden die so definierten Variablen über eine spezielle<br />

Syntax referenziert, angefangen mit dem $-Zeichen und eingeschlossen in<br />

geschweiften Klammern (${propertyname}).<br />

Einzelne Aufgaben werden in ANT-Scripts auf so genannte Targets verteilt. Beim<br />

Ausführen des Scripts können diese dann direkt aufgerufen werden. Wie auch in<br />

Make-Scripts üblich, bestehen zwischen den Targets Abhängigkeiten. Sobald ein<br />

Target von einem anderen abhängt, wird das entsprechende Target zuerst ausgeführt.<br />

Im oben gezeigten Beispiel-Script ist es für das Ausführen des Targets compile<br />

notwendig, das Ausgabeverzeichnis über das Target init zu erzeugen.<br />

<br />

Innerhalb der Targets werden die eigentlichen Aufgaben (task) ausgeführt. Als<br />

Teil der ANT-Umgebung finden sich bereits eine Vielzahl von vordefinierten<br />

Tasks. Zusätzlich existieren eine Reihe von optionalen Tasks, die für speziellere<br />

Aufgaben entwickelt worden sind. Werden für ganz spezifische Aufgaben in<br />

einem Projekt neue Funktionalitäten benötigt, können zu diesem Zweck neue<br />

ANT-Targets entwickelt werden. Es ist möglich, jederzeit über das ANT-Target<br />

exec eine externe Anwendung aufzurufen und dadurch Funktionalitäten zu verwenden,<br />

die nicht über ANT direkt verfügbar sind. Da man sich dadurch allerdings<br />

für eine spezielle Umgebung festlegt, sollte darauf weitestgehend verzichtet<br />

werden. Möchte man die ANT-Scripts möglichst unabhängig vom Betriebssystem<br />

halten, sollte in solchen Fällen lieber eine eigene ANT-Task in Java realisiert werden.


Kapitel 2 • Entwicklungsumgebungen 57<br />

Bei der Arbeit mit Dateien, die sich in stark verschachtelten Verzeichnissen befinden,<br />

bietet ANT einen sehr flexiblen und mächtigen Mechanismus. Über so<br />

genannte FileSet-Strukturen können Muster auf Verzeichnisse angewandt werden.<br />

Sollen beispielsweise alle Dateien mit der Endung .xml in eine Jar-Datei aufgenommen<br />

werden, die irgendwo unterhalb eines Verzeichnisses liegen, kann die<br />

folgende Task verwendet werden. Die Datei web.xml, die sich ebenfalls in einem<br />

Unterverzeichnis befindet, soll nicht mit in das Archiv aufgenommen werden.<br />

Listing 2.8:<br />

Anwenden von FileSet-Strukturen zur Dateiauswahl<br />

<br />

<br />

<br />

<br />

<br />

<br />

FileSets können in nahezu allen Tasks verwendet werden, um die Dateien auszuwählen.<br />

Bei der Definition der Suchmuster in den eingebetteten include/exclude-<br />

Tags ist wieder eine spezielle Syntax verwendet worden, um beliebige Unterverzeichnisse<br />

einzuschließen. Beim Auswerten der Muster werden die doppelten<br />

Sternchen (**) mit allen Unterverzeichnissen ersetzt. Im konkreten Beispielmuster<br />

werden daher alle Dateien in das Archiv aufgenommen, die die Endung .xml<br />

haben und die sich in irgendeinem Unterverzeichnis von ${xml.dir} befinden.<br />

Ausgenommen davon ist lediglich die Datei web.xml, die sich in einem Unterverzeichnis<br />

von ${xml.dir}/webapps befindet.<br />

2.3.2 Installation und Verwendung<br />

Nach dem Download des Archivs von der Jakarta-Webseite (http://jakarta.apache.org/ant)<br />

kann der Inhalt in ein beliebiges Verzeichnis ausgepackt werden.<br />

ANT besteht zum einen aus einer Reihe von Java-Archiven mit den ANT-Klassen<br />

und den Standard-Targets. Daneben liegen im bin-Verzeichnis noch einige Startscripts<br />

für verschiedene Plattformen. Aufgabe dieser Scripts ist das Setzen der<br />

richtigen Umgebungsvariablen wie JAVA_HOME und CLASSPATH für ANT. Um auf<br />

diese Dateien zugreifen zu können, sollte das Verzeichnis in den allgemeinen<br />

Suchpfad aufgenommen werden. Dazu ist die PATH-Umgebungsvariable unter<br />

Windows um dieses Verzeichnis zu erweitern.<br />

Unter Windows dient dann das Batch-Script %ANT.Verzeichnis%\bin\ant.bat<br />

zum Starten von ANT. Nach erfolgreicher Installation und Anpassung der PATH-<br />

Variablen liefert das folgende Kommando die aktuelle ANT-Version:<br />

C:\ ant –version<br />

Ant version 1.4.1 compiled on November 20 2001<br />

C:\


58<br />

Automatische Build-Umgebung<br />

Um ein ANT-Script auszuführen, wird zunächst in das Projektverzeichnis<br />

gewechselt, in dem sich die Datei build.xml befindet. Mit dem folgenden Kommando<br />

wird nun ANT gestartet und das Default-Target wie im project-Tag definiert<br />

ausgeführt.<br />

C:\develop\projekt1> ant<br />

Soll explizit ein spezielles Target ausgeführt werden, kann der Name an das<br />

Batch-Script als Parameter übergeben werden. Idealerweise existieren in allen<br />

Build-Scripts, die in einem Projektteam verwendet werden, eine Reihe von Standard-Targets.<br />

Kandidaten für solche Standards sind zum Beispiel das Target<br />

clean, um die Ergebnisse vorangegangener Build-Vorgänge komplett zu löschen.<br />

Auch compile zum Übersetzen der Quelldateien und jar zum Erstellen eines Java-<br />

Archivs sind gängige Targets, die sich häufig in ANT-Scripts finden.<br />

Während die einzelnen Arbeitsschritte abgearbeitet werden, erzeugt ANT eine<br />

Reihe von Ausgaben, die über den Fortschritt innerhalb des Scripts informieren.<br />

Treten während eines Arbeitsschrittes Fehler auf, so wird der Build-Prozess an<br />

dieser Stelle unterbrochen und eine entsprechende Fehlermeldung ausgegeben.<br />

Diese Fehlermeldung stammt in der Regel von der ausgeführten Task. Werden<br />

beispielsweise über die Task javac die Java-Quelldateien übersetzt und treten<br />

dabei Syntaxfehler auf, werden die jeweiligen Java-Compilerfehler ausgegeben.<br />

Anschließend wird die Verarbeitung des Scripts abgebrochen.<br />

2.3.3 Integration in IDE-Umgebungen<br />

Als einer der Vorteile, die für die Verwendung von ANT spricht, ist die Plattformunabhängigkeit<br />

der Scripts. Ein weiterer Vorteil ergibt sich aus der Tatsache, dass<br />

mit dem Build-Script für ANT für jeden Entwickler eines Teams eine Umgebung<br />

zur Verfügung steht, mit der alle notwendigen Arbeitsschritte vorgenommen werden<br />

können. Es ist also nicht vorgegeben, welche integrierte Entwicklungsumgebung<br />

im Team eingesetzt werden muss. Jeder Entwickler kann zur Entwicklung<br />

jedes beliebige Werkzeug verwenden, solange das ANT-Script für die darin definierten<br />

Prozesse genutzt wird.<br />

Zudem ist es dadurch auch möglich, einfache Texteditoren für die Entwicklung zu<br />

verwenden, die keine Integration der Java SDK-Werkzeuge bieten. Die hier<br />

besprochenen integrierten Entwicklungsumgebungen JEdit und Netbeans verfügen<br />

über eine sehr komfortable Integration von ANT Build-Scripts. Für beide<br />

Umgebungen existieren Erweiterungen, die ANT-Scripts lesen und ausführen<br />

können. Die Verwendung ist in beiden Werkzeugen recht ähnlich. Zum Erstellen<br />

von ANT-Scripts bietet jEdit zudem noch eine Reihe von nützlichen Werkzeugen<br />

wie etwa das automatische Vervollständigen von Tagnamen und das dialoggestützte<br />

Eingeben von Attributen der Tags. Dieser Dialog ist immer dann hilfreich,<br />

wenn man sich beim Erstellen eines Scripts nicht mehr sicher ist, welche Attribute<br />

eines Tags zwingend sind und welche nur optional.


Kapitel 2 • Entwicklungsumgebungen 59<br />

In JEdit werden ANT-Scripts über das Plug-In AntFarm integriert. Wie auch die<br />

anderen Plug-Ins lässt sich AntFarm an beliebiger Stelle in die grafische Oberfläche<br />

integrieren. Da kein direkter Bezug zu einem Projekt in JEdit besteht, werden<br />

im AntFarm-Plug-In immer alle ihm bekannten ANT-Scripts angezeigt. Wird die<br />

Zahl der Scripts zu hoch, wird die Sache dadurch etwas unübersichtlich. Bei einer<br />

überschaubaren Anzahl von Scripts kann das aber auch von Vorteil sein, da man<br />

nicht mehr zwischen Projekten wechseln muss, um mal eben eine andere Anwendung<br />

zu compilen. Grundätzlich wäre aber eine etwas bessere Unterteilung der<br />

Anzeige dieses Plug-Ins wünschenswert.<br />

Abbildung 2.24:<br />

ANT-Integration in JEdit<br />

Das AntFarm-Plug-In markiert das Default-Target eines Build-Scripts anhand<br />

eines grünen Häkchen. Zum Ausführen ist es ausreichend, den entsprechenden<br />

Knoten in der Baumansicht auszuwählen und doppelt anzuklicken. Wird ANT<br />

zum ersten Mal aus dem Plug-In gestartet, hat man noch die Wahl zu entscheiden,<br />

ob ANT als externer Prozess über die bereits erwähnte Batch-Datei gestartet werden<br />

soll oder innerhalb der JVM von JEdit. Leider werden aber gerade im zweiten<br />

Fall die Muster von FileSet-Tags nicht korrekt ausgewertet, was unter Umständen


60<br />

Automatische Build-Umgebung<br />

zu seltsamen Ergebnissen führen kann. Die Ausgaben von ANT werden in der<br />

Konsole angezeigt. Hier zeigt sich auch gleich noch ein interessanter Aspekt der<br />

Plug-In-Architektur von JEdit. Da es sich bei der Konsole ebenfalls um ein Plug-<br />

In handelt, ist es möglich, zwischen den Plug-Ins Informationen auszutauschen.<br />

Plug-Ins haben also nicht nur Zugriff auf die Basiskomponenten von JEdit, sondern<br />

sind auch in der Lage, Funktionalitäten bereits installierter Plug-Ins zu verwenden<br />

und damit eventuell zu erweitern.<br />

Treten während der Abarbeitung des Scripts Fehler auf, erscheinen diese wiederum<br />

in der ErrorList. Je nach Fehlertyp lässt sich von dort über einen Doppelklick auf die<br />

Fehlermeldung direkt an die fehlerhafte Stelle in der Quelldatei springen.<br />

Wie bereits erwähnt, bietet JEdit noch ein weiteres nützliches Werkzeug für die<br />

Arbeit mit ANT-Scripts. Während der Erstellung einer build.xml-Datei können<br />

die eingegebenen Tags automatisch erweitert oder die Attribute über einen Eingabedialog<br />

besetzt werden. Die Unterstützung geht sogar so weit, dass Tags automatisch<br />

geschlossen werden, sobald der Beginn eines Ende-Tags (


Kapitel 2 • Entwicklungsumgebungen 61<br />

Abbildung 2.26:<br />

Tag-Dialog in JEdit mit vorbelegter Auswahl für refid-Attribut<br />

In Abbildung 2.26 wird der Editor für den Tag path angezeigt. Im oberen Teil sind<br />

alle definierten Attribute zu sehen inklusive des XML-Typen. Das Attribut refid<br />

dient dazu, einen definierten Pfad oder ein FileSet über dessen ID zu referenzieren.<br />

Hier werden bereits alle definierten IDs in der Auswahlliste angezeigt. Eine<br />

Eingabe ist hier nicht mehr notwendig. Im unteren Teil des Dialogs sieht man<br />

direkt den resultierenden Tag, wie er in das Build-Script eingefügt wird.<br />

Für die Integration in Netbeans steht ein Modul zur Verfügung, das bereits in der<br />

Standardinstallation vorhanden ist. Sobald die Datei build.xml in einem Filesystem<br />

erkannt wird, wird diese direkt als ANT-Script behandelt und bekommt ein<br />

besonderes Icon in der Baumansicht. Beim Aufklappen des Knotens werden die<br />

enthaltenen Elemente der Build-Datei angezeigt. Im Gegensatz zum AntFarm-<br />

Plug-In von JEdit werden nicht nur die ausführbaren ANT-Targets angezeigt, sondern<br />

einfach alle vorhandenen Knoten unterhalb des project-Knotens. Grundsätzlich<br />

wird die Datei wie eine beliebige XML-Datei mit all ihren Knoten als Baum<br />

dargestellt. In der Baumansicht können die einzelnen Elemente auch editiert werden.<br />

Soll beispielsweise ein Attribut eines Knotens angepasst werden, kann dieser<br />

direkt im Baum ausgewählt und über das Kontextmenü der Eigenschafteneditor<br />

gestartet werden.


62<br />

Fazit<br />

Abbildung 2.27:<br />

Editor für Tag-Attribute<br />

2.4 Fazit<br />

Allerdings werden über diesen Weg nicht wie in jEdit die zwingend notwendigen<br />

Attribute besonders hervorgehoben. Für das schnelle Erstellen von ANT-Scripts<br />

erscheint mir dieser Weg daher auch etwas zu umständlich. Hier ist die Unterstützung<br />

in jEdit eher eine Hilfe bei der Erstellung.<br />

Gestartet werden die ANT-Targets wie bereits in jEdit durch einen Doppelklick in<br />

der Baumansicht. Auch die Ausgaben von ANT werden in einem separaten Fenster<br />

angezeigt, von dem im Fehlerfall direkt an die Fehlerstelle gesprungen werden<br />

kann. Da ANT innerhalb der Java VM von Netbeans gestartet wird und nicht wie<br />

bei jEdit in einem externen Prozess, sind die Antwortzeiten in Netbeans spürbar<br />

besser.<br />

Gerade im Bereich der Entwicklungsumgebungen finden sich sehr ausgereifte<br />

Open Source-Produkte, die zum Teil mehr als eine Alternative zu kommerziellen<br />

Umgebungen darstellen. Gerade Netbeans wartet mit einer Fülle an Funktionalitäten<br />

und möglichen Erweiterungen auf, die man so nur schwer in einem kommerziellen<br />

Werkzeug finden wird. Ein weiterer Vorteil von Netbeans ist zum<br />

einen die Erweiterbarkeit auf die eigenen Anforderungen, zum anderen aber auch<br />

die Möglichkeit, Netbeans als Basis für eigene Anwendungen zu verwenden.<br />

Durch die Kombination der einzelnen freien Werkzeuge wie etwa Netbeans, CVS<br />

und Tomcat erhält man eine sehr durchgängige und leistungsfähige Umgebung,<br />

die stark an die eigenen Systeme angepasst werden kann.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!