Wir erklären, die Verzeichnisstruktur von Java-Projekten, erklären und wie Sie Pakete für ein Lernprojekt einsetzen. Das Erstellen eines Projekts mit dem Build-Tool Apache Maven wird erläutert und wir zeigen, wie man mit Maven JavaFX-Projekte erstellt.
Java-Programme werden üblicherweise in Form eines Projekts organisiert. In einer IDE (Integrated Development Environment) starten Sie, indem Sie ein neues Java Projekt erstellen und nicht eine einzelne Datei.
Für unser Beispiel verwenden wir Visual Studio Code. Die Vorgehensweise und der Aufbau eines Projekts ist aber in anderen IDEs ähnlich.
Ein Projekt kann ohne oder mit Hilfe von Build-Tools erstellt werden.
Ohne Build-Tools
Das neue Projekt enthält zunächst drei Verzeichnisse:
.vscode
: hier werden Konfigurations-Dateien für das Projekt abgelegtlib
: Libraries, enthält zusätzliche Bibliotheken, das Verzeichnis ist erst einmal leersrc
: Source, hier befinden sich die Quellcode-Dateien (mit der Dateiendung .java). Bereits erstellt ist die Datei „App.java“ mit einem Beispiel-Programm.
Startet man die App.java, wird ein weiteres Verzeichnis bin
angelegt, das das kompilierte Programm „App.class“ enthält.
Neue Quellcode-Dateien werden im Verzeichnis src
gespeichert. Wichtig ist, es darf immer nur eine Datei geben, die die main-Methode enthält. Sie ist der Startpunkt des Programms. Die übrigen Dateien enthalten häufig Klassen oder Interfaces.
Hilfe beim Anlegen neuer Projekt-Dateien erhalten Sie mit der Projekt-Verwaltung links unten in der Seitenleiste. Ein Klick auf das Plus-Symbol neben dem Ordner src
öffnet eine Auswahl von Optionen. Wählt man z.B. „Class“, wird eine neue Datei mit der entsprechenden Grundstruktur erstellt.
Das eigentliche Java-Programm wird immer aus der Datei mit der main-Methode kompiliert und gestartet. Die übrigen Dateien im Verzeichnis src
werden bei Bedarf automatisch integriert.
Im Gegensatz dazu müssen zusätzliche Bibliotheken explizit mit Hilfe der Anweisung import
eingebunden werden.
Pakete
Innerhalb des src
Verzeichnisses kann der Code in sogenannten Paketen organisiert werden. Dateien, die sich in einem Paket befinden, werden nicht automatisch eingebunden, sie benötigen import
.
Für den Namen des Pakets ist es üblich, die Domain des Herstellers in umgekehrter Reihenfolge zu verwenden. Also z.B. für die Domain „zoom-in.info“ wäre der Paketname „info.zoomin“ (der Bindestrich im Namen ist nicht zulässig). Das ist aber nur wichtig für Programme, die auch veröffentlicht werden sollen. Ansonsten kann man den Namen frei wählen, bis auf einige Vorgaben für die Schreibweise.
Grundsätzlich sind die Pakete eine Art „geschlossenes System“. Die Dateien im Paket können daher durchaus den gleichen Namen tragen, wie die in einem anderen Paket.
Möchte man innerhalb eines Pakets Dateien aus einem anderen Paket einbinden, geschieht dies mit der import
-Anweisung. Gibt es dabei gleich lautende Dateinamen in den Paketen, muss der Name des Pakets vorangestellt werden, z.B.
System.out.println(m1_11.HiddenStory.giveNewStory())
also
<Paketname><Klassenname><Methode>
wenn im aktuellen Paket ebenfalls eine Klasse „HiddenStory“ vorhanden ist.
Lernprojekt
Innerhalb eines Pakets kann man auch vollständige Programme, mit einer Datei mit zusätzlicher main-Methode einrichten. So können Sie beispielsweise für einen Programmierkurs ein Projekt für eine Lerneinheit erstellen und darin für jede zu lösende Aufgabe ein Paket mit jeweils eigener main-Methode.
Mit Build-Tools
Ein Build-Tool ist ein Dienstprogramm, das den Prozess der Erstellung einer ausführbaren Anwendung automatisiert.
Das Tool kümmert sich u.a. um
- den Download und die Verwaltung der erforderlichen Bibliotheken,
- das Kompilieren des Quellcodes zu Bytecode
- die Paketierung des Codes
- die Durchführung von Tests
- die Bereitstellung für das Produktivsystem
Für kleinere Projekte kann man all dies von Hand erledigen, für größere aber nicht mehr.
Bekannte Build-Tools für Java sind beispielsweise
- Maven
- Gradle
Grundsätzlich ist die Funktionsweise der Tools ähnlich. Für unser Beispiel verwenden wir Maven.
Ein Maven Projekt erstellen
In dem „Extension-Pack for Java“ ist auch die Erweiterung für Maven enthalten. Damit kann man Maven nutzen, ohne es selbst auf dem Computer installieren zu müssen.
Wie gewohnt wählen Sie über die Command-Palette (Strg + Shift + P) „Create Java Project“ und anschließend „Maven“ und dann „No Archetype“. Damit wird eine Verzeichnis-Struktur erstellt mit den Hauptverzeichnissen src
und target
.
Die Datei mit der main-Methode heißt in diesem Maven-Projekt Main.java – nicht App.java – und befindet sich bereits in einem Paket, im Beispiel im Paket zoomin
.
Ganz oben finden Sie die Datei pom.xml
(POM: Project Object Model). Sie enthält Informationen über das Projekt und Details zu Konfiguration.
In ihrer einfachsten Form enthält sie Angaben zum Projekt und die zu verwendende Java-Version im Abschnitt <properties>
, hier 22..
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>info.zoomin</groupId>
<artifactId>modul_1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
</properties>
</project>
Die Datei können Sie bearbeiten und z.B. die Java-Version verändern. Insbesondere legen Sie aber hier fest, welche Bibliotheken eingebunden werden sollen. Maven kümmert sich dann automatisch um den Download.
Archtypes
Beim Einrichten des neuen Maven-Projekts können Sie statt der Basic-Variante – wie oben – einen Archetype nutzen. Ein Archetype ist eine Art Projekt-Vorlage, die es für unterschiedliche Anforderungen gibt.
Einen guten Überblick über eine umfangreiche Strukturierung eines Projekts erhalten Sie mit dem Archetype „maven-archetype-quickstart“.
Es gibt besondere Archetype-Varianten, die eine Vorlage für spezielle Projekte liefern. So gibt es z.B. Varianten für WebApps oder grafische Benutzeroberflächen. Sehr hilfreich ist ein solcher Archetype für JavaFX.
Ein JavaFX-Projekt mit Maven erstellen
Um ein neues JavaFX-Projekt mit Maven zu beginnen, gibt es zwei Wege:
- mit dem von Maven zur Verfügung gestellten Archetype für JavaFX
- mit einem Archetype eines anderen Anbieters, der in das Maven-Projekt eingebunden wird.
Maven-Archetype
In der Command-Palette „select the project type“ wählen Sie nicht „Maven“, sondern scrollen weiter nach unten zum Eintrag „JavaFX“ und wählen diesen aus.
Anschließend bestimmen Sie ein Verzeichnis für das Projekt und vergeben Paketnamen und Projektnamen. Dann öffnet sich der Terminal-Bereich von VSCode in dem Informationen zum Projekt angezeigt werden und in dem Sie verschiedene Angaben machen müssen.
- die Version „1.0 Snapshot“: das können Sie so mit „Enter“ bestätigen
- javafx version: 13: aktuell ist Version 21.0.1 (Stand April 2024), geben Sie „n“ ein.
Damit startet die Abfrage erneut und javafx version
lässt sich anpassen.
Hinweis: auf einem Mac mit M1-Chip oder höher, muss mindestens JavaFX 19 gewählt werden.
Ein Info-Fenster zeigt die erfolgreiche Fertigstellung des Projekts an.
Die Programm-Datei „App.java“ befindet sich für unser Beispiel im Verzeichnis src > main > java > info.zoomin
. Sie können das Programm direkt starten und erhalten dieses Fenster:
„Problems“
Im Quelltext von App.java ist der Klassen-Name „Stage“ orange unterstrichen (je nach gewähltem Farbschema), auch die Verzeichnisse und die App erscheinen in dieser Farbe.
Dies signalisiert einen Warnhinweis. Im Terminal-Bereich unter dem Tab „Problems“ wird die zugehörige Meldung gezeigt:
The type Stage from module javafx.graphics may not be accessible to clients due to missing 'requires transitive'
Um das Problem zu beheben, ergänzen Sie die Datei module-info.java
in Zeile 2:
requires transitive javafx.controls;
Nach dem Speichern der Datei sollte die Meldung verschwunden sein:
FXML
Der Maven Archetype für JavaFX setzt FXML ein. FXML ist ein Dateiformat, das JavaFX verwendet, um das Layout von Benutzeroberflächen zu erstellen. Wer die GUI lieber direkt mit JavaFX programmiert, kann die entsprechenden Elemente im Programmcode ersetzen.
In der Konfigurationsdatei pom.xml
muss dann die Dependency
<!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>22.0.1</version>
</dependency>
eingefügt werden. Die Dependency für fxml kann man dann löschen:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>21.0.1</version>
</dependency>
Archetype anderer Hersteller
Über die Command-Palette von VSCode finden Sie zahlreiche weitere Archetypen anderer Hersteller. Erstellen Sie dazu ein neues Java Projekt mit der Option „Maven“ und wählen Sie dann „More“. Geben Sie „fx“ in das Suchfeld, um die angebotene Liste zu filtern.
Für unser Beispiel haben wir „gluonfx“ gewählt, es gibt dabei z.Zt. nur Version 0.0.3. Die weiteren Einrichtungsschritte entsprechen den oben beschriebenen.
Die Programmdatei heißt „HelloFX.java“ und liegt im Verzeichnis src > main > java > info.zoomin
.
Allerdings erhält man beim ersten Versuch, „HelloFX.java“ zu starten, eine Fehlermeldung:
Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen
Der Fehler tritt auf, wenn im Verzeichnis java
die Datei module-info.java
fehlt.
Erstellen Sie die Datei im Ordner java
mit dem folgenden Inhalt:
module info.zoomin {
requires transitive javafx.controls;
requires javafx.graphics;
exports info.zoomin;
}
Ersetzen Sie „info.zoomin“ durch Ihren eigenen Paketnamen, die Zeile für fxml müssen Sie ggf. löschen..
Nun können Sie das Programm neu starten und erhalten ein Fenster mit einem freundlich grüßenden „Duke“:
Weiterlesen
Die vollständigen Java-Projekte haben wir auf GitHub bereitgestellt.