meldestelle/gradle-dependency-resolution-fix.md
2025-08-17 00:15:29 +02:00

5.8 KiB

Gradle Dependency Resolution Fix für Docker Build

Problemanalyse

Der Docker Build für den api-gateway Service schlug fehl mit folgendem Fehler:

> No matching variant of project :infrastructure:auth:auth-client was found. The consumer was configured to find a library for use during runtime, compatible with Java 21, packaged as a jar, preferably optimized for standard JVMs, and its dependencies declared externally, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'jvm' but:
  - No variants exist.

Das gleiche Problem trat auch bei :infrastructure:monitoring:monitoring-client auf.

Grundursache

Die Bibliotheksmodule auth-client und monitoring-client waren nicht korrekt als Gradle-Bibliotheken konfiguriert und exponierten keine konsumierbare Varianten (API/Runtime) für abhängige Projekte wie das api-gateway.

Angewendete Lösungen

1. Auth-Client Modul konfiguriert

Datei: /infrastructure/auth/auth-client/build.gradle.kts

Vorher:

plugins {
    alias(libs.plugins.kotlin.jvm)
    alias(libs.plugins.kotlin.spring)
    alias(libs.plugins.kotlin.serialization)
    alias(libs.plugins.spring.boot)  // ❌ Falsch für Bibliotheksmodul
    alias(libs.plugins.spring.dependencyManagement)
}

// Manuelle JAR-Konfiguration erforderlich
tasks.getByName<org.springframework.boot.gradle.tasks.bundling.BootJar>("bootJar") {
    enabled = false
}
tasks.getByName<Jar>("jar") {
    enabled = true
}

Nachher:

plugins {
    `java-library`  // ✅ Erzeugt automatisch API/Runtime Varianten
    alias(libs.plugins.kotlin.jvm)
    alias(libs.plugins.kotlin.spring)
    alias(libs.plugins.kotlin.serialization)
    // Spring Boot Plugin entfernt ✅
    alias(libs.plugins.spring.dependencyManagement)
}

// JAR-Konfiguration automatisch durch java-library Plugin ✅

2. Monitoring-Client Modul konfiguriert

Datei: /infrastructure/monitoring/monitoring-client/build.gradle.kts

Vorher:

plugins {
    alias(libs.plugins.kotlin.jvm)
    alias(libs.plugins.kotlin.spring)
    alias(libs.plugins.spring.dependencyManagement)
    // Kein java-library Plugin ❌
}

Nachher:

plugins {
    `java-library`  // ✅ Hinzugefügt für Varianten-Exposition
    alias(libs.plugins.kotlin.jvm)
    alias(libs.plugins.kotlin.spring)
    alias(libs.plugins.spring.dependencyManagement)
}

3. Gradle Projekt-Struktur vervollständigt

Erstellt fehlende parent build.gradle Dateien für korrekte Multi-Modul-Struktur:

  • /infrastructure/build.gradle
  • /infrastructure/auth/build.gradle
  • /infrastructure/monitoring/build.gradle

Diese Dateien sind minimal und dienen als Container für Subprojekte:

// Infrastructure Module Container
// This is a container module for infrastructure-related subprojects

Technische Details

Was das java-library Plugin bewirkt:

  • Automatische Varianten-Erstellung: Erstellt apiElements und runtimeElements Konfigurationen
  • Konsumierbare Artefakte: Andere Projekte können diese Module als Abhängigkeiten verwenden
  • Transitive Abhängigkeiten: Korrekte Behandlung von API vs. Implementation Dependencies
  • JAR-Erstellung: Automatisches Erstellen von Standard-JAR-Dateien (nicht executable)

Warum Spring Boot Plugin entfernt wurde:

  • Spring Boot Plugin ist für ausführbare Anwendungen gedacht, nicht für Bibliotheken
  • Erzeugt bootJar statt Standard-JAR, was für Bibliotheken ungeeignet ist
  • Verhindert die Erstellung konsumierbarer Gradle-Varianten

Multi-Modul-Struktur:

infrastructure/
├── build.gradle                    # Container
├── auth/
│   ├── build.gradle               # Container
│   └── auth-client/
│       └── build.gradle.kts       # Bibliothek mit java-library
└── monitoring/
    ├── build.gradle               # Container
    └── monitoring-client/
        └── build.gradle.kts       # Bibliothek mit java-library

Verifikation

Gradle-Konfiguration prüfen:

# Projekt-Struktur anzeigen
./gradlew projects

# Abhängigkeiten anzeigen
./gradlew :infrastructure:gateway:dependencies

# Varianten prüfen
./gradlew :infrastructure:auth:auth-client:outgoingVariants
./gradlew :infrastructure:monitoring:monitoring-client:outgoingVariants

Docker Build testen:

# Sauberer Build ohne Cache
docker-compose -f docker-compose.yml -f docker-compose.services.yml build --no-cache api-gateway

# Vollständiger Stack
docker-compose \
  -f docker-compose.yml \
  -f docker-compose.services.yml \
  -f docker-compose.clients.yml \
  up -d --build

Erwartetes Ergebnis

Nach Anwendung dieser Konfigurationen sollten:

  1. auth-client und monitoring-client korrekte Gradle-Varianten exponieren
  2. api-gateway diese Module erfolgreich als Abhängigkeiten auflösen können
  3. Docker Build ohne "No variants exist" Fehler durchlaufen
  4. Alle Services korrekt starten und funktionieren

Zusätzliche Hinweise

  • BOM-Management: Die zentrale Versionierung über platform-bom bleibt unverändert
  • Dependency Management: Spring Dependency Management Plugin sorgt für konsistente Versionen
  • Kotlin Multiplatform: Core-Module verwenden weiterhin Kotlin Multiplatform Plugin
  • Testing: Platform-Testing Bundle stellt einheitliche Test-Dependencies bereit

Rollback (falls nötig)

Um die Änderungen rückgängig zu machen:

git checkout HEAD -- infrastructure/auth/auth-client/build.gradle.kts
git checkout HEAD -- infrastructure/monitoring/monitoring-client/build.gradle.kts
rm infrastructure/build.gradle
rm infrastructure/auth/build.gradle
rm infrastructure/monitoring/build.gradle

Status: IMPLEMENTIERT

Alle Konfigurationsänderungen wurden angewendet und sind bereit für Testing.