Bei all der Vielfalt der Möglichkeiten, die eine IDE wie NetBeans bietet, sollte sie auch in der Lage sein, die Entwicklung eines einfachen, ausführbaren Programms ohne nennenswerte Logik mit überschaubarem Aufwand zu unterstützen. Anhand einer solchen einfachen Anwendung soll nun ein grundsätzlicher Einstieg in die Entwicklung von Java SE-Anwendungen mit der IDE erfolgen.
Für die Entwicklung von Java SE - Anwendungen (d.h. Anwendungen, die auf der Java Standard Edition basieren), bietet NetBeans insgesamt fünf versschiedene Projekttypen an, die sich teilweise nur in Details unterscheiden:
![]() |
Als minimales Beispiel soll eine Anwendung erzeugt werden, die die System-Properties der Java-Umgebung, erreichbar über System.getProperties(), liest und zeilenweise ausschreibt.
Über "File" -> "New Project" -> "Java" -> "Java Application" aufgerufen, startet der Assistent zur Erstellung einer neuen ausführbaren Java-Anwendung...
![]() |
... in dem die Felder folgende Bedeutung haben:
Die IDE ist darauf ausgelegt, parallel mehrere Java-Projekte geöffnet zu haben und zu bearbeiten (was in der Regel der Fall sein wird, da es sich anbietet, häufig und durch mehrere Anwendungen genutzten Code in separate Bibliotheks-Projekte auszulagern). In solch einem Fall läßt sich via Set Main Project ein "Hauptprojekt" markieren, welches ausgeführt wird, wenn in der IDE
![]() |
Über "Finish" beendet, erzeugt und öffnet die IDE das Projekt in der Oberfläche. Es zeigt sich:
![]() |
![]() |
![]() |
Über "Run" - > "Run Main Project" (oder den Hotkey F6) läßt sich die Anwendung bereits ausführen. Wenngleich "demo.proplist" bislang noch nichts tut, läßt sich auf diese Weise bereits im 'Output'-Bereich beobachten, wie die IDE arbeitet:
![]() |
Angesichts der geringen Komplexität des Beispielprojektes läge es nahe, den entsprechenden Code einfach in die automatisch generierte main(...)-Methode zu schreiben; um jedoch ein wenig mehr mit der IDE zu arbeiten, soll eine Hilfsklasse PropDumper erzeugt werden, die über eine statische Methode 'dumpProps(Properties props)' ein beliebiges Properties-Objekt in ausgabefähigen String umwandeln können soll.
Um eine neue Klasse im einem Java-Projekt zu erzeugen, existieren mehrere Wege: Zum einen kann über "File" -> "New File..." (oder alternativ "New File" über das Kontextmenu des 'Projects'-Fensters) der allgemeine Assistent zum Erzeugen neuer Objekte aufgerufen werden, bei dem sich die 'Java Class' in der Rubrik 'Java' findet:
![]() |
Alternativ bietet das Kontextmenu in 'Projects', so ein Eintrag (Paket, Klasse, ...) innerhalb eines Java-Projektes selektiert ist, auch die Möglichkeit, eine Java-Klasse direkt per "New..." -> "Java Class" zu erzeugen,...
![]() |
..., was im Grunde genommen nur die Typ-Auswahl des vorangegangenen Schrittes überspringt:
![]() |
Ruft man den Assistenten per Rechtsklick auf ein Java-Package in 'Projects' auf, wird dessen Name ins Feld Package übernommen; ansonsten obliegt es dem Entwickler, erzeugte Klassen nach Möglichkeit in einer sinnvollen Paket-Hierarchie unterzubringen. Nach Abschluß mit "Finish" öffnet NetBeans die neu erzeugte, leere Klasse im Editor, in die folgender Code kopiert werden soll:
public static String dumpProps(Properties props)
{
String value="";
for (Object key: props.keySet())
{
value=value+key+" : "+props.getProperty((String)key)+"\n";
}
return value;
}
Im Ergebnis zeigen sich danach zwei Erkenntnisse: Zum einen ist der per Copy&Paste eingefügte Code nur grob formatiert und, was aber allenfalls ein ästhetisches Problem ist. Zum anderen zeigen rote Marken im Editor-Fenster, daß die Klasse in dieser Form sich nicht kompilieren lassen wird, da das Symbol 'Properties' noch nicht bekannt ist.
![]() |
Der NetBeans-Editor hilft schnell, diese Probleme zu beseitigen: <ALT>+<SHIFT>+<F> 'reformatiert' den Code der Klasse und sorgt dafür, daß Methodendefinitionen, Klammerung etc. einheitlich und lesbar ausgerichtet werden. <CTRL>+<SHIFT>+<I> organisiert die 'import'-Statements in der Klasse, sorgt hier also dafür, daß java.util.Properties importiert wird:
![]() |
Nach dieser Behandlung ist die Klasse PropDumper fehlerfrei, kann die Anwendung fertiggestellt werden durch Einfügen des entsprechenden Code-Segments in die main(...)-Funktion der Main-Klasse:
System.out.println(PropDumper.dumpProps(System.getProperties()));
Nach einer erneuten Ausführung des Projektes zeigt folglich auch das 'Output'-Fenster mehr Aktivität:
![]() |
Somit ist das erste Projekt, wenn auch mit minimaler Funktion, fertiggestellt, läßt sich kompilieren und ausführen - zumindest von innerhalb der IDE. Einer der großen Vorteile von NetBeans besteht jedoch darin, daß der Build von Java-Projekten auch intern unter Verwendung von ant geschieht, mithin die Projekte notfalls auch ohne NetBeans übersetzt, ausgeführt oder deployed werden können (insbesondere im Falle von Java EE - Entwicklung ein enorm nützliches Feature, wenn man jemals in die Situation kommt, Anwendungen auf dem eigenen Entwicklungs-System mittels SSH oder Telnet aus der Ferne korrigieren und neu starten zu müssen).
Um diesen Mechanismus zu untersuchen, lohnt ein Blick in das Projektverzeichnis im Dateisystem, wahlweise über das 'Files'-Window oder einen File-Manager:
![]() |
build.xml ist das ant-Skript, mit dessen Hilfe das Projekt übersetzt, verpackt, ausgeführt werden kann, wobei build.xml selbst im Wesentlichen auf der NetBeans-Projektkonfiguration im Ordner nbproject/ basiert und ein Set von ant-targets bietet, um mit dem Projekt auch ohne die IDE arbeiten zu können:
![]() |
Über ant run läßt sich die Applikation ausführen, gegeben, daß eine Klasse mit main(...)-Funktion vorhanden ist,...
![]() |
... und über ant jar, das Default-Target, wird das Projekt übersetzt, in eine .jar-Datei (<projektname>.jar) verpackt und im Unterverzeichnis dist/ eine Struktur erzeugt, auf deren Basis die Anwendung auf andere Systeme verteilbar ist:
Die verpackte Anwendung in dist/ läßt sich danach wie gewohnt starten:
![]() |
| js3-03-runbutton.jpg | ![]() |
1642 bytes |
| jse-01-types.jpg | ![]() |
26973 bytes |
| jse-02-newproject.jpg | ![]() |
44829 bytes |
| jse-04-openedproject.jpg | ![]() |
196229 bytes |
| jse-05-fileproject.jpg | ![]() |
119396 bytes |
| jse-06-navimembers.jpg | ![]() |
20993 bytes |
| jse-07-output.jpg | ![]() |
24553 bytes |
| jse-08-classnew-1.jpg | ![]() |
110008 bytes |
| jse-09-classnew-2.jpg | ![]() |
62291 bytes |
| jse-10-classnew-3.jpg | ![]() |
60199 bytes |
| jse-11-codeedit.jpg | ![]() |
135610 bytes |
| jse-12-classfixed.jpg | ![]() |
63127 bytes |
| jse-13-run1.jpg | ![]() |
71029 bytes |
| jse-14-projectfolder.jpg | ![]() |
77957 bytes |
| jse-15-antrun-1.jpg | ![]() |
93336 bytes |
| jse-16-antrun-2.jpg | ![]() |
79997 bytes |
| jse17-jar-run.jpg | ![]() |
138573 bytes |