From 03e1484dd3cb77ca68e79da3e3bf37c123058dbe Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Tue, 3 Feb 2026 22:11:31 +0100 Subject: [PATCH] chore: refactor Gradle config, standardize Kotlin MPP plugin usage, and update dependencies - Unified plugin application across modules using `alias(libs.plugins.*)` instead of hardcoded IDs. - Removed redundant JVM/JS source map tasks, improving Gradle and Docker build consistency. - Updated dependencies, including `logback` and Webpack `copy-webpack-plugin`, and added contextual documentation. - Added frontend architecture diagram in PlantUML (`docs/01_Architecture/Reference`), standardizing feature-core-shell dependencies. --- .../cache/cache-api/build.gradle.kts | 28 +++++----- .../cache/redis-cache/build.gradle.kts | 51 +++++++++--------- .../infrastructure/gateway/build.gradle.kts | 18 ------- .../monitoring-server/build.gradle.kts | 43 ++++++++------- .../persistence/build.gradle.kts | 50 ++++++++--------- .../infrastructure/security/build.gradle.kts | 42 ++++++--------- build.gradle.kts | 6 ++- contracts/ping-api/build.gradle.kts | 54 +++++++++---------- .../Reference/Fontend-Module.puml | 37 +++++++++++++ ...-02-03_Session_Log_Docker_Build_Issues.md} | 0 frontend/core/auth/build.gradle.kts | 19 +------ frontend/core/design-system/build.gradle.kts | 20 +++---- frontend/core/domain/build.gradle.kts | 14 ++--- frontend/core/local-db/build.gradle.kts | 12 ++--- frontend/core/navigation/build.gradle.kts | 13 ++--- frontend/core/network/build.gradle.kts | 18 +------ frontend/core/sync/build.gradle.kts | 12 ++--- .../features/ping-feature/build.gradle.kts | 21 +------- .../meldestelle-portal/build.gradle.kts | 51 +++--------------- gradle/libs.versions.toml | 15 +++--- platform/architecture-tests/build.gradle.kts | 4 -- platform/platform-bom/build.gradle.kts | 24 ++++----- platform/platform-testing/build.gradle.kts | 54 +++++++++---------- settings.gradle.kts | 17 ++---- 24 files changed, 246 insertions(+), 377 deletions(-) create mode 100644 docs/01_Architecture/Reference/Fontend-Module.puml rename docs/99_Journal/{2026-01-31_Session_Log_Docker_Build_Issues.md => 2026-02-03_Session_Log_Docker_Build_Issues.md} (100%) diff --git a/backend/infrastructure/cache/cache-api/build.gradle.kts b/backend/infrastructure/cache/cache-api/build.gradle.kts index 8152b88f..d86e3dd3 100644 --- a/backend/infrastructure/cache/cache-api/build.gradle.kts +++ b/backend/infrastructure/cache/cache-api/build.gradle.kts @@ -2,31 +2,31 @@ // Es enthält nur Interfaces (z. B. `CacheService`) und Datenmodelle, // aber keine konkrete Implementierung. plugins { - alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinJvm) } java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(25)) - } + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } } // Erlaubt die Verwendung der kotlin.time API im gesamten Modul kotlin { - compilerOptions { - freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") - } + compilerOptions { + freeCompilerArgs.add("-opt-in=kotlin.time.ExperimentalTime") + } } tasks.test { - useJUnitPlatform() + useJUnitPlatform() } dependencies { - // Stellt sicher, dass alle Versionen aus der zentralen BOM kommen. - api(platform(projects.platform.platformBom)) - // Stellt gemeinsame Abhängigkeiten wie Logging bereit und exportiert sie für Konsumenten der API. - api(projects.platform.platformDependencies) - // Stellt Test-Abhängigkeiten bereit. - testImplementation(projects.platform.platformTesting) + // Stellt sicher, dass alle Versionen aus der zentralen BOM kommen. + api(platform(projects.platform.platformBom)) + // Stellt gemeinsame Abhängigkeiten wie Logging bereit und exportiert sie für Konsumenten der API. + api(projects.platform.platformDependencies) + // Stellt Test-Abhängigkeiten bereit. + testImplementation(projects.platform.platformTesting) } diff --git a/backend/infrastructure/cache/redis-cache/build.gradle.kts b/backend/infrastructure/cache/redis-cache/build.gradle.kts index 09e57d5c..90cf2edb 100644 --- a/backend/infrastructure/cache/redis-cache/build.gradle.kts +++ b/backend/infrastructure/cache/redis-cache/build.gradle.kts @@ -1,41 +1,38 @@ // Dieses Modul stellt eine konkrete Implementierung der `cache-api` // unter Verwendung von Redis als Caching-Backend bereit. plugins { - alias(libs.plugins.kotlinJvm) - alias(libs.plugins.kotlinSpring) - // Als Bibliothek benötigt dieses Modul das Spring Boot Plugin nicht. - alias(libs.plugins.spring.dependencyManagement) + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinSpring) + // Als Bibliothek benötigt dieses Modul das Spring Boot Plugin nicht. + alias(libs.plugins.spring.dependencyManagement) } // Stellt sicher, dass ein normales JAR gebaut wird (Bibliotheks-Modul). java { - withJavadocJar() - withSourcesJar() + withJavadocJar() + withSourcesJar() + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } } tasks.test { - useJUnitPlatform() -} - -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(25)) - } + useJUnitPlatform() } dependencies { - // Stellt sicher, dass alle Versionen aus der zentralen BOM kommen. - api(platform(projects.platform.platformBom)) - // Implementiert die provider-agnostische Caching-API. - implementation(projects.backend.infrastructure.cache.cacheApi) - // OPTIMIERUNG: Verwendung des `redis-cache`-Bundles aus libs.versions.toml. - // Dieses Bundle enthält Spring Data Redis, Lettuce und Jackson-Module. - implementation(libs.bundles.redis.cache) - // Stellt alle Test-Abhängigkeiten gebündelt bereit. - testImplementation(projects.platform.platformTesting) - testImplementation(libs.bundles.testing.jvm) - testImplementation(libs.kotlin.test) - testImplementation(libs.kotlin.logging.jvm) - testImplementation(libs.logback.classic) - testImplementation(libs.logback.core) + // Stellt sicher, dass alle Versionen aus der zentralen BOM kommen. + api(platform(projects.platform.platformBom)) + // Implementiert die provider-agnostische Caching-API. + implementation(projects.backend.infrastructure.cache.cacheApi) + // OPTIMIERUNG: Verwendung des `redis-cache`-Bundles aus libs.versions.toml. + // Dieses Bundle enthält Spring Data Redis, Lettuce und Jackson-Module. + implementation(libs.bundles.redis.cache) + // Stellt alle Test-Abhängigkeiten gebündelt bereit. + testImplementation(projects.platform.platformTesting) + testImplementation(libs.bundles.testing.jvm) + testImplementation(libs.kotlin.test) + testImplementation(libs.kotlin.logging.jvm) + testImplementation(libs.logback.classic) + testImplementation(libs.logback.core) } diff --git a/backend/infrastructure/gateway/build.gradle.kts b/backend/infrastructure/gateway/build.gradle.kts index 17edcc0d..8340f46e 100644 --- a/backend/infrastructure/gateway/build.gradle.kts +++ b/backend/infrastructure/gateway/build.gradle.kts @@ -31,28 +31,10 @@ dependencies { // Resilience (Reactive) - WICHTIG: Reactor-Variante für WebFlux! implementation(libs.spring.cloud.starter.circuitbreaker.reactor.resilience4j) - implementation(libs.kotlin.logging.jvm) - implementation(libs.logback.classic) - implementation(libs.logback.core) - implementation(libs.jackson.module.kotlin) - implementation(libs.jackson.datatype.jsr310) - implementation(libs.spring.boot.starter.data.redis) - implementation(libs.micrometer.tracing.bridge.brave) testImplementation(projects.platform.platformTesting) - testImplementation(libs.junit.jupiter.api) - testImplementation(libs.junit.jupiter.engine) - testImplementation(libs.junit.jupiter.params) - testImplementation(libs.junit.platform.launcher) - testImplementation(libs.mockk) - testImplementation(libs.assertj.core) - testImplementation(libs.kotlinx.coroutines.test) -} - -tasks.test { - useJUnitPlatform() } sourceSets { diff --git a/backend/infrastructure/monitoring/monitoring-server/build.gradle.kts b/backend/infrastructure/monitoring/monitoring-server/build.gradle.kts index 3c8b95c4..31f8a12f 100644 --- a/backend/infrastructure/monitoring/monitoring-server/build.gradle.kts +++ b/backend/infrastructure/monitoring/monitoring-server/build.gradle.kts @@ -1,34 +1,37 @@ // Dieses Modul ist ein eigenständiger Spring Boot Service, der den // Zipkin-Server mit seiner UI hostet, um Tracing-Daten zu visualisieren. plugins { - alias(libs.plugins.kotlinJvm) - alias(libs.plugins.kotlinSpring) - alias(libs.plugins.spring.boot) - alias(libs.plugins.spring.dependencyManagement) + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinSpring) + alias(libs.plugins.spring.boot) + alias(libs.plugins.spring.dependencyManagement) } // Konfiguriert die Hauptklasse für das ausführbare JAR. springBoot { - mainClass.set("at.mocode.infrastructure.monitoring.MonitoringServerApplicationKt") + mainClass.set("at.mocode.infrastructure.monitoring.MonitoringServerApplicationKt") } dependencies { - // Stellt sicher, dass alle Versionen aus der zentralen BOM kommen. - implementation(platform(projects.platform.platformBom)) - // Stellt gemeinsame Abhängigkeiten bereit. - implementation(projects.platform.platformDependencies) - // Spring Boot Starter für einen einfachen Web-Service. - implementation(libs.spring.boot.starter.web) - implementation(libs.spring.boot.starter.actuator) - // Abhängigkeiten für den Zipkin-Server (UI ist via zipkin-lens bereits enthalten). - implementation(libs.zipkin.server) - // Prometheus client für Zipkin Metriken - implementation(libs.micrometer.prometheus) - // Stellt alle Test-Abhängigkeiten gebündelt bereit. - testImplementation(projects.platform.platformTesting) - testImplementation(libs.logback.classic) // SLF4J provider for tests + // Stellt sicher, dass alle Versionen aus der zentralen BOM kommen. + implementation(platform(projects.platform.platformBom)) + // Stellt gemeinsame Abhängigkeiten bereit. + implementation(projects.platform.platformDependencies) + // Spring Boot Starter für einen einfachen Web-Service. + implementation(libs.spring.boot.starter.web) + implementation(libs.spring.boot.starter.actuator) + // Abhängigkeiten für den Zipkin-Server (UI ist via zipkin-lens bereits enthalten). + implementation(libs.zipkin.server) + // Prometheus client für Zipkin Metriken + implementation(libs.micrometer.prometheus) + // Stellt alle Test-Abhängigkeiten gebündelt bereit. + testImplementation(projects.platform.platformTesting) + + // Logging explizit für Tests erzwingen, um Versionskonflikte zu vermeiden + testImplementation(libs.logback.classic) + testImplementation(libs.logback.core) } tasks.test { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/backend/infrastructure/persistence/build.gradle.kts b/backend/infrastructure/persistence/build.gradle.kts index 4d9a360b..a953107b 100644 --- a/backend/infrastructure/persistence/build.gradle.kts +++ b/backend/infrastructure/persistence/build.gradle.kts @@ -1,45 +1,37 @@ plugins { - alias(libs.plugins.kotlinJvm) - alias(libs.plugins.kotlinJpa) - alias(libs.plugins.spring.boot) // Spring Boot Plugin hinzufügen - alias(libs.plugins.spring.dependencyManagement) // Dependency Management für Spring + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinJpa) + alias(libs.plugins.spring.boot) // Spring Boot Plugin hinzufügen + alias(libs.plugins.spring.dependencyManagement) // Dependency Management für Spring } // Library module: do not create an executable Spring Boot jar here. tasks.bootJar { - enabled = false + enabled = false } // Ensure a regular jar is produced instead. tasks.jar { - enabled = true + enabled = true } dependencies { - implementation(platform(projects.platform.platformBom)) - implementation(projects.core.coreUtils) - implementation(projects.core.coreDomain) - implementation(projects.platform.platformDependencies) + implementation(platform(projects.platform.platformBom)) + implementation(projects.core.coreUtils) + implementation(projects.core.coreDomain) + implementation(projects.platform.platformDependencies) - // Spring Boot Database dependencies - implementation(libs.bundles.database.complete) + // Spring Boot Database dependencies + implementation(libs.bundles.database.complete) - // Exposed - implementation(libs.exposed.core) - implementation(libs.exposed.jdbc) - implementation(libs.exposed.dao) - implementation(libs.exposed.java.time) - implementation(libs.exposed.json) - implementation(libs.exposed.kotlin.datetime) + // Exposed + implementation(libs.exposed.core) + implementation(libs.exposed.jdbc) + implementation(libs.exposed.dao) + implementation(libs.exposed.java.time) + implementation(libs.exposed.json) + implementation(libs.exposed.kotlin.datetime) - // Logging - implementation(libs.slf4j.api) - - // Testing - testImplementation(projects.platform.platformTesting) - testImplementation(libs.bundles.testing.jvm) -} - -tasks.test { - useJUnitPlatform() + // Testing + testImplementation(projects.platform.platformTesting) } diff --git a/backend/infrastructure/security/build.gradle.kts b/backend/infrastructure/security/build.gradle.kts index 7693678e..4056abef 100644 --- a/backend/infrastructure/security/build.gradle.kts +++ b/backend/infrastructure/security/build.gradle.kts @@ -1,40 +1,32 @@ plugins { - alias(libs.plugins.kotlinJvm) - alias(libs.plugins.kotlinSpring) - alias(libs.plugins.spring.boot) - alias(libs.plugins.spring.dependencyManagement) + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinSpring) + alias(libs.plugins.spring.boot) + alias(libs.plugins.spring.dependencyManagement) } // Library module: do not create an executable Spring Boot jar here. tasks.bootJar { - enabled = false + enabled = false } tasks.jar { - enabled = true + enabled = true } dependencies { - implementation(platform(projects.platform.platformBom)) - implementation(projects.platform.platformDependencies) + implementation(platform(projects.platform.platformBom)) + implementation(projects.platform.platformDependencies) - // Spring Security & OAuth2 - implementation(libs.spring.boot.starter.security) - implementation(libs.spring.boot.starter.oauth2.resource.server) - implementation(libs.spring.security.oauth2.jose) + // Spring Security & OAuth2 + implementation(libs.spring.boot.starter.security) + implementation(libs.spring.boot.starter.oauth2.resource.server) + implementation(libs.spring.security.oauth2.jose) - // Web (for CORS config) - implementation(libs.spring.web) + // Web (for CORS config) + implementation(libs.spring.web) - // Utils - implementation(libs.slf4j.api) - implementation(libs.jackson.module.kotlin) - - // Testing - testImplementation(projects.platform.platformTesting) - testImplementation(libs.spring.security.test) -} - -tasks.test { - useJUnitPlatform() + // Testing + testImplementation(projects.platform.platformTesting) + testImplementation(libs.spring.security.test) } diff --git a/build.gradle.kts b/build.gradle.kts index 03ce3e81..ea6dd29d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -75,7 +75,11 @@ subprojects { tasks.withType().configureEach { compilerOptions { jvmTarget.set(JvmTarget.JVM_25) - freeCompilerArgs.add("-Xannotation-default-target=param-property") + freeCompilerArgs.addAll( + "-opt-in=kotlin.RequiresOptIn", + "-Xannotation-default-target=param-property", + "-Xexpect-actual-classes", + ) } } diff --git a/contracts/ping-api/build.gradle.kts b/contracts/ping-api/build.gradle.kts index 8ffd150a..d4567cc6 100644 --- a/contracts/ping-api/build.gradle.kts +++ b/contracts/ping-api/build.gradle.kts @@ -1,41 +1,37 @@ plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") - alias(libs.plugins.kotlinSerialization) + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.kotlinSerialization) } group = "at.mocode" version = "1.0.0" kotlin { - // Toolchain is now handled centrally in the root build.gradle.kts + // JVM target for backend usage + jvm() - // JVM target for backend usage - jvm() + // JS target for frontend usage (Compose/Browser) + js { + browser() + } - // JS target for frontend usage (Compose/Browser) - js { - browser() - // no need for binaries.executable() in a library + // Wasm enabled by default + @OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class) + wasmJs { + browser() + } + + sourceSets { + commonMain { + dependencies { + api(projects.core.coreDomain) // Changed from implementation to api to export Syncable + implementation(libs.kotlinx.serialization.json) + } } - - // Wasm enabled by default - @OptIn(org.jetbrains.kotlin.gradle.ExperimentalWasmDsl::class) - wasmJs { - browser() - } - - sourceSets { - commonMain { - dependencies { - api(projects.core.coreDomain) // Changed from implementation to api to export Syncable - implementation(libs.kotlinx.serialization.json) - } - } - commonTest { - dependencies { - implementation(libs.kotlin.test) - } - } + commonTest { + dependencies { + implementation(libs.kotlin.test) + } } + } } diff --git a/docs/01_Architecture/Reference/Fontend-Module.puml b/docs/01_Architecture/Reference/Fontend-Module.puml new file mode 100644 index 00000000..2ec9cb37 --- /dev/null +++ b/docs/01_Architecture/Reference/Fontend-Module.puml @@ -0,0 +1,37 @@ +@startuml +!theme vibrant + +package "Frontend" { + package "Shells" <> { + [Android App] + [Desktop App] + } + + package "Features" <> { + [Feature A] + [Feature B] + [Feature C] + } + + package "Core" <> { + [UI Components] + [Design System] + [Utils] + } +} + +[Android App] --> [Feature A] +[Android App] --> [Feature B] +[Desktop App] --> [Feature A] +[Desktop App] --> [Feature C] + +[Feature A] ..> [Feature B] : (optional dependency) + +[Feature A] --> [Core] +[Feature B] --> [Core] +[Feature C] --> [Core] + +[Android App] --> [Core] +[Desktop App] --> [Core] + +@enduml diff --git a/docs/99_Journal/2026-01-31_Session_Log_Docker_Build_Issues.md b/docs/99_Journal/2026-02-03_Session_Log_Docker_Build_Issues.md similarity index 100% rename from docs/99_Journal/2026-01-31_Session_Log_Docker_Build_Issues.md rename to docs/99_Journal/2026-02-03_Session_Log_Docker_Build_Issues.md diff --git a/frontend/core/auth/build.gradle.kts b/frontend/core/auth/build.gradle.kts index e7984b31..868d91fd 100644 --- a/frontend/core/auth/build.gradle.kts +++ b/frontend/core/auth/build.gradle.kts @@ -1,8 +1,5 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget - plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeCompiler) alias(libs.plugins.kotlinSerialization) @@ -13,11 +10,9 @@ version = "1.0.0" kotlin { jvm() - js { binaries.library() - // CHANGED: Use nodejs() instead of browser() to minimize NodeJsRootPlugin conflicts in Docker - // while still satisfying the "configured for JS usage" requirement. + // Use nodejs() to minimize NodeJsRootPlugin conflicts in Docker nodejs() } @@ -70,13 +65,3 @@ kotlin { } } } - -tasks.withType { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_25) - freeCompilerArgs.addAll( - "-opt-in=kotlin.RequiresOptIn", - "-Xexpect-actual-classes" - ) - } -} diff --git a/frontend/core/design-system/build.gradle.kts b/frontend/core/design-system/build.gradle.kts index 9c5c41b1..376e7887 100644 --- a/frontend/core/design-system/build.gradle.kts +++ b/frontend/core/design-system/build.gradle.kts @@ -1,21 +1,15 @@ plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") - alias(libs.plugins.composeMultiplatform) - alias(libs.plugins.composeCompiler) + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinSerialization) + alias(libs.plugins.composeCompiler) + alias(libs.plugins.composeMultiplatform) } kotlin { jvm() - js(IR) { + js { binaries.library() - // Re-enabled browser environment after Root NodeJs fix - browser { - testTask { - enabled = false - } - } + browser() } sourceSets { @@ -25,9 +19,7 @@ kotlin { implementation(compose.material3) implementation(compose.ui) implementation(compose.components.resources) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.kotlinx.serialization.json) - implementation(libs.kotlinx.datetime) + implementation(libs.bundles.kmp.common) } } } diff --git a/frontend/core/domain/build.gradle.kts b/frontend/core/domain/build.gradle.kts index 63c46770..4f90828c 100644 --- a/frontend/core/domain/build.gradle.kts +++ b/frontend/core/domain/build.gradle.kts @@ -1,7 +1,6 @@ @file:OptIn(ExperimentalKotlinGradlePluginApi::class) import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.kotlinMultiplatform) @@ -14,9 +13,9 @@ kotlin { binaries.library() // Re-enabled browser environment after Root NodeJs fix browser { - testTask { - enabled = false - } + testTask { + enabled = false + } } } @@ -27,9 +26,4 @@ kotlin { } } -tasks.withType { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_25) - freeCompilerArgs.addAll("-opt-in=kotlin.RequiresOptIn") - } -} +// KMP Compile-Optionen sind jetzt zentral in der Root build.gradle.kts definiert diff --git a/frontend/core/local-db/build.gradle.kts b/frontend/core/local-db/build.gradle.kts index b3d57a47..c0b985d2 100644 --- a/frontend/core/local-db/build.gradle.kts +++ b/frontend/core/local-db/build.gradle.kts @@ -3,8 +3,7 @@ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinSerialization) alias(libs.plugins.sqldelight) } @@ -13,12 +12,7 @@ kotlin { jvm() js { binaries.library() - // Re-enabled browser environment after Root NodeJs fix - browser { - testTask { - enabled = false - } - } + browser() } sourceSets { @@ -35,7 +29,7 @@ kotlin { jsMain.dependencies { implementation(libs.sqldelight.driver.web) - implementation(npm("@sqlite.org/sqlite-wasm", "3.51.1-build2")) + implementation(npm("@sqlite.org/sqlite-wasm", libs.versions.sqliteWasm.get())) } commonTest.dependencies { diff --git a/frontend/core/navigation/build.gradle.kts b/frontend/core/navigation/build.gradle.kts index 08dff695..801d1ddb 100644 --- a/frontend/core/navigation/build.gradle.kts +++ b/frontend/core/navigation/build.gradle.kts @@ -1,10 +1,8 @@ /** * Dieses Modul definiert nur die Navigationsrouten. - * Es ist noch simpler. */ plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) } group = "at.mocode.clients.shared" @@ -14,18 +12,13 @@ kotlin { jvm() js { binaries.library() - // Re-enabled browser environment after Root NodeJs fix - browser { - testTask { - enabled = false - } - } + browser() } sourceSets { commonMain.dependencies { // Depend on core domain for User/Role types used by navigation API - implementation(project(":frontend:core:domain")) + implementation(projects.frontend.core.domain) } commonTest.dependencies { implementation(libs.kotlin.test) diff --git a/frontend/core/network/build.gradle.kts b/frontend/core/network/build.gradle.kts index a5f07a91..3e566852 100644 --- a/frontend/core/network/build.gradle.kts +++ b/frontend/core/network/build.gradle.kts @@ -1,11 +1,9 @@ @file:OptIn(ExperimentalKotlinGradlePluginApi::class) import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinSerialization) } @@ -13,12 +11,7 @@ kotlin { jvm() js { binaries.library() - // Re-enabled browser environment after Root NodeJs fix - browser { - testTask { - enabled = false - } - } + browser() } sourceSets { @@ -41,10 +34,3 @@ kotlin { } } } - -tasks.withType { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_25) - freeCompilerArgs.addAll("-opt-in=kotlin.RequiresOptIn") - } -} diff --git a/frontend/core/sync/build.gradle.kts b/frontend/core/sync/build.gradle.kts index e5d62ce0..25603511 100644 --- a/frontend/core/sync/build.gradle.kts +++ b/frontend/core/sync/build.gradle.kts @@ -1,19 +1,13 @@ plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinSerialization) } kotlin { jvm() - js(IR) { + js { binaries.library() - // Re-enabled browser environment after Root NodeJs fix - browser { - testTask { - enabled = false - } - } + browser() } sourceSets { diff --git a/frontend/features/ping-feature/build.gradle.kts b/frontend/features/ping-feature/build.gradle.kts index ede9a1b8..6177d8c7 100644 --- a/frontend/features/ping-feature/build.gradle.kts +++ b/frontend/features/ping-feature/build.gradle.kts @@ -1,11 +1,8 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget - /** * Dieses Modul kapselt die gesamte UI und Logik für das Ping-Feature. */ plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeCompiler) alias(libs.plugins.kotlinSerialization) @@ -18,12 +15,7 @@ kotlin { jvm() js { binaries.library() - // Re-enabled browser environment after Root NodeJs fix - browser { - testTask { - enabled = false - } - } + browser() } sourceSets { @@ -70,12 +62,3 @@ kotlin { } } } - -tasks.withType { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_25) - freeCompilerArgs.addAll( - "-opt-in=kotlin.RequiresOptIn" - ) - } -} diff --git a/frontend/shells/meldestelle-portal/build.gradle.kts b/frontend/shells/meldestelle-portal/build.gradle.kts index e217316c..e6cc27c4 100644 --- a/frontend/shells/meldestelle-portal/build.gradle.kts +++ b/frontend/shells/meldestelle-portal/build.gradle.kts @@ -3,7 +3,6 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi -import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig /** @@ -11,16 +10,13 @@ import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig * setzt sie zu einer lauffähigen Anwendung zusammen. */ plugins { - // Fix for "Plugin loaded multiple times": Apply plugin by ID without version (inherited from root) - id("org.jetbrains.kotlin.multiplatform") + alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.composeCompiler) alias(libs.plugins.composeMultiplatform) alias(libs.plugins.kotlinSerialization) } kotlin { - // Toolchain is now handled centrally in the root build.gradle.kts - // JVM Target für Desktop jvm { binaries { @@ -31,7 +27,7 @@ kotlin { } // JavaScript Target für Web - js(IR) { + js { browser { commonWebpackConfig { cssSupport { enabled = true } @@ -43,7 +39,7 @@ kotlin { // Source Maps Optimierung für Docker Builds if (project.hasProperty("noSourceMaps")) { - sourceMaps = false + sourceMaps = false } } @@ -55,13 +51,6 @@ kotlin { runTask { mainOutputFileName.set("web-app.js") } - // Browser-Tests komplett deaktivieren (Configuration Cache kompatibel) - testTask { - useKarma { - useChromeHeadless() - environment("CHROME_BIN", "/usr/bin/google-chrome-stable") - } - } } binaries.executable() } @@ -69,7 +58,6 @@ kotlin { sourceSets { commonMain.dependencies { // Shared modules - // implementation(projects.frontend.shared) // REMOVED: Shared module deleted implementation(projects.frontend.core.domain) implementation(projects.frontend.core.designSystem) implementation(projects.frontend.core.navigation) @@ -92,7 +80,7 @@ kotlin { implementation(compose.components.resources) implementation(compose.materialIconsExtended) - // Bundles (Cleaned up dependencies) + // Bundles implementation(libs.bundles.kmp.common) // Coroutines, Serialization, DateTime implementation(libs.bundles.compose.common) // ViewModel & Lifecycle } @@ -106,7 +94,7 @@ kotlin { jsMain.dependencies { implementation(compose.html.core) // Benötigt für custom webpack config (wasm.js) - implementation(devNpm("copy-webpack-plugin", "11.0.0")) + implementation(devNpm("copy-webpack-plugin", libs.versions.copyWebpackPlugin.get())) } commonTest.dependencies { @@ -115,25 +103,7 @@ kotlin { } } -// KMP Compile-Optionen -tasks.withType { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_25) - freeCompilerArgs.addAll( - "-opt-in=kotlin.RequiresOptIn", - "-Xskip-metadata-version-check", // Für bleeding-edge Versionen - // Suppress beta warning for expect/actual declarations used in this module - "-Xexpect-actual-classes" - ) - } -} - -// --------------------------------------------------------------------------- -// Kotlin/JS source maps -// --------------------------------------------------------------------------- -// Production source maps must remain enabled for browser debugging. - -// Configure a duplicate handling strategy for distribution tasks +// Duplicate-Handling für Distribution (Zentralisiert in Root build.gradle.kts, aber hier spezifisch für Distribution Tasks) tasks.withType { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } @@ -142,15 +112,6 @@ tasks.withType { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } -// Duplicate-Handling für Distribution -tasks.withType { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE -} - -tasks.withType { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE -} - // Desktop Application Configuration compose.desktop { application { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 64d5841d..2764896e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ # This file is the SINGLE SOURCE OF TRUTH for all project dependencies. # Organized by Domain: Frontend (KMP) vs. Backend (Spring/JVM) -# Last updated: 2026-01-29 +# Last updated: 2026-02-03 [versions] # ============================================================================== @@ -35,6 +35,10 @@ koinCompose = "4.1.1" sqldelight = "2.2.1" sqlite = "2.6.2" +# Web Tooling (NPM) +copyWebpackPlugin = "11.0.0" +sqliteWasm = "3.51.1-build2" + # ============================================================================== # === BACKEND & INFRASTRUCTURE === # ============================================================================== @@ -69,7 +73,7 @@ keycloakAdminClient = "26.0.7" # Utilities bignum = "0.3.10" -logback = "1.5.22" +logback = "1.5.25" caffeine = "3.2.3" reactorKafka = "1.3.23" jackson = "3.0.3" @@ -81,7 +85,7 @@ kotlin-logging = "7.0.13" junitJupiter = "5.11.3" junitPlatform = "1.11.3" mockk = "1.14.7" -assertj = "3.27.6" +assertj = "3.27.7" testcontainers = "2.0.3" testcontainersKeycloak = "4.0.1" testcontainersJunitJupiter = "1.21.4" @@ -111,11 +115,6 @@ kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-t kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } -# Web Specifics -#npm-sqljs = { module = "sql.js", version = "1.12.0" } -#npm-copy-webpack = { module = "copy-webpack-plugin", version = "12.0.0" } - - # ============================================================================== # === FRONTEND: COMPOSE UI === # ============================================================================== diff --git a/platform/architecture-tests/build.gradle.kts b/platform/architecture-tests/build.gradle.kts index a7994281..0e790148 100644 --- a/platform/architecture-tests/build.gradle.kts +++ b/platform/architecture-tests/build.gradle.kts @@ -37,7 +37,3 @@ dependencies { implementation(project(":frontend:core:sync")) implementation(project(":frontend:shells:meldestelle-portal")) } - -tasks.withType().configureEach { - useJUnitPlatform() -} diff --git a/platform/platform-bom/build.gradle.kts b/platform/platform-bom/build.gradle.kts index 497327da..19afd0fa 100644 --- a/platform/platform-bom/build.gradle.kts +++ b/platform/platform-bom/build.gradle.kts @@ -16,40 +16,37 @@ dependencies { // Importiert andere wichtige BOMs. Die Versionen werden durch diese // importierten Plattformen transitiv verwaltet. api(platform(libs.spring.boot.dependencies)) - api(platform(libs.spring.cloud.dependencies)) // NEU: Spring Cloud BOM hinzugefügt + api(platform(libs.spring.cloud.dependencies)) api(platform(libs.kotlin.bom)) api(platform(libs.kotlinx.coroutines.bom)) + // `constraints` erzwingt spezifische Versionen für einzelne Bibliotheken. // Alle Versionen werden sicher aus `libs.versions.toml` bezogen. constraints { - // --- Spring Boot Core Constraints wurden entfernt. --- - // Die Versionen werden jetzt vollständig durch das importierte Spring Boot BOM verwaltet. - // Das ist der saubere und empfohlene Weg. - // --- Utilities & Other --- api(libs.caffeine) api(libs.reactor.kafka) api(libs.redisson) - // Removed the legacy UUID library constraint (com.benasher44:uuid) since project uses Kotlin stdlib UUID api(libs.bignum) - // api(libs.consul.client) wird getauscht mir spring-cloud-starter-consul-discovery api(libs.spring.cloud.starter.consul.discovery) api(libs.kotlin.logging.jvm) api(libs.jakarta.annotation.api) api(libs.auth0.java.jwt) + + // Logging: WICHTIG! Core und Classic müssen synchronisiert sein. api(libs.logback.classic) + api(libs.logback.core) + // --- Spring & SpringDoc --- api(libs.springdoc.openapi.starter.common) - // KORREKTUR: `webmvc`-Starter durch `webflux`-Starter ersetzt, um Konflikt zu beheben. api(libs.springdoc.openapi.starter.webflux.ui) + // --- Database & Persistence --- - // Exposed Bundle wieder aktiviert, da Version jetzt kompatibel ist api(libs.exposed.core) api(libs.exposed.dao) api(libs.exposed.jdbc) api(libs.exposed.kotlin.datetime) - // Flyway Bundle kann nicht direkt in constraints verwendet werden, müssen einzeln gelistet werden api(libs.flyway.core) api(libs.flyway.postgresql) @@ -57,16 +54,19 @@ dependencies { api(libs.hikari.cp) api(libs.h2.driver) api(libs.lettuce.core) + // --- Kotlinx Libraries --- api(libs.kotlinx.serialization.json) api(libs.kotlinx.datetime) + // --- Jackson Modules --- api(libs.jackson.module.kotlin) api(libs.jackson.datatype.jsr310) - // --- Ktor OpenAPI (runtime-based docs require explicit routing-openapi in 3.4.0) --- + + // --- Ktor OpenAPI --- api("io.ktor:ktor-server-routing-openapi:${libs.versions.ktor.get()}") + // --- Testcontainers --- - // Testcontainers Bundle kann nicht direkt in constraints verwendet werden api(libs.testcontainers.core) api(libs.testcontainers.junit.jupiter) api(libs.testcontainers.postgresql) diff --git a/platform/platform-testing/build.gradle.kts b/platform/platform-testing/build.gradle.kts index 095be3b6..512e8e9f 100644 --- a/platform/platform-testing/build.gradle.kts +++ b/platform/platform-testing/build.gradle.kts @@ -1,38 +1,34 @@ // Dieses Modul bündelt alle für JVM-Tests notwendigen Abhängigkeiten. // Jedes Modul, das Tests enthält, sollte dieses Modul mit `testImplementation` einbinden. plugins { - alias(libs.plugins.kotlinJvm) + alias(libs.plugins.kotlinJvm) } dependencies { - // Importiert die zentrale BOM für konsistente Versionen. - api(platform(projects.platform.platformBom)) - // Diese Bundles sind in `libs.versions.toml` definiert. - // api(libs.bundles.testing.jvm) - api(libs.junit.jupiter.api) - api(libs.junit.jupiter.engine) - api(libs.junit.jupiter.params) - api(libs.junit.platform.launcher) - api(libs.mockk) - api(libs.assertj.core) - api(libs.kotlinx.coroutines.test) + // Importiert die zentrale BOM für konsistente Versionen. + api(platform(projects.platform.platformBom)) - // api(libs.bundles.testcontainers) - api(libs.testcontainers.core) - api(libs.testcontainers.junit.jupiter) - api(libs.testcontainers.postgresql) - api(libs.testcontainers.keycloak) + // Testing Libraries + api(libs.junit.jupiter.api) + api(libs.junit.jupiter.engine) + api(libs.junit.jupiter.params) + api(libs.junit.platform.launcher) + api(libs.mockk) + api(libs.assertj.core) + api(libs.kotlinx.coroutines.test) - // Macht Kafka- und Reactor-Test-Bibliotheken verfügbar - api(libs.testcontainers.kafka) - api(libs.reactor.test) - // Stellt Spring Boot Test-Abhängigkeiten und die H2-Datenbank für Tests bereit. - api(libs.spring.boot.starter.test) - api(libs.h2.driver) -} - -tasks.withType { - useJUnitPlatform() - // Removed parallel execution and byte-buddy agent configuration to prevent conflicts - // with global test configuration in root build.gradle.kts + // Logging für Tests (wichtig, um NoClassDefFoundError bei Logback zu vermeiden) + api(libs.logback.classic) + + // Testcontainers + api(libs.testcontainers.core) + api(libs.testcontainers.junit.jupiter) + api(libs.testcontainers.postgresql) + api(libs.testcontainers.keycloak) + api(libs.testcontainers.kafka) + + // Reactor & Spring Testing + api(libs.reactor.test) + api(libs.spring.boot.starter.test) + api(libs.h2.driver) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 88086d85..bafdafe3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,23 +5,16 @@ pluginManagement { repositories { gradlePluginPortal() mavenCentral() - google() // Removed content filtering to ensure all artifacts are found + google() maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") maven("https://us-central1-maven.pkg.dev/varabyte-repos/public") - maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") } // Added snapshots for plugins - } - plugins { - // Centralized Plugin Version Management - // This allows subprojects to apply plugins without versions, avoiding conflicts. - id("org.jetbrains.kotlin.multiplatform") version "2.3.0" - id("org.jetbrains.kotlin.plugin.serialization") version "2.3.0" - id("org.jetbrains.compose") version "1.10.0" - id("org.jetbrains.kotlin.plugin.compose") version "2.3.0" - id("app.cash.sqldelight") version "2.2.1" + maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") } } } plugins { + // Settings plugins cannot easily use version catalogs because the catalog is loaded + // as part of the settings evaluation. We must hardcode the version here. id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } @@ -95,7 +88,7 @@ include(":docs") // ========================================================================== // --- CORE --- // frontend/core/auth -include(":frontend:core:auth") // MOVED from features +include(":frontend:core:auth") include(":frontend:core:domain") include(":frontend:core:design-system") include(":frontend:core:navigation")