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

178 lines
5.8 KiB
Markdown

# 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**:
```kotlin
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**:
```kotlin
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**:
```kotlin
plugins {
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.kotlin.spring)
alias(libs.plugins.spring.dependencyManagement)
// Kein java-library Plugin ❌
}
```
**Nachher**:
```kotlin
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:
```gradle
// 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:
```bash
# 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:
```bash
# 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:
```bash
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.