Kategorie: Java

  • Java Projekt- und Verzeichnis- Struktur, Build-Tools

    java blue circle

    Wir zeigen, wie man ein Java-Projekt strukturiert, ein Lernprojekt erstellt und geben eine Einführung in Build-Tools und Maven.

    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 abgelegt
    • lib: Libraries, enthält zusätzliche Bibliotheken, das Verzeichnis ist erst einmal leer
    • src: Source, hier befinden sich die Quellcode-Dateien (mit der Dateiendung .java). Bereits erstellt ist die Datei „App.java“ mit einem Beispiel-Programm.
    Java Projektstruktur in VSCode.

    Startet man die App.java, wird ein weiteres Verzeichnis bin angelegt, das das kompilierte Programm „App.class“ enthält.

    Java Projektstruktur in VSCode, nach dem Kompilieren mit zusätzlichem Verzeichnis

    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.

    Java Projektstruktur in VSCode.
    Java Projektstruktur in VSCode.

    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 srcund target.

    VSCode mit einem neuen Maven-Projekt.

    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 .

    die Projektstruktur im Terminal angezeigt .

    Ganz oben finden Sie die Datei pom.xml (POM: Project Object Model). Sie enthält Informationen über das Projekt und Details zu Konfiguration.

    VSCode mit der Datei pom.xml im Editor.

    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.

    Archetypes

    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“.

    VSCode, Maven-Archetype Quickstart verwenden, ein Menü listet alle verfügbaren Vorlagen auf.

    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.

    Maven und JavaFX

    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.

    VSCode, ein Menü mit der Auswahl an Vorlagen für Java-FX ist geöffnet.

    Anschließend wählen Sie ein Verzeichnis 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 im Verzeichnis src > main > java > info.zoomin . Sie können das Programm direkt starten und erhalten dieses Fenster:

    Fenster eines Java-FX Programmes

    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.

    VSCode, farbliche Hervorhabung in orange im Explorer und im Quelltext.

    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 eingefügt werden:

    <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-graphics -->
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>22.0.1</version>
    </dependency>

    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 eine 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 mit dem folgenden Inhalt:

    module info.zoomin {
        requires transitive javafx.controls;
        requires javafx.graphics;
    
        exports info.zoomin;
    }
    Die Datei module-info.java im Editor.

    Ersetzen Sie „info.zoomin“ durch Ihren eigenen Paketnamen.

    Nun können Sie das Programm neu starten und erhalten ein Fenster mit einem freundlich grüßenden „Duke“:

    Programmfenster eines mit Maven erstellten Demo-Programmes.

    Weiterlesen

    Die vollständigen Java-Projekte haben wir auf GitHub bereitgestellt.

    JavaFX-Projekt mit Maven-Archetyp:

    https://github.com/henrietteBaum/java-projects/tree/main/demo_mavenfx

    JavaFX-Projekt mit Gluon-Archetype:

    https://github.com/henrietteBaum/java-projects/tree/main/demo_gluonfx

    Quellen:

    https://docs.oracle.com/javase/8/javase-clienttechnologies.htm