Ich arbeite derzeit an einem Projekt mit einem Backend in Kotlin Springboot mit OpenApi-generierter API (in YAML), das ich mit einem Android Jetpack Compose-Client verbinden möchte.
Was ich Ich möchte aus meinem Backend-Projekt den openApi-Client als Jar-Kotlin-Abhängigkeit generieren und ihn in mein Client-Projekt importieren.
Hier ist der Backend-Gradle-Build, um die Phase „Client-Generierung / jar-Verpackung / Maven Local Publishing':
Backend-Client-Generierung:
Code: Select all
tasks.register("generateKotlinClient", org.openapitools.generator.gradle.plugin.tasks.GenerateTask::class) {
generatorName.set("kotlin")
inputSpec.set("$rootDir/src/main/resources/api/api.yaml")
outputDir.set(layout.buildDirectory.dir("generated/grimoire-server-client").get().asFile.path)
invokerPackage.set("com.com.corbz.grimoire.backend.client")
packageName.set("com.com.corbz.grimoire.backend.client")
apiPackage.set("com.com.corbz.grimoire.backend.client.api")
modelPackage.set("com.com.corbz.grimoire.backend.client.model")
generateApiDocumentation.set(false)
generateModelDocumentation.set(false)
generateApiTests.set(false)
generateModelTests.set(false)
configOptions.set(
mapOf(
"sourceFolder" to "."
)
)
}
tasks.register("packageClientJar", Jar::class) {
group = "build"
val generatedClientDir = layout.buildDirectory.dir("generated/grimoire-server-client/com").get().asFile
from(generatedClientDir)
archiveBaseName.set("grimoire-backend-client")
archiveVersion.set("1.0.0")
destinationDirectory.set(layout.buildDirectory.dir("libs").get().asFile)
}
publishing {
publications {
create("grimoireBackendClient") {
groupId = "com.corbz"
artifactId = "grimoire-backend-client"
version = "1.0.0"
artifact(tasks.named("packageClientJar").get()) {
builtBy(tasks.named("packageClientJar"))
}
}
}
repositories {
maven {
name = "local"
url = uri("${System.getProperty("user.home")}/.m2/repository")
}
}
}
Es generiert mir ein JAR mit einem Paketordner und einem Manifestordner. Mein Android-Projekt ist mit einem Haupt-Build.gradle.kts / Setting.gradle.kts organisiert und mein Code befindet sich in einem App-Paket mit seinem eigenen Build.gradle.kts / Setting.gradle.kts. Im build.gradle.kts aus dem App-Paket wird meine Bibliothek folgendermaßen importiert (ich habe nicht die gesamte Datei mit allen Abhängigkeiten abgelegt, aber so importiere ich die Client-Abhängigkeit):
Code: Select all
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
android {
namespace = "com.corbz.grmoire.android"
compileSdk = 35
defaultConfig {
applicationId = "com.corbz.grmoire.android"
minSdk = 24
targetSdk = 35
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
compose = true
}
}
dependencies {
// Business dependencies --------------------------
implementation(libs.grimoire.backend.client)
implementation(libs.moshi)
implementation(libs.moshi.kotlin)
// ------------------------------------------------
}
Aus einem Grund, den ich nicht verstehe, wird die Bibliothek erkannt. Ich kann das Paket wie folgt importieren:
Code: Select all
package com.corbz.grmoire.android.config
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
import com.corbz.grimoire.backend.client.model.*
@HiltAndroidApp
class GrimoireApplication: Application() {
}
Aber wenn ich versuche, zum Beispiel ein GrimoireDto aus diesem Paket zu importieren, wird es nicht erkannt. Hier ist die generierte Klasse (kt) für mein GrimoireDto aus der openApi-Client-Abhängigkeit:
Code: Select all
@file:Suppress(
"ArrayInDataClass",
"EnumEntryName",
"RemoveRedundantQualifierName",
"UnusedImport"
)
package com.com.corbz.grimoire.backend.client.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
*
*
* @param code Unique identifier for the grimoire.
* @param creationDate The creation date of the grimoire.
* @param lastUpdateDate The last update date of the grimoire.
*/
data class GrimoireDto (
/* Unique identifier for the grimoire. */
@Json(name = "code")
val code: kotlin.String,
/* The creation date of the grimoire. */
@Json(name = "creationDate")
val creationDate: java.time.OffsetDateTime,
/* The last update date of the grimoire. */
@Json(name = "lastUpdateDate")
val lastUpdateDate: java.time.OffsetDateTime
) {
}
Ich verstehe nicht, warum diese Kotlin-Klasse nicht importiert werden kann, da es sich um eine .kt-Datei handelt. Für mich ist an der Klasse nichts falsch, ich habe auch versucht, Unterabhängigkeiten zu importieren (wie mochi für den Client), damit alle Abhängigkeiten funktionieren, aber nichts funktioniert.
Ich versuche sogar, mit dem Android-Generator zu generieren (für mich sollte es mit Kotlin Multiplattform funktionieren, aber es war „für die Wissenschaft“), aber das Problem besteht immer noch Die Dasselbe.
Könnten Sie mir helfen, herauszufinden, was bei meiner Generierung/meinem Import nicht stimmt? Ich möchte diesen Client importieren, um die manuelle Codierung des clientseitigen Aufrufs an das Backend zu vermeiden.
Vielen Dank im Voraus, Leute!
Ich arbeite derzeit an einem Projekt mit einem Backend in Kotlin Springboot mit OpenApi-generierter API (in YAML), das ich mit einem Android Jetpack Compose-Client verbinden möchte.
Was ich Ich möchte aus meinem Backend-Projekt den openApi-Client als Jar-Kotlin-Abhängigkeit generieren und ihn in mein Client-Projekt importieren.
Hier ist der Backend-Gradle-Build, um die Phase „Client-Generierung / jar-Verpackung / Maven Local Publishing':
[b]Backend-Client-Generierung:[/b]
[code]tasks.register("generateKotlinClient", org.openapitools.generator.gradle.plugin.tasks.GenerateTask::class) {
generatorName.set("kotlin")
inputSpec.set("$rootDir/src/main/resources/api/api.yaml")
outputDir.set(layout.buildDirectory.dir("generated/grimoire-server-client").get().asFile.path)
invokerPackage.set("com.com.corbz.grimoire.backend.client")
packageName.set("com.com.corbz.grimoire.backend.client")
apiPackage.set("com.com.corbz.grimoire.backend.client.api")
modelPackage.set("com.com.corbz.grimoire.backend.client.model")
generateApiDocumentation.set(false)
generateModelDocumentation.set(false)
generateApiTests.set(false)
generateModelTests.set(false)
configOptions.set(
mapOf(
"sourceFolder" to "."
)
)
}
tasks.register("packageClientJar", Jar::class) {
group = "build"
val generatedClientDir = layout.buildDirectory.dir("generated/grimoire-server-client/com").get().asFile
from(generatedClientDir)
archiveBaseName.set("grimoire-backend-client")
archiveVersion.set("1.0.0")
destinationDirectory.set(layout.buildDirectory.dir("libs").get().asFile)
}
publishing {
publications {
create("grimoireBackendClient") {
groupId = "com.corbz"
artifactId = "grimoire-backend-client"
version = "1.0.0"
artifact(tasks.named("packageClientJar").get()) {
builtBy(tasks.named("packageClientJar"))
}
}
}
repositories {
maven {
name = "local"
url = uri("${System.getProperty("user.home")}/.m2/repository")
}
}
}
[/code]
Es generiert mir ein JAR mit einem Paketordner und einem Manifestordner. Mein Android-Projekt ist mit einem Haupt-Build.gradle.kts / Setting.gradle.kts organisiert und mein Code befindet sich in einem App-Paket mit seinem eigenen Build.gradle.kts / Setting.gradle.kts. Im build.gradle.kts aus dem App-Paket wird meine Bibliothek folgendermaßen importiert (ich habe nicht die gesamte Datei mit allen Abhängigkeiten abgelegt, aber so importiere ich die Client-Abhängigkeit):
[code]plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
android {
namespace = "com.corbz.grmoire.android"
compileSdk = 35
defaultConfig {
applicationId = "com.corbz.grmoire.android"
minSdk = 24
targetSdk = 35
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
compose = true
}
}
dependencies {
// Business dependencies --------------------------
implementation(libs.grimoire.backend.client)
implementation(libs.moshi)
implementation(libs.moshi.kotlin)
// ------------------------------------------------
}
[/code]
Aus einem Grund, den ich nicht verstehe, wird die Bibliothek erkannt. Ich kann das Paket wie folgt importieren:
[code]package com.corbz.grmoire.android.config
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
import com.corbz.grimoire.backend.client.model.*
@HiltAndroidApp
class GrimoireApplication: Application() {
}
[/code]
Aber wenn ich versuche, zum Beispiel ein GrimoireDto aus diesem Paket zu importieren, wird es nicht erkannt. Hier ist die generierte Klasse (kt) für mein GrimoireDto aus der openApi-Client-Abhängigkeit:
[code]@file:Suppress(
"ArrayInDataClass",
"EnumEntryName",
"RemoveRedundantQualifierName",
"UnusedImport"
)
package com.com.corbz.grimoire.backend.client.model
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
*
*
* @param code Unique identifier for the grimoire.
* @param creationDate The creation date of the grimoire.
* @param lastUpdateDate The last update date of the grimoire.
*/
data class GrimoireDto (
/* Unique identifier for the grimoire. */
@Json(name = "code")
val code: kotlin.String,
/* The creation date of the grimoire. */
@Json(name = "creationDate")
val creationDate: java.time.OffsetDateTime,
/* The last update date of the grimoire. */
@Json(name = "lastUpdateDate")
val lastUpdateDate: java.time.OffsetDateTime
) {
}
[/code]
Ich verstehe nicht, warum diese Kotlin-Klasse nicht importiert werden kann, da es sich um eine .kt-Datei handelt. Für mich ist an der Klasse nichts falsch, ich habe auch versucht, Unterabhängigkeiten zu importieren (wie mochi für den Client), damit alle Abhängigkeiten funktionieren, aber nichts funktioniert.
Ich versuche sogar, mit dem Android-Generator zu generieren (für mich sollte es mit Kotlin Multiplattform funktionieren, aber es war „für die Wissenschaft“), aber das Problem besteht immer noch Die Dasselbe.
Könnten Sie mir helfen, herauszufinden, was bei meiner Generierung/meinem Import nicht stimmt? Ich möchte diesen Client importieren, um die manuelle Codierung des clientseitigen Aufrufs an das Backend zu vermeiden.
Vielen Dank im Voraus, Leute!