meldestelle/docs/06_Frontend/Logs/2026-02-02_Docker_Build_Troubleshooting_Part2.md
Stefan Mogeritsch 09b0b1a462 infra: clean up Keycloak configuration, enforce consistency in .env, and improve health checks
Streamlined Keycloak configurations with defaults for development and production in `.env`. Added health checks and improved environment variable documentation with comments to differentiate local and server deployments. Ensured compatibility with pre-built registry images.
2026-03-06 11:23:24 +01:00

3.0 KiB

type status owner
Report ARCHIVED Frontend Expert

🧹 Troubleshooting Log: Gradle 9.x & KMP Docker Build (Part 2)

Datum: 02.02.2026 Status: ⚠️ BLOCKED (Docker Build Failure) / SUCCESS (Local Build) Thema: IsolatedKotlinClasspathClassCastException im Docker-Build mit Gradle 9.3.1.

1. Zusammenfassung

Wir haben versucht, den Frontend-Build im Docker-Container zu stabilisieren. Lokal läuft der Build (./gradlew build) erfolgreich durch, inklusive WASM-Support und Runtime-Konfiguration. Im Docker-Container scheitert der Build jedoch hartnäckig an einem Plugin-Konflikt.

2. Das Problem

Fehler: IsolatedKotlinClasspathClassCastException: The Kotlin Gradle plugin was loaded multiple times in different subprojects... Kontext: Gradle 9.2.1 / 9.3.1, Kotlin 2.3.0, Docker (ursprünglich --no-daemon).

Analyse

  • Der Fehler tritt auf, weil das NodeJsRootPlugin (transitiv via KMP) mehrfach initialisiert wird.
  • Lokal: Der Gradle Daemon cached Classloader, wodurch das Plugin als "dasselbe" erkannt wird.
  • Docker: Durch die Isolation (und vermutlich Caching-Artefakte) werden Plugin-Klassen mehrfach geladen und sind nicht cast-bar (ClassCastException).

3. Durchgeführte Maßnahmen & Ergebnisse

Versuch Maßnahme Ergebnis (Docker) Erkenntnis
1. Root Force apply<NodeJsRootPlugin>() im Root build.gradle.kts. FAILED Timing-Problem im Docker, Plugin wird zu spät oder falsch geladen.
2. KMP Root alias(...) apply true im Root + kotlin { jvm() }. FAILED IsolatedKotlinClasspathClassCastException bleibt.
3. Central Mgmt pluginManagement in settings.gradle.kts + id("...") ohne Version in Subprojekten. FAILED Architektonisch sauberster Weg, aber löst das Classloader-Problem im Docker nicht.
4. Daemon Entfernen von --no-daemon im Dockerfile. FAILED Daemon startet, aber der Fehler tritt trotzdem auf.
5. Upgrade Upgrade auf Gradle 9.3.1. FAILED Fehler persistiert auch in der neuesten Version.
6. Property kotlin.mpp.allowMultiplePluginDeclarations=true. FAILED Scheint in Gradle 9.x / KMP 2.3.0 wirkungslos zu sein.

4. Status Quo

  • Lokal: Build & Run funktionieren perfekt.
  • Docker: Build bricht ab.
  • Architektur: Wir haben jetzt eine sehr saubere Gradle-Konfiguration (Zentrales Plugin-Management), die wir beibehalten sollten.

5. Nächste Schritte (Hypothesen)

  1. Cache Corruption: Die Docker-Layer (--mount=type=cache) könnten korrupte Gradle-Caches enthalten. Ein Build ohne Cache-Mounts muss getestet werden.
  2. Gradle 9 Inkompatibilität: Es ist möglich, dass KMP 2.3.0 noch nicht vollständig kompatibel mit dem strikten Classpath-Isolation-Modus von Gradle 9 ist.
  3. Workaround: Ein Downgrade auf Gradle 8.x wurde diskutiert, aber abgelehnt. Wir müssen einen Weg finden, Gradle 9 zu zähmen.

Dokumentiert durch Curator Agent.