From 11847af074af2c8581fe3c1502065fe0467963d7 Mon Sep 17 00:00:00 2001 From: Savosin Denis Date: Thu, 6 Nov 2025 14:11:36 +0700 Subject: [PATCH] refactor libs.versions.toml --- .gitignore | 1 + build.gradle.kts | 54 ++++++------ core/build.gradle.kts | 6 +- db/build.gradle.kts | 14 +-- edge-consuming/build.gradle.kts | 10 +-- edge-contracts/build.gradle.kts | 11 ++- edge-integration/build.gradle.kts | 8 +- .../edgeintegration/client/neko/ClientImpl.kt | 38 +++++--- edge-producing/build.gradle.kts | 10 +-- edge-rest/build.gradle.kts | 4 +- gradle/libs.versions.toml | 86 +++++++++---------- 11 files changed, 128 insertions(+), 114 deletions(-) diff --git a/.gitignore b/.gitignore index 4e1e696..8980a9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .gradle build/ +gradle.properties !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ diff --git a/build.gradle.kts b/build.gradle.kts index 6fe61e1..511edf9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,13 +2,13 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { idea - alias(libs.plugins.kotlin.kover) - alias(libs.plugins.kotlin.jpa) - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.kotlin.serialization) - alias(libs.plugins.kotlin.spring) - alias(libs.plugins.spring.boot) - alias(libs.plugins.spring.dependencyManagement) + alias(libs.plugins.io.spring.dependency.management) + alias(libs.plugins.org.jetbrains.kotlin.jvm) + alias(libs.plugins.org.jetbrains.kotlin.plugin.jpa) + alias(libs.plugins.org.jetbrains.kotlin.plugin.serialization) + alias(libs.plugins.org.jetbrains.kotlin.plugin.spring) + alias(libs.plugins.org.jetbrains.kotlinx.kover) + alias(libs.plugins.org.springframework.boot) } group = "com.github.dannecron.demo" @@ -16,15 +16,15 @@ version = "single-version" allprojects { apply { - plugin(rootProject.libs.plugins.kotlin.jvm.get().pluginId) - plugin(rootProject.libs.plugins.kotlin.serialization.get().pluginId) - plugin(rootProject.libs.plugins.kotlin.kover.get().pluginId) - plugin(rootProject.libs.plugins.spring.boot.get().pluginId) + plugin(rootProject.libs.plugins.org.jetbrains.kotlin.jvm.get().pluginId) + plugin(rootProject.libs.plugins.org.jetbrains.kotlin.plugin.serialization.get().pluginId) + plugin(rootProject.libs.plugins.org.jetbrains.kotlinx.kover.get().pluginId) + plugin(rootProject.libs.plugins.org.springframework.boot.get().pluginId) plugin("java") } - plugins.withId("org.jetbrains.kotlinx.kover") { + plugins.withId(rootProject.libs.plugins.org.jetbrains.kotlinx.kover.get().pluginId) { tasks.named("koverXmlReport") { dependsOn(tasks.test) } @@ -48,17 +48,17 @@ allprojects { } dependencies { - runtimeOnly(rootProject.libs.micrometer.registry.prometheus) + runtimeOnly(rootProject.libs.io.micrometer.micrometer.registry.prometheus) implementation(rootProject.libs.bundles.tracing) - implementation(rootProject.libs.kotlin.reflect) - implementation(rootProject.libs.kotlinx.serialization.json) - implementation(rootProject.libs.logback.encoder) - implementation(rootProject.libs.springFramework.aspects) + implementation(rootProject.libs.net.logstash.logback.logstash.logback.encoder) + implementation(rootProject.libs.org.jetbrains.kotlin.kotlin.reflect) + implementation(rootProject.libs.org.jetbrains.kotlinx.kotlinx.serialization.json) + implementation(rootProject.libs.org.springframework.spring.aspects) - testImplementation(rootProject.libs.kotlin.test.junit) - testImplementation(rootProject.libs.mockito.kotlin) - testImplementation(rootProject.libs.springBoot.starter.test) + testImplementation(rootProject.libs.org.jetbrains.kotlin.kotlin.test.junit5) + testImplementation(rootProject.libs.org.mockito.kotlin.mockito.kotlin) + testImplementation(rootProject.libs.org.springframework.boot.spring.boot.starter.test) } tasks.test { @@ -71,9 +71,9 @@ allprojects { subprojects { apply { - plugin(rootProject.libs.plugins.kotlin.spring.get().pluginId) - plugin(rootProject.libs.plugins.spring.boot.get().pluginId) - plugin(rootProject.libs.plugins.spring.dependencyManagement.get().pluginId) + plugin(rootProject.libs.plugins.io.spring.dependency.management.get().pluginId) + plugin(rootProject.libs.plugins.org.jetbrains.kotlin.plugin.spring.get().pluginId) + plugin(rootProject.libs.plugins.org.springframework.boot.get().pluginId) } tasks.bootJar { @@ -90,12 +90,12 @@ dependencies { implementation(project(":edge-consuming")) implementation(project(":edge-rest")) - implementation(libs.springBoot.starter.mustache) - implementation(libs.springBoot.starter.web) + implementation(libs.org.springframework.boot.spring.boot.starter.mustache) + implementation(libs.org.springframework.boot.spring.boot.starter.web) - testImplementation(libs.archUnit.junit) + testImplementation(libs.com.tngtech.archunit.archunit.junit5) - developmentOnly(libs.springBoot.devtools) + developmentOnly(libs.org.springframework.boot.spring.boot.devtools) kover(project(":edge-contracts")) kover(project(":db")) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index fb3dd5f..37fcde1 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -3,8 +3,8 @@ dependencies { implementation(project(":edge-producing")) implementation(project(":edge-integration")) - implementation(rootProject.libs.springBoot.starter.actuator) - implementation(rootProject.libs.springData.commons) + implementation(rootProject.libs.org.springframework.boot.spring.boot.starter.actuator) + implementation(rootProject.libs.org.springframework.data.spring.data.commons) - testImplementation(rootProject.libs.springBoot.starter.actuatorAutoconfigure) + testImplementation(rootProject.libs.org.springframework.boot.spring.boot.starter.actuator.autoconfigure) } diff --git a/db/build.gradle.kts b/db/build.gradle.kts index 8cdaf4f..ae4e409 100644 --- a/db/build.gradle.kts +++ b/db/build.gradle.kts @@ -1,13 +1,13 @@ plugins { - alias(libs.plugins.kotlin.jpa) + alias(libs.plugins.org.jetbrains.kotlin.plugin.jpa) } dependencies { - implementation(rootProject.libs.flyway.core) - implementation(rootProject.libs.postgres) - implementation(rootProject.libs.springBoot.starter.jdbc) + implementation(rootProject.libs.org.flywaydb.flyway.core) + implementation(rootProject.libs.org.postgresql.postgresql) + implementation(rootProject.libs.org.springframework.boot.spring.boot.starter.data.jdbc) - testImplementation(libs.testcontainers) - testImplementation(libs.testcontainers.junit.jupiter) - testImplementation(libs.testcontainers.postgresql) + testImplementation(libs.org.testcontainers.junit.jupiter) + testImplementation(libs.org.testcontainers.postgresql) + testImplementation(libs.org.testcontainers.testcontainers) } diff --git a/edge-consuming/build.gradle.kts b/edge-consuming/build.gradle.kts index 5a9cb4c..becc30a 100644 --- a/edge-consuming/build.gradle.kts +++ b/edge-consuming/build.gradle.kts @@ -2,10 +2,10 @@ dependencies { implementation(project(":edge-contracts")) implementation(project(":core")) - implementation(rootProject.libs.jackson.datatype.jsr) - implementation(rootProject.libs.jackson.module.kotlin) - implementation(rootProject.libs.springCloud.starter.streamKafka) - implementation(rootProject.libs.springCloud.stream) + implementation(rootProject.libs.com.fasterxml.jackson.datatype.jackson.datatype.jsr310) + implementation(rootProject.libs.com.fasterxml.jackson.module.jackson.module.kotlin) + implementation(rootProject.libs.org.springframework.cloud.spring.cloud.starter.stream.kafka) + implementation(rootProject.libs.org.springframework.cloud.spring.cloud.stream) - testImplementation(rootProject.libs.springCloud.streamTestBinder) + testImplementation(rootProject.libs.org.springframework.cloud.spring.cloud.stream.test.binder) } diff --git a/edge-contracts/build.gradle.kts b/edge-contracts/build.gradle.kts index 8b491d0..941c4f7 100644 --- a/edge-contracts/build.gradle.kts +++ b/edge-contracts/build.gradle.kts @@ -1,8 +1,7 @@ dependencies { - implementation(rootProject.libs.json.schema.validator) - implementation(rootProject.libs.springBoot.starter.web) - implementation(rootProject.libs.springData.commons) - implementation(rootProject.libs.springDoc.openapi.starter) - implementation(rootProject.libs.springCloud.stream) - + implementation(rootProject.libs.io.github.optimumcode.json.schema.validator) + implementation(rootProject.libs.org.springdoc.springdoc.openapi.starter.webmvc.ui) + implementation(rootProject.libs.org.springframework.boot.spring.boot.starter.web) + implementation(rootProject.libs.org.springframework.cloud.spring.cloud.stream) + implementation(rootProject.libs.org.springframework.data.spring.data.commons) } diff --git a/edge-integration/build.gradle.kts b/edge-integration/build.gradle.kts index 1ee36da..9913887 100644 --- a/edge-integration/build.gradle.kts +++ b/edge-integration/build.gradle.kts @@ -1,7 +1,7 @@ dependencies { - implementation(rootProject.libs.springFramework.context) - implementation(rootProject.libs.ktor.client.cio) - implementation(rootProject.libs.ktor.client.core) + implementation(rootProject.libs.io.ktor.ktor.client.cio) + implementation(rootProject.libs.io.ktor.ktor.client.core) + implementation(rootProject.libs.org.springframework.spring.context) - testImplementation(rootProject.libs.ktor.client.mock) + testImplementation(rootProject.libs.io.ktor.ktor.client.mock) } diff --git a/edge-integration/src/main/kotlin/com/github/dannecron/demo/edgeintegration/client/neko/ClientImpl.kt b/edge-integration/src/main/kotlin/com/github/dannecron/demo/edgeintegration/client/neko/ClientImpl.kt index 0930a59..fdb839d 100644 --- a/edge-integration/src/main/kotlin/com/github/dannecron/demo/edgeintegration/client/neko/ClientImpl.kt +++ b/edge-integration/src/main/kotlin/com/github/dannecron/demo/edgeintegration/client/neko/ClientImpl.kt @@ -5,43 +5,57 @@ import com.github.dannecron.demo.edgeintegration.client.neko.dto.ImagesResponse import com.github.dannecron.demo.edgeintegration.client.neko.exceptions.RequestException import io.ktor.client.HttpClient import io.ktor.client.engine.HttpClientEngine +import io.ktor.client.plugins.defaultRequest import io.ktor.client.request.get import io.ktor.client.statement.bodyAsText import io.ktor.http.path import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json -import org.springframework.stereotype.Service class ClientImpl( engine: HttpClientEngine, private val baseUrl: String, ): Client { - private val httpClient = HttpClient(engine) + private val httpClient = HttpClient(engine) { + defaultRequest { + url(baseUrl) + } + } override fun getCategories() = runBlocking { - httpClient.get(urlString = baseUrl) { + httpClient.get { url { path("/api/v2/endpoints") } } - .takeIf { it.status.value in 200..209 } - ?.let { - response -> Json.decodeFromString>(response.bodyAsText()).keys + .let { response -> + val responseBody = response.bodyAsText() + if (response.status.value in 200..209) { + Json.decodeFromString>(responseBody).keys + } else { + throw RequestException( + "get categories error. Status: ${response.status.value}, response: $responseBody" + ) + } } - ?: throw RequestException("get categories error") } override fun getImages(category: String, amount: Int) = runBlocking { - httpClient.get(urlString = baseUrl) { + httpClient.get { url { path("/api/v2/$category") parameters.append("amount", amount.toString()) } } - .takeIf { it.status.value in 200..209 } - ?.let { - response -> Json.decodeFromString(response.bodyAsText()) + .let { response -> + val responseBody = response.bodyAsText() + if (response.status.value in 200..209) { + Json.decodeFromString(responseBody) + } else { + throw RequestException( + "get images error. Status: ${response.status.value}, response: $responseBody" + ) + } } - ?: throw RequestException("get images error") } } diff --git a/edge-producing/build.gradle.kts b/edge-producing/build.gradle.kts index b4c7c88..03ae634 100644 --- a/edge-producing/build.gradle.kts +++ b/edge-producing/build.gradle.kts @@ -1,10 +1,10 @@ dependencies { implementation(project(":edge-contracts")) - implementation(rootProject.libs.jackson.datatype.jsr) - implementation(rootProject.libs.jackson.module.kotlin) - implementation(rootProject.libs.springBoot.starter.validation) - implementation(rootProject.libs.springCloud.starter.streamKafka) + implementation(rootProject.libs.com.fasterxml.jackson.datatype.jackson.datatype.jsr310) + implementation(rootProject.libs.com.fasterxml.jackson.module.jackson.module.kotlin) + implementation(rootProject.libs.org.springframework.boot.spring.boot.starter.validation) + implementation(rootProject.libs.org.springframework.cloud.spring.cloud.starter.stream.kafka) - testImplementation(rootProject.libs.springCloud.streamTestBinder) + testImplementation(rootProject.libs.org.springframework.cloud.spring.cloud.stream.test.binder) } diff --git a/edge-rest/build.gradle.kts b/edge-rest/build.gradle.kts index b6bf86d..f25c722 100644 --- a/edge-rest/build.gradle.kts +++ b/edge-rest/build.gradle.kts @@ -2,6 +2,6 @@ dependencies { implementation(project(":edge-contracts")) implementation(project(":core")) - implementation(rootProject.libs.springBoot.starter.web) - implementation(rootProject.libs.springData.commons) + implementation(rootProject.libs.org.springframework.boot.spring.boot.starter.web) + implementation(rootProject.libs.org.springframework.data.spring.data.commons) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2ad22ea..ade589c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,50 +7,50 @@ spring-cloud = "4.1.5" testcontainers = "1.19.7" [libraries] -archUnit-junit = { module = "com.tngtech.archunit:archunit-junit5", version = "1.4.1" } -flyway-core = { module = "org.flywaydb:flyway-core", version = "9.22.3" } -jackson-datatype-jsr = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson" } -jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" } -json-schema-validator = { module = "io.github.optimumcode:json-schema-validator", version = "0.2.3"} -kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } -kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit5", version.ref = "kotlin" } -kotlinx-serialization-json = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3" -ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor"} -ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor"} -ktor-client-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor"} -logback-encoder = { module = "net.logstash.logback:logstash-logback-encoder", version = "8.0" } -micrometer-bridge-otel = { module = "io.micrometer:micrometer-tracing-bridge-otel"} -micrometer-registry-prometheus = { module = "io.micrometer:micrometer-registry-prometheus" } -mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version = "5.4.0" } -otel-exporter = { module = "io.opentelemetry:opentelemetry-exporter-otlp" } -postgres = { module = "org.postgresql:postgresql", version = "42.7.5" } -springFramework-context = { module = "org.springframework:spring-context"} -springFramework-aspects = { module = "org.springframework:spring-aspects" } -springBoot-devtools = { module = "org.springframework.boot:spring-boot-devtools" } -springBoot-starter-actuator = { module = "org.springframework.boot:spring-boot-starter-actuator", version.ref = "spring-boot" } -springBoot-starter-actuatorAutoconfigure = { module = "org.springframework.boot:spring-boot-actuator-autoconfigure" } -springBoot-starter-jdbc = { module = "org.springframework.boot:spring-boot-starter-data-jdbc", version.ref = "spring-boot"} -springBoot-starter-mustache = { module = "org.springframework.boot:spring-boot-starter-mustache", version.ref = "spring-boot" } -springBoot-starter-test = { module = "org.springframework.boot:spring-boot-starter-test", version.ref = "spring-boot" } -springBoot-starter-validation = { module = "org.springframework.boot:spring-boot-starter-validation", version.ref = "spring-boot" } -springBoot-starter-web = { module = "org.springframework.boot:spring-boot-starter-web", version.ref = "spring-boot" } -springCloud-starter-streamKafka = { module = "org.springframework.cloud:spring-cloud-starter-stream-kafka", version.ref = "spring-cloud"} -springCloud-stream = { module = "org.springframework.cloud:spring-cloud-stream", version.ref = "spring-cloud"} -springCloud-streamTestBinder = { module = "org.springframework.cloud:spring-cloud-stream-test-binder", version.ref = "spring-cloud"} -springData-commons = { module = "org.springframework.data:spring-data-commons", version.ref = "spring-boot" } -springDoc-openapi-starter = "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0" -testcontainers = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers"} -testcontainers-junit-jupiter = { module = "org.testcontainers:junit-jupiter", version.ref = "testcontainers"} -testcontainers-postgresql = { module = "org.testcontainers:postgresql", version.ref = "testcontainers"} +com-fasterxml-jackson-datatype-jackson_datatype_jsr310 = { group = "com.fasterxml.jackson.datatype", name = "jackson-datatype-jsr310", version.ref = "jackson" } +com-fasterxml-jackson-module-jackson_module_kotlin = { group = "com.fasterxml.jackson.module", name = "jackson-module-kotlin", version.ref = "jackson" } +com-tngtech-archunit-archunit_junit5 = { group = "com.tngtech.archunit", name = "archunit-junit5", version = "1.4.1" } +io-github-optimumcode-json_schema_validator = { group = "io.github.optimumcode", name = "json-schema-validator", version = "0.5.2" } +io-ktor-ktor_client_cio = { group = "io.ktor", name = "ktor-client-cio", version.ref = "ktor" } +io-ktor-ktor_client_core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" } +io-ktor-ktor_client_mock = { group = "io.ktor", name = "ktor-client-mock", version.ref = "ktor" } +io-micrometer-micrometer_registry_prometheus = { group = "io.micrometer", name = "micrometer-registry-prometheus" } +io-micrometer-micrometer_tracing_bridge_otel = { group = "io.micrometer", name = "micrometer-tracing-bridge-otel" } +io-opentelemetry-opentelemetry_exporter_otlp = { group = "io.opentelemetry", name = "opentelemetry-exporter-otlp" } +net-logstash-logback-logstash_logback_encoder = { group = "net.logstash.logback", name = "logstash-logback-encoder", version = "8.0" } +org-flywaydb-flyway_core = { group = "org.flywaydb", name = "flyway-core", version = "9.22.3" } +org-jetbrains-kotlin-kotlin_reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } +org-jetbrains-kotlin-kotlin_test_junit5 = { group = "org.jetbrains.kotlin", name = "kotlin-test-junit5", version.ref = "kotlin" } +org-jetbrains-kotlinx-kotlinx_serialization_json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version = "1.6.3" } +org-mockito-kotlin-mockito_kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version = "5.4.0" } +org-postgresql-postgresql = { group = "org.postgresql", name = "postgresql", version = "42.7.5" } +org-springdoc-springdoc_openapi_starter_webmvc_ui = { group = "org.springdoc", name = "springdoc-openapi-starter-webmvc-ui", version = "2.6.0" } +org-springframework-boot-spring_boot_devtools = { group = "org.springframework.boot", name = "spring-boot-devtools" } +org-springframework-boot-spring_boot_starter_actuator = { group = "org.springframework.boot", name = "spring-boot-starter-actuator", version.ref = "spring-boot" } +org-springframework-boot-spring_boot_starter_actuator_autoconfigure = { group = "org.springframework.boot", name = "spring-boot-actuator-autoconfigure" } +org-springframework-boot-spring_boot_starter_data_jdbc = { group = "org.springframework.boot", name = "spring-boot-starter-data-jdbc", version.ref = "spring-boot" } +org-springframework-boot-spring_boot_starter_mustache = { group = "org.springframework.boot", name = "spring-boot-starter-mustache", version.ref = "spring-boot"} +org-springframework-boot-spring_boot_starter_test = { group = "org.springframework.boot", name = "spring-boot-starter-test", version.ref = "spring-boot"} +org-springframework-boot-spring_boot_starter_validation = { group = "org.springframework.boot", name = "spring-boot-starter-validation", version.ref = "spring-boot"} +org-springframework-boot-spring_boot_starter_web = { group = "org.springframework.boot", name = "spring-boot-starter-web", version.ref = "spring-boot"} +org-springframework-cloud-spring_cloud_starter_stream_kafka = { group = "org.springframework.cloud", name = "spring-cloud-starter-stream-kafka", version.ref = "spring-cloud"} +org-springframework-cloud-spring_cloud_stream = { group = "org.springframework.cloud", name = "spring-cloud-stream", version.ref = "spring-cloud" } +org-springframework-cloud-spring_cloud_stream_test_binder = { group = "org.springframework.cloud", name = "spring-cloud-stream-test-binder", version.ref = "spring-cloud" } +org-springframework-data-spring_data_commons = { group = "org.springframework.data", name = "spring-data-commons", version.ref = "spring-boot" } +org-springframework-spring_aspects = { group = "org.springframework", name = "spring-aspects" } +org-springframework-spring_context = { group = "org.springframework", name = "spring-context"} +org-testcontainers-junit_jupiter = { group = "org.testcontainers", name = "junit-jupiter", version.ref = "testcontainers" } +org-testcontainers-postgresql = { group = "org.testcontainers", name = "postgresql", version.ref = "testcontainers" } +org-testcontainers-testcontainers = { group = "org.testcontainers", name = "testcontainers", version.ref = "testcontainers" } [bundles] -tracing = ["micrometer-bridge-otel", "otel-exporter"] +tracing = ["io-micrometer-micrometer_tracing_bridge_otel", "io-opentelemetry-opentelemetry_exporter_otlp"] [plugins] -kotlin-kover = { id = "org.jetbrains.kotlinx.kover", version = "0.8.3" } -kotlin-jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" } -kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } -kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -kotlin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" } -spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" } -spring-dependencyManagement = { id = "io.spring.dependency-management", version = "1.1.7"} +io-spring-dependency-management = { id = "io.spring.dependency-management", version = "1.1.7" } +org-jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +org-jetbrains-kotlin-plugin-jpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" } +org-jetbrains-kotlin-plugin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +org-jetbrains-kotlin-plugin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" } +org-jetbrains-kotlinx-kover = { id = "org.jetbrains.kotlinx.kover", version = "0.8.3" } +org-springframework-boot = { id = "org.springframework.boot", version.ref = "spring-boot" }