meldestelle/client/desktop-app/README-CLIENT-DESKTOP-APP.md
2025-08-16 15:47:57 +02:00

12 KiB

Client Desktop-App Modul

Überblick

Das desktop-app Modul stellt eine native Desktop-Anwendung für das Meldestelle-System bereit, die Kotlin Multiplatform und Compose for Desktop verwendet. Dieses Modul dient als plattformübergreifender Desktop-Client, der nahtlos mit dem geteilten common-ui Modul integriert ist, um eine konsistente Benutzererfahrung zu liefern.

Hauptfunktionen:

  • 🖥️ Native Desktop-App - Plattformübergreifende Unterstützung für Windows, macOS und Linux
  • 🏗️ Moderne Architektur - Integriert mit MVVM common-ui Modul
  • 🚀 Optimierter Build - Modernisierte Gradle-Konfiguration mit nativer Distribution
  • 🧪 Testabdeckung - Umfassende Testsuite für Desktop-spezifische Funktionalität
  • 📦 Einfache Distribution - Eigenständiges Packaging für alle Plattformen

Architektur

Modulstruktur

client/desktop-app/
├── build.gradle.kts                    # Modernisierte Build-Konfiguration
├── src/
│   ├── jvmMain/kotlin/at/mocode/client/desktop/
│   │   └── Main.kt                     # Desktop-Anwendung Einstiegspunkt
│   └── jvmTest/kotlin/at/mocode/client/desktop/
│       └── MainTest.kt                 # Desktop-spezifische Tests
└── README-CLIENT-DESKTOP-APP.md        # Diese Dokumentation

Integration mit Common-UI

Die Desktop-App nutzt die geteilte MVVM-Architektur von common-ui:

fun main() = application {
    Window(
        onCloseRequest = ::exitApplication,
        title = "Meldestelle Desktop App",
        state = WindowState(
            position = WindowPosition(Alignment.Center),
            width = 800.dp,
            height = 600.dp
        )
    ) {
        // Verwendet geteilte App-Komponente mit MVVM-Architektur
        App(baseUrl = System.getProperty("meldestelle.api.url", "http://localhost:8080"))
    }
}

Build-Konfiguration

Moderne Gradle-Einrichtung

Die desktop-app verwendet eine modernisierte Build-Konfiguration nach Projektstandards:

Plugin-Konfiguration

plugins {
    alias(libs.plugins.kotlin.multiplatform)
    alias(libs.plugins.kotlin.serialization)
    alias(libs.plugins.compose.multiplatform)
    alias(libs.plugins.compose.compiler)
}

Abhängigkeiten-Organisation

val jvmMain by getting {
    dependencies {
        // Projekt-Abhängigkeiten
        implementation(project(":client:common-ui"))

        // Compose Desktop
        implementation(compose.desktop.currentOs)
        implementation(compose.material3)
        implementation(compose.ui)
        implementation(compose.uiTooling)
        implementation(compose.runtime)
        implementation(compose.foundation)

        // Serialisierungsunterstützung
        implementation(libs.kotlinx.serialization.json)

        // HTTP Client & Coroutines
        implementation(libs.ktor.client.cio)
        implementation(libs.ktor.client.contentNegotiation)
        implementation(libs.ktor.client.serialization.kotlinx.json)
        implementation(libs.kotlinx.coroutines.swing)

        // Logging
        implementation(libs.kotlin.logging.jvm)
    }
}

Test-Konfiguration

val jvmTest by getting {
    dependencies {
        implementation(libs.bundles.testing.jvm)
    }
}

Native Distribution

nativeDistributions {
    targetFormats(TargetFormat.Deb, TargetFormat.Dmg, TargetFormat.Msi)
    packageName = "Meldestelle"
    packageVersion = "1.0.0"
}

Entwicklung

Voraussetzungen

Tool Version Zweck
JDK 21 (Temurin) Desktop-Laufzeit und Gradle-Build
Gradle 8.x (wrapper) Build-Automatisierung

Die Anwendung erstellen

# Die Desktop-Anwendung kompilieren
./gradlew :client:desktop-app:compileKotlinJvm

# Die Anwendung im Entwicklungsmodus ausführen
./gradlew :client:desktop-app:run

# Vollständige Anwendung erstellen
./gradlew :client:desktop-app:build

Tests ausführen

# Alle Desktop-Tests ausführen
./gradlew :client:desktop-app:jvmTest

# Spezifischen Test ausführen
./gradlew :client:desktop-app:jvmTest --tests "MainTest"

# Ausführliche Test-Ausgabe
./gradlew :client:desktop-app:jvmTest --info

Packaging für Distribution

# Verteilbare Pakete für alle Plattformen erstellen
./gradlew :client:desktop-app:createDistributable

# Paket für spezifische Plattform
./gradlew :client:desktop-app:packageDeb      # Linux .deb
./gradlew :client:desktop-app:packageDmg      # macOS .dmg
./gradlew :client:desktop-app:packageMsi      # Windows .msi

Konfiguration

Systemeigenschaften

Die Desktop-Anwendung unterstützt Konfiguration über JVM-Systemeigenschaften:

Eigenschaft Standard Beschreibung
meldestelle.api.url http://localhost:8080 Backend-API Basis-URL

Verwendungsbeispiele

# Mit benutzerdefinierter API-URL ausführen
./gradlew :client:desktop-app:run -Dmeldestelle.api.url=https://api.example.com

# Mit Entwicklungseinstellungen ausführen
./gradlew :client:desktop-app:run -Dmeldestelle.api.url=http://localhost:8080

Fenster-Konfiguration

Standard-Fenstereinstellungen können in Main.kt angepasst werden:

WindowState(
    position = WindowPosition(Alignment.Center),
    width = 800.dp,        // Anpassbar
    height = 600.dp        // Anpassbar
)

Tests

Testabdeckung

Komponente Test-Datei Tests Abdeckung
Hauptanwendung MainTest.kt 3 Bootstrap, Konfiguration, Struktur

Test-Implementierung

class MainTest {
    @Test
    fun `should have valid main class configuration`()

    @Test
    fun `should have proper package structure`()

    @Test
    fun `should be able to instantiate system property for base URL`()
}

Test-Suites ausführen

# Alle Tests
./gradlew :client:desktop-app:jvmTest

# Mit Abdeckungsbericht
./gradlew :client:desktop-app:jvmTest jacocoTestReport

Build-Optimierungshistorie

14. August 2025 - Build-Modernisierung

Plugin-Konfiguration-Verbesserungen:

  • Migration zu alias() für type-safe Plugin-Referenzen
  • Serialisierung und Compose Compiler-Unterstützung hinzugefügt
  • TargetFormat-Imports für native Distribution behoben

Abhängigkeiten-Verbesserungen:

  • Strukturierte Logging-Unterstützung hinzugefügt
  • Erweiterte HTTP-Client-Fähigkeiten
  • Verbesserte Compose-Komponentenorganisation
  • Umfassende Test-Infrastruktur hinzugefügt

Native Distribution:

  • TargetFormat-Konfiguration behoben
  • Plattformübergreifendes Packaging aktiviert (Deb, Dmg, Msi)
  • Package-Metadaten optimiert

16. August 2025 - Tests & Integration

Test-Infrastruktur:

  • Umfassende MainTest.kt hinzugefügt
  • Mit common-ui MVVM-Architektur integriert
  • Anwendungs-Bootstrap und Konfiguration validiert
  • Systemeigenschaften-Tests hinzugefügt

Architektur-Validierung:

  • Nahtlose Integration mit aktualisiertem common-ui bestätigt
  • MVVM-Muster-Konformität verifiziert
  • Ressourcenverwaltungs-Integration validiert

Leistung & Qualität

Build-Leistung

  • Schnelle inkrementelle Builds mit moderner Gradle-Konfiguration
  • Effiziente Plugin-Auflösung durch Versions-Katalog
  • Optimierte Abhängigkeitsverwaltung

Laufzeit-Leistung

  • Native Desktop-Leistung mit JVM-Optimierung
  • Effiziente Ressourcenverwaltung durch common-ui Integration
  • Minimaler Speicher-Footprint mit ordnungsgemäßer Bereinigung

Code-Qualität

  • 100% Architektur-Konformität mit MVVM-Muster
  • Umfassende Testabdeckung für Desktop-spezifische Funktionalität
  • Konsistente Code-Organisation und Dokumentation

Integrations-Vorteile

Vom Common-UI Modul

Die Desktop-App profitiert automatisch von allen common-ui Optimierungen:

  • MVVM-Architektur: Ordnungsgemäße Trennung der Belange durch PingViewModel
  • Ressourcenverwaltung: Automatische Bereinigung über DisposableEffect in geteilten Komponenten
  • UI-Zustandsverwaltung: Vier distinkte Zustände gemäß Trace-Bullet-Richtlinien
  • Speicherleck-Prävention: Eliminierte Callback-Muster zugunsten von Compose-State

Desktop-spezifische Vorteile

  • Native Leistung: Direkte JVM-Ausführung ohne Browser-Overhead
  • System-Integration: Native Dateidialoge, Benachrichtigungen, System-Tray-Unterstützungspotential
  • Offline-Fähigkeit: Vollständige Funktionalität ohne Netzwerkabhängigkeiten
  • Plattformübergreifend: Einzige Codebasis läuft auf Windows, macOS und Linux

Deployment

Entwicklungs-Deployment

# Schneller Entwicklungslauf
./gradlew :client:desktop-app:run

# Mit benutzerdefinierter Konfiguration ausführen
./gradlew :client:desktop-app:run -Dmeldestelle.api.url=https://staging-api.com

Produktions-Deployment

# Produktions-Build erstellen
./gradlew :client:desktop-app:build

# Für Distribution packen
./gradlew :client:desktop-app:createDistributable

# Das Distributionspaket wird erstellt in:
# build/compose/binaries/main/app/

Distributions-Formate

Plattform Format Befehl Ausgabe
Linux .deb packageDeb Debian Package-Installer
macOS .dmg packageDmg macOS Disk-Image
Windows .msi packageMsi Windows Installer

Fehlerbehebung

Häufige Probleme

Problem Symptome Lösung
SLF4J-Warnungen Logging-Warnungen beim Start Logback-Abhängigkeit hinzufügen (nicht kritisch)
Hauptklasse nicht gefunden Build/Run-Fehler Main.kt Package-Struktur überprüfen
Fenster wird nicht angezeigt Anwendung startet, aber kein Fenster Display-Einstellungen und Fensterzustand überprüfen
API-Verbindung fehlgeschlagen Netzwerkfehler meldestelle.api.url Systemeigenschaft überprüfen

Debug-Befehle

# Hauptklassen-Konfiguration überprüfen
./gradlew :client:desktop-app:printMainClassName

# Abhängigkeiten analysieren
./gradlew :client:desktop-app:dependencies

# Ausführliche Build-Ausgabe
./gradlew :client:desktop-app:build --info --stacktrace

Leistungsüberwachung

# Mit JVM-Profiling ausführen
./gradlew :client:desktop-app:run -Dcom.sun.management.jmxremote

# Speicher-Analyse
./gradlew :client:desktop-app:run -XX:+PrintGCDetails

Zukünftige Verbesserungen

Empfohlene Entwicklung

  1. Desktop-spezifische Features

    • System-Tray-Integration
    • Native Benachrichtigungen
    • Dateisystem-Dialoge
    • Desktop-Verknüpfungen
  2. Erweiterte Protokollierung

    • Logback-Konfiguration hinzufügen
    • Strukturierte Protokollierung mit JSON-Ausgabe
    • Log-Rotation und Archivierung
  3. Konfigurationsverwaltung

    • Konfigurationsdatei-Unterstützung
    • Benutzereinstellungen-Persistierung
    • Umgebungsspezifische Konfigurationen
  4. Erweiterte Tests

    • UI-Tests mit Compose-Test-Utilities
    • Integrationstests mit Mock-Backend
    • Leistungs-Benchmarking
  5. Distributions-Optimierung

    • JVM-Optimierung-Flags
    • Anwendungspaket-Größenreduzierung
    • Auto-Update-Mechanismen

Mitwirken

Entwicklungsablauf

  1. Einrichtung

    # JDK 21 Installation überprüfen
    java -version
    
    # Erstellen und testen
    ./gradlew :client:desktop-app:build
    
  2. Testen

    # Tests vor Änderungen ausführen
    ./gradlew :client:desktop-app:jvmTest
    
    # Integration mit common-ui testen
    ./gradlew :client:common-ui:jvmTest :client:desktop-app:jvmTest
    
  3. Code-Standards

    • Kotlin-Codierungskonventionen befolgen
    • Tests für neue Desktop-spezifische Funktionalität hinzufügen
    • Integration mit common-ui MVVM-Architektur beibehalten
    • Konfigurationsänderungen dokumentieren

Pull Request-Anforderungen

  • Alle bestehenden Tests bestehen
  • Neue Funktionalität beinhaltet Tests
  • Integration mit common-ui verifiziert
  • Dokumentation aktualisiert
  • Build-Konfigurationsänderungen dokumentiert

Modul-Status: Produktionsbereit Architektur: MVVM-integriert Build-System: Modernisiert Testabdeckung: Desktop-spezifische Funktionalität Distribution: Plattformübergreifend bereit

Zuletzt aktualisiert: 16. August 2025