# 📦 Guide: Desktop App Packaging (Conveyor & Gradle) Dieses Dokument beschreibt den professionellen Packaging-Prozess für die Meldestelle Desktop App. Wir nutzen **Conveyor** als primäres Werkzeug für das Cross-Platform Packaging (Windows, Linux, macOS), da es stabile Installer inklusive signierter Updates und gebündelter JREs erzeugt. --- ## 1. Strategie: Conveyor vs. Gradle | Feature | Conveyor (Empfohlen) | Gradle (Compose Plugin) | | :--- | :--- | :--- | | **Zielgruppe** | Endanwender (Produktion) | Entwickler (Lokaler Test) | | **Plattformen** | Windows (.msix), Linux (.deb), macOS | Nur Host-OS (Linux auf Linux) | | **Updates** | Automatisch integriert | Manuell | | **JRE** | Amazon Corretto (isoliert) | System JRE oder Toolchain | --- ## 2. Cross-Packaging mit Conveyor Conveyor ist so konfiguriert, dass es von Linux aus Pakete für alle Zielsysteme schnüren kann. ### Voraussetzungen 1. **JAR-Dateien:** Die App muss kompiliert sein: ```bash ./gradlew :frontend:shells:meldestelle-desktop:jvmJar ``` 2. **Icons:** Das System sucht nach `icon.png` in `frontend/shells/meldestelle-desktop/src/jvmMain/resources/`. ### Pakete bauen Führen Sie Conveyor im Projekt-Root aus: ```bash # Komplette Release-Site (Windows & Linux) conveyor make site # Nur ein spezifisches Paket (schneller für Tests) conveyor make debian-package # Linux .deb conveyor make windows-msix # Windows .msix ``` Die Ergebnisse liegen im Ordner `output/`. --- ## 3. Konfiguration (`conveyor.conf`) Wichtige Parameter der aktuellen Konfiguration (v1.0.1): * **JDK:** Nutzt `Amazon Corretto 21` für maximale Cross-Platform Stabilität. * **Heap-Size:** Erhöht auf `-Xmx1024m`, um auch große Stammdaten-Importe zu bewältigen. * **Linux-Deps:** Automatische Installation von `libasound2`, `libgl1-mesa-glx` und `libx11-6`. * **Native Access:** `--enable-native-access=ALL-UNNAMED` ist für Netty/SQLite aktiviert. --- ## 4. Netzwerk & Sicherheit (WICHTIG) Damit die P2P-Funktionen (Chat, Discovery, Sync) nach der Installation funktionieren, müssen folgende Ports auf dem Host-System offen sein: | Port | Protokoll | Funktion | | :--- | :--- | :--- | | **8080** | TCP | P2P Sync & Datenabgleich | | **8090** | TCP | Veranstaltungs-Chat (WebSocket) | | **5353** | UDP | mDNS Discovery (Geräte finden) | ### Firewall-Einrichtung (Linux) Nutzen Sie das optimierte Setup-Script: ```bash sudo ./setup-firewall-linux.sh ``` ### Windows-Besonderheit Beim ersten Start der `.msix` App wird Windows fragen, ob der Netzwerkzugriff erlaubt werden soll. **Wichtig:** Sowohl "Private" als auch "Öffentliche" Netzwerke anhaken, falls auf Turnieren oft Gast-WLANs oder Hotspots genutzt werden. --- ## 5. Troubleshooting ### Problem: "No main class specified" **Lösung:** Stellen Sie sicher, dass in der `Main.kt` eine saubere Top-Level `fun main()` existiert und in der `conveyor.conf` auf `at.mocode.frontend.shell.desktop.MainKt` verwiesen wird. ### Problem: SQLite / Native Libs laden nicht **Lösung:** Prüfen Sie, ob `extract-native-libraries.conf` in der `conveyor.conf` inkludiert ist. ### Problem: JmDNS findet keine Teilnehmer **Lösung:** Prüfen Sie die Ports via `ss -tulpn`. Auf Linux blockieren oft Docker-Interfaces (`br-*`) den Broadcast. Die App filtert diese nun automatisch, aber ein aktives `setup-firewall-linux.sh` ist zwingend erforderlich. ## 6. Performance-Optimierung (Gradle) Der Build-Prozess kann bei aktivierter Web-Kompilierung (WASM/JS) sehr lange dauern. Für die reine Desktop-Entwicklung wurde WASM standardmäßig deaktiviert. * **WASM aktivieren (z.B. für CI/Portal):** `./gradlew -PenableWasm=true ...` * **WASM deaktivieren (Default):** `./gradlew ...` (Spart bis zu 70% Build-Zeit). ## 7. Gradle Deep-Optimierung Neben dem Deaktivieren von WASM wurden folgende systemweite Optimierungen in der `gradle.properties` vorgenommen: * **Configuration Cache:** Aktiviert. Gradle merkt sich die Projektstruktur, was den Start jedes Befehls um Sekunden bis Minuten verkürzt. * **JVM G1GC & 12GB Heap:** Optimiert für große Multi-Modul-Projekte auf Systemen mit viel RAM (ab 16GB). * **Parallel Workers:** Erhöht auf 12, um die 16 logischen Kerne Ihres Rechners besser auszulasten. ### Optionale Analysen Statische Analysen sind nun standardmäßig **deaktiviert**, um den täglichen Workflow nicht zu bremsen. * **Analyse laufen lassen:** `./gradlew staticAnalysis -PrunStaticAnalysis=true` * **Dokka Dokumentation bauen:** `./gradlew dokkaAll -PrunDokka=true` Stellen Sie in der `gradle.properties` sicher, dass `enableWasm=false` gesetzt ist, wenn Sie primär an der Desktop-App arbeiten.