From 90e13bd7e697a39a193fa645fe692f985ca65470 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Fri, 12 Sep 2025 10:54:36 +0300 Subject: [PATCH 01/12] Updated build.gradle --- kora-java-cache-caffeine/build.gradle | 19 ++++--- kora-java-cache-redis/build.gradle | 19 ++++--- kora-java-camunda-engine/build.gradle | 21 +++++--- kora-java-camunda-zeebe-worker/build.gradle | 19 ++++--- kora-java-config-hocon/build.gradle | 20 +++++--- kora-java-config-yaml/build.gradle | 19 ++++--- kora-java-crud-submodule/build.gradle | 5 +- .../kora-java-crud-submodule-app/build.gradle | 31 ++++++----- kora-java-crud/build.gradle | 42 ++++++++------- kora-java-database-cassandra/build.gradle | 19 ++++--- kora-java-database-jdbc/build.gradle | 19 ++++--- kora-java-database-r2dbc/build.gradle | 19 ++++--- kora-java-database-vertx/build.gradle | 19 ++++--- kora-java-graalvm-crud-cassandra/build.gradle | 14 +++-- kora-java-graalvm-crud-jdbc/build.gradle | 14 +++-- kora-java-graalvm-crud-r2dbc/build.gradle | 14 +++-- kora-java-graalvm-crud-vertx/build.gradle | 14 +++-- kora-java-graalvm-kafka/build.gradle | 14 +++-- kora-java-grpc-client/build.gradle | 41 ++++++++------- kora-java-grpc-server/build.gradle | 43 +++++++++------- kora-java-helloworld/build.gradle | 17 +++++-- kora-java-http-client/build.gradle | 23 +++++---- kora-java-http-server/build.gradle | 19 ++++--- kora-java-kafka/build.gradle | 19 ++++--- .../build.gradle | 43 +++++++++------- .../build.gradle | 41 ++++++++------- kora-java-resilient/build.gradle | 19 ++++--- kora-java-s3-client-aws/build.gradle | 19 ++++--- kora-java-s3-client-minio/build.gradle | 19 ++++--- kora-java-scheduling-jdk/build.gradle | 19 ++++--- kora-java-scheduling-quartz/build.gradle | 19 ++++--- kora-java-soap-client/build.gradle | 19 ++++--- kora-java-telemetry/build.gradle | 20 +++++--- kora-java-validation/build.gradle | 14 +++-- kora-kotlin-crud/build.gradle.kts | 51 +++++++++++-------- kora-kotlin-helloworld/build.gradle.kts | 29 ++++++++--- 36 files changed, 531 insertions(+), 284 deletions(-) diff --git a/kora-java-cache-caffeine/build.gradle b/kora-java-cache-caffeine/build.gradle index 0ed5f5db..5a4612a6 100644 --- a/kora-java-cache-caffeine/build.gradle +++ b/kora-java-cache-caffeine/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.cache.caffeine.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -31,6 +33,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.cache.caffeine.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -65,7 +69,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -86,6 +90,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-cache-redis/build.gradle b/kora-java-cache-redis/build.gradle index 86eb7d26..ef452d17 100644 --- a/kora-java-cache-redis/build.gradle +++ b/kora-java-cache-redis/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.cache.redis.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,6 +35,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.cache.redis.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -67,7 +71,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -88,6 +92,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-camunda-engine/build.gradle b/kora-java-camunda-engine/build.gradle index 345c9e86..9a05f010 100644 --- a/kora-java-camunda-engine/build.gradle +++ b/kora-java-camunda-engine/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.camunda.engine.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -41,6 +43,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.camunda.engine.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -59,7 +63,7 @@ distTar { test { dependsOn tasks.distTar - + jvmArgs += [ "-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1", @@ -77,7 +81,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -98,6 +102,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-camunda-zeebe-worker/build.gradle b/kora-java-camunda-zeebe-worker/build.gradle index 59e038d2..3abfb7b2 100644 --- a/kora-java-camunda-zeebe-worker/build.gradle +++ b/kora-java-camunda-zeebe-worker/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.camunda.zeebe.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,6 +36,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.camunda.zeebe.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -68,7 +72,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -89,6 +93,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-config-hocon/build.gradle b/kora-java-config-hocon/build.gradle index a3177cd1..6f057eb3 100644 --- a/kora-java-config-hocon/build.gradle +++ b/kora-java-config-hocon/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.config.hocon.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -29,8 +31,9 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } - application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.config.hocon.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -65,7 +68,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -86,6 +89,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-config-yaml/build.gradle b/kora-java-config-yaml/build.gradle index 4b11f109..9575390e 100644 --- a/kora-java-config-yaml/build.gradle +++ b/kora-java-config-yaml/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.config.hocon.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -30,6 +32,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.config.hocon.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -63,7 +67,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -84,6 +88,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-crud-submodule/build.gradle b/kora-java-crud-submodule/build.gradle index f0c92c3f..a8d2f143 100644 --- a/kora-java-crud-submodule/build.gradle +++ b/kora-java-crud-submodule/build.gradle @@ -39,8 +39,6 @@ subprojects { "": "" ]) - exclude(["**/\$*"]) - useJUnitPlatform() testLogging { showStandardStreams(true) @@ -66,6 +64,9 @@ subprojects { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle b/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle index 48bc4174..3d92305e 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle @@ -14,9 +14,6 @@ plugins { id "org.flywaydb.flyway" version "8.4.2" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.submodule.app.Application" - dependencies { annotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final" @@ -43,6 +40,21 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.submodule.app.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + +//noinspection GroovyAssignabilityCheck +run { + environment([ + "POSTGRES_JDBC_URL": "jdbc:postgresql://$postgresHost:$postgresPort/$postgresDatabase", + "POSTGRES_USER" : "$postgresUser", + "POSTGRES_PASS" : "$postgresPassword", + ]) +} + def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", GenerateTask) { generatorName = "kora" group = "openapi tools" @@ -60,19 +72,6 @@ def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", Gene sourceSets.main { java.srcDirs += openApiGenerateHttpServer.get().outputDir } compileJava.dependsOn openApiGenerateHttpServer -application { - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] -} - -//noinspection GroovyAssignabilityCheck -run { - environment([ - "POSTGRES_JDBC_URL": "jdbc:postgresql://$postgresHost:$postgresPort/$postgresDatabase", - "POSTGRES_USER" : "$postgresUser", - "POSTGRES_PASS" : "$postgresPassword", - ]) -} - distTar { archiveFileName = "application.tar" } diff --git a/kora-java-crud/build.gradle b/kora-java-crud/build.gradle index 23ff47a1..b7ece583 100644 --- a/kora-java-crud/build.gradle +++ b/kora-java-crud/build.gradle @@ -15,15 +15,12 @@ plugins { id "org.flywaydb.flyway" version "8.4.2" } -application { - applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.crud.Application" - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +java { + toolchain { + languageVersion = JavaLanguageVersion.of(24) + } } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom annotationProcessor.extendsFrom(koraBom) @@ -64,6 +61,21 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.crud.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + +//noinspection GroovyAssignabilityCheck +run { + environment([ + "POSTGRES_JDBC_URL": "jdbc:postgresql://$postgresHost:$postgresPort/$postgresDatabase", + "POSTGRES_USER" : "$postgresUser", + "POSTGRES_PASS" : "$postgresPassword", + ]) +} + def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", GenerateTask) { generatorName = "kora" group = "openapi tools" @@ -81,15 +93,6 @@ def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", Gene sourceSets.main { java.srcDirs += openApiGenerateHttpServer.get().outputDir } compileJava.dependsOn openApiGenerateHttpServer -//noinspection GroovyAssignabilityCheck -run { - environment([ - "POSTGRES_JDBC_URL": "jdbc:postgresql://$postgresHost:$postgresPort/$postgresDatabase", - "POSTGRES_USER" : "$postgresUser", - "POSTGRES_PASS" : "$postgresPassword", - ]) -} - distTar { archiveFileName = "application.tar" } @@ -113,10 +116,8 @@ test { exceptionFormat("full") } - exclude(["**/\$*"]) - jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -147,6 +148,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-database-cassandra/build.gradle b/kora-java-database-cassandra/build.gradle index 69f9f447..9c5e4d70 100644 --- a/kora-java-database-cassandra/build.gradle +++ b/kora-java-database-cassandra/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.cassandra.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,6 +35,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.cassandra.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -71,7 +75,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -92,6 +96,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-database-jdbc/build.gradle b/kora-java-database-jdbc/build.gradle index 1c684799..01223a1d 100644 --- a/kora-java-database-jdbc/build.gradle +++ b/kora-java-database-jdbc/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.jdbc.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -35,6 +37,8 @@ dependencies { application { applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.jdbc.Application" } //noinspection GroovyAssignabilityCheck @@ -70,7 +74,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -91,6 +95,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-database-r2dbc/build.gradle b/kora-java-database-r2dbc/build.gradle index 5bb45119..7dbb861c 100644 --- a/kora-java-database-r2dbc/build.gradle +++ b/kora-java-database-r2dbc/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.r2dbc.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -35,6 +37,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.r2dbc.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -71,7 +75,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -92,6 +96,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-database-vertx/build.gradle b/kora-java-database-vertx/build.gradle index 0b77b359..d091f92b 100644 --- a/kora-java-database-vertx/build.gradle +++ b/kora-java-database-vertx/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.vertx.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -36,6 +38,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.vertx.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -72,7 +76,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -93,6 +97,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index 05c9a73e..e1e63605 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -18,8 +18,11 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.cassandra.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -27,6 +30,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -144,7 +149,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -165,6 +170,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index db86319e..2cd18362 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -19,8 +19,11 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.jdbc.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -28,6 +31,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -138,7 +143,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -166,6 +171,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index bd463805..2ecb7ebf 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -19,8 +19,11 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.r2dbc.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -28,6 +31,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -140,7 +145,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -168,6 +173,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index ada3d565..fb6d8939 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -19,8 +19,11 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.vertx.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -28,6 +31,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -142,7 +147,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -170,6 +175,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index d81914f9..f7b5c049 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -9,8 +9,11 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.kafka.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -18,6 +21,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -99,7 +104,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -120,6 +125,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-grpc-client/build.gradle b/kora-java-grpc-client/build.gradle index 6f3257db..596a82d8 100644 --- a/kora-java-grpc-client/build.gradle +++ b/kora-java-grpc-client/build.gradle @@ -6,11 +6,11 @@ plugins { id "com.google.protobuf" version "0.9.5" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.grpc.client.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -18,6 +18,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -35,6 +37,19 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.grpc.client.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + +//noinspection GroovyAssignabilityCheck +run { + environment([ + "": "", + ]) +} + protobuf { protoc { artifact = "com.google.protobuf:protoc:3.25.3" } plugins { @@ -48,17 +63,6 @@ protobuf { test.dependsOn tasks.generateProto -application { - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] -} - -//noinspection GroovyAssignabilityCheck -run { - environment([ - "": "", - ]) -} - distTar { archiveFileName = "application.tar" } @@ -83,7 +87,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -113,6 +117,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-grpc-server/build.gradle b/kora-java-grpc-server/build.gradle index 97c4c08f..184e4314 100644 --- a/kora-java-grpc-server/build.gradle +++ b/kora-java-grpc-server/build.gradle @@ -6,11 +6,11 @@ plugins { id "com.google.protobuf" version "0.9.4" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.grpc.server.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -18,6 +18,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -35,6 +37,20 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.grpc.server.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + +//noinspection GroovyAssignabilityCheck +run { + environment([ + "GRPC_PORT" : "$grpcPort", + "METRIC_COLLECTOR_ENDPOINT": "$metricCollectorEndpoint", + ]) +} + protobuf { protoc { artifact = "com.google.protobuf:protoc:3.25.3" } plugins { @@ -48,18 +64,6 @@ protobuf { test.dependsOn tasks.generateProto -application { - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] -} - -//noinspection GroovyAssignabilityCheck -run { - environment([ - "GRPC_PORT" : "$grpcPort", - "METRIC_COLLECTOR_ENDPOINT": "$metricCollectorEndpoint", - ]) -} - distTar { archiveFileName = "application.tar" } @@ -84,7 +88,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -114,6 +118,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-helloworld/build.gradle b/kora-java-helloworld/build.gradle index ad0a26de..9048c89c 100644 --- a/kora-java-helloworld/build.gradle +++ b/kora-java-helloworld/build.gradle @@ -7,8 +7,11 @@ plugins { applicationName = "application" mainClassName = "ru.tinkoff.kora.example.helloworld.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +19,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,8 +37,9 @@ dependencies { testImplementation "org.skyscreamer:jsonassert:1.5.1" } - application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.helloworld.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -68,7 +74,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -89,6 +95,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-http-client/build.gradle b/kora-java-http-client/build.gradle index 4e98b758..814c41a8 100644 --- a/kora-java-http-client/build.gradle +++ b/kora-java-http-client/build.gradle @@ -4,11 +4,12 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.http.client.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +17,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,12 +36,9 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-mockserver:0.12.2" } - -application { - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] -} - application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.http.client.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -73,7 +73,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -94,6 +94,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-http-server/build.gradle b/kora-java-http-server/build.gradle index 673f71a9..db064af6 100644 --- a/kora-java-http-server/build.gradle +++ b/kora-java-http-server/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.http.server.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -38,6 +40,8 @@ dependencies { application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.http.server.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -65,7 +69,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -86,6 +90,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-kafka/build.gradle b/kora-java-kafka/build.gradle index 21c2aa06..d4ef1a1b 100644 --- a/kora-java-kafka/build.gradle +++ b/kora-java-kafka/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.kafka.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,6 +35,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.kafka.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -67,7 +71,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -88,6 +92,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-openapi-generator-http-client/build.gradle b/kora-java-openapi-generator-http-client/build.gradle index f9b417bc..add6300b 100644 --- a/kora-java-openapi-generator-http-client/build.gradle +++ b/kora-java-openapi-generator-http-client/build.gradle @@ -14,11 +14,11 @@ plugins { id "org.openapi.generator" version "7.14.0" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.openapi.http.client.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -26,6 +26,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -46,6 +48,20 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-mockserver:0.12.2" } +application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.openapi.http.client.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + +//noinspection GroovyAssignabilityCheck +run { + environment([ + "HTTP_CLIENT_PET_V2_URL": "$httpClientUrlPetV2", + "HTTP_CLIENT_PET_V3_URL": "$httpClientUrlPetV3", + ]) +} + // OpeAPI for V2 def openApiGeneratePetV2 = tasks.register("openApiGeneratePetV2", GenerateTask) { generatorName = "kora" @@ -85,18 +101,6 @@ def openApiGeneratePetV3 = tasks.register("openApiGeneratePetV3", GenerateTask) sourceSets.main { java.srcDirs += openApiGeneratePetV3.get().outputDir } compileJava.dependsOn openApiGeneratePetV3 -application { - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] -} - -//noinspection GroovyAssignabilityCheck -run { - environment([ - "HTTP_CLIENT_PET_V2_URL": "$httpClientUrlPetV2", - "HTTP_CLIENT_PET_V3_URL": "$httpClientUrlPetV3", - ]) -} - distTar { archiveFileName = "application.tar" } @@ -121,7 +125,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -142,6 +146,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-openapi-generator-http-server/build.gradle b/kora-java-openapi-generator-http-server/build.gradle index b9a70ea0..a080ec9b 100644 --- a/kora-java-openapi-generator-http-server/build.gradle +++ b/kora-java-openapi-generator-http-server/build.gradle @@ -14,11 +14,11 @@ plugins { id "org.openapi.generator" version "7.14.0" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.openapi.http.server.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -26,6 +26,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -46,6 +48,19 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.openapi.http.server.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + +//noinspection GroovyAssignabilityCheck +run { + environment([ + "": "" + ]) +} + // OpenAPI for V2 def openApiGeneratePetV2 = tasks.register("openApiGeneratePetV2", GenerateTask) { generatorName = "kora" @@ -83,17 +98,6 @@ def openApiGeneratePetV3 = tasks.register("openApiGeneratePetV3", GenerateTask) sourceSets.main { java.srcDirs += openApiGeneratePetV3.get().outputDir } compileJava.dependsOn openApiGeneratePetV3 -application { - applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] -} - -//noinspection GroovyAssignabilityCheck -run { - environment([ - "": "" - ]) -} - distTar { archiveFileName = "application.tar" } @@ -118,7 +122,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -145,6 +149,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-resilient/build.gradle b/kora-java-resilient/build.gradle index 8d539310..4c5ebe2f 100644 --- a/kora-java-resilient/build.gradle +++ b/kora-java-resilient/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.resilient.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -31,6 +33,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.resilient.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -65,7 +69,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -86,6 +90,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-s3-client-aws/build.gradle b/kora-java-s3-client-aws/build.gradle index 77154d30..698c6129 100644 --- a/kora-java-s3-client-aws/build.gradle +++ b/kora-java-s3-client-aws/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.s3.aws.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -36,6 +38,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.s3.aws.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -73,7 +77,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -94,6 +98,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-s3-client-minio/build.gradle b/kora-java-s3-client-minio/build.gradle index 7a4349bf..54df7ba3 100644 --- a/kora-java-s3-client-minio/build.gradle +++ b/kora-java-s3-client-minio/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.s3.minio.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -36,6 +38,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.s3.minio.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -73,7 +77,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -94,6 +98,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-scheduling-jdk/build.gradle b/kora-java-scheduling-jdk/build.gradle index 2a9f97c3..c0d30696 100644 --- a/kora-java-scheduling-jdk/build.gradle +++ b/kora-java-scheduling-jdk/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.scheduling.jdk.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,6 +34,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.scheduling.jdk.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -66,7 +70,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -87,6 +91,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-scheduling-quartz/build.gradle b/kora-java-scheduling-quartz/build.gradle index 90900554..ff1e5868 100644 --- a/kora-java-scheduling-quartz/build.gradle +++ b/kora-java-scheduling-quartz/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.scheduling.quartz.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,6 +34,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.scheduling.quartz.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -66,7 +70,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -87,6 +91,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-soap-client/build.gradle b/kora-java-soap-client/build.gradle index a29c9abb..1290970f 100644 --- a/kora-java-soap-client/build.gradle +++ b/kora-java-soap-client/build.gradle @@ -6,11 +6,11 @@ plugins { id "com.github.bjornvester.wsdl2java" version "2.0.2" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.soap.client.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -18,6 +18,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -43,6 +45,8 @@ dependencies { } application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.soap.client.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -77,7 +81,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -111,6 +115,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-telemetry/build.gradle b/kora-java-telemetry/build.gradle index 955ca5ae..d53ed05d 100644 --- a/kora-java-telemetry/build.gradle +++ b/kora-java-telemetry/build.gradle @@ -4,11 +4,11 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.telemetry.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +16,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,8 +35,9 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } - application { + applicationName = "application" + mainClassName = "ru.tinkoff.kora.example.telemetry.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } @@ -62,7 +65,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -83,6 +86,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-validation/build.gradle b/kora-java-validation/build.gradle index 6f14940b..ad72b9ac 100644 --- a/kora-java-validation/build.gradle +++ b/kora-java-validation/build.gradle @@ -7,8 +7,11 @@ plugins { applicationName = "application" mainClassName = "ru.tinkoff.kora.example.validation.Application" -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} configurations { koraBom @@ -16,6 +19,8 @@ configurations { compileOnly.extendsFrom(koraBom) implementation.extendsFrom(koraBom) api.extendsFrom(koraBom) + testImplementation.extendsFrom(koraBom) + testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -54,7 +59,7 @@ test { } jacoco { - excludes += ["**/Application*"] + excludes += ["**/generated/**", "**/Application*", "**/\$*"] } reports { @@ -75,6 +80,9 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-kotlin-crud/build.gradle.kts b/kora-kotlin-crud/build.gradle.kts index fa15f57b..6d1f3ea8 100644 --- a/kora-kotlin-crud/build.gradle.kts +++ b/kora-kotlin-crud/build.gradle.kts @@ -12,19 +12,12 @@ plugins { id("org.openapi.generator") version ("7.14.0") id("application") id("jacoco") - id("java") // kotlin("kapt") version ("1.9.25") // KAPT & KSP broken since 1.9.11 kotlin("jvm") version ("1.9.25") id("com.google.devtools.ksp") version ("1.9.25-1.0.20") id("org.flywaydb.flyway") version ("8.4.2") } -application { - applicationName = "application" - mainClass.set("ru.tinkoff.kora.kotlin.example.crud.ApplicationKt") - applicationDefaultJvmArgs = listOf("-Dfile.encoding=UTF-8") -} - kotlin { jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } @@ -72,6 +65,25 @@ dependencies { testImplementation("org.testcontainers:junit-jupiter:1.19.8") } +application { + applicationName = "application" + mainClass.set("ru.tinkoff.kora.kotlin.example.crud.ApplicationKt") + applicationDefaultJvmArgs = listOf("-Dfile.encoding=UTF-8") +} + +val postgresHost: String by project +val postgresPort: String by project +val postgresDatabase: String by project +val postgresUser: String by project +val postgresPassword: String by project +tasks.withType { + environment( + "POSTGRES_JDBC_URL" to "jdbc:postgresql://${postgresHost}:${postgresPort}/${postgresDatabase}", + "POSTGRES_USER" to postgresUser, + "POSTGRES_PASS" to postgresPassword, + ) +} + val openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer") { generatorName = "kora" group = "openapi tools" @@ -101,23 +113,11 @@ ksp { // dependsOn(tasks.named("kaptKotlin").get()) //} -val postgresHost: String by project -val postgresPort: String by project -val postgresDatabase: String by project -val postgresUser: String by project -val postgresPassword: String by project -tasks.withType { - environment( - "POSTGRES_JDBC_URL" to "jdbc:postgresql://${postgresHost}:${postgresPort}/${postgresDatabase}", - "POSTGRES_USER" to postgresUser, - "POSTGRES_PASS" to postgresPassword, - ) -} - tasks.distTar { archiveFileName.set("application.tar") } +val jacocoExcludeSet = setOf("**/generated/**", "**/Application*", "**/\$*") tasks.test { dependsOn("distTar") @@ -126,8 +126,6 @@ tasks.test { "-XX:TieredStopAtLevel=1", ) - exclude(listOf("**/\$*")) - useJUnitPlatform() testLogging { showStandardStreams = true @@ -139,6 +137,10 @@ tasks.test { html.required = false junitXml.required = false } + + jacoco { + jacocoExcludeSet.forEach { exclude(it) } + } } flyway { @@ -153,4 +155,9 @@ tasks.jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } + afterEvaluate { + classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching { + jacocoExcludeSet.forEach { exclude(it) } + }) + } } diff --git a/kora-kotlin-helloworld/build.gradle.kts b/kora-kotlin-helloworld/build.gradle.kts index 8e33828c..71f8836c 100644 --- a/kora-kotlin-helloworld/build.gradle.kts +++ b/kora-kotlin-helloworld/build.gradle.kts @@ -2,16 +2,11 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat plugins { id("application") + id("jacoco") kotlin("jvm") version ("1.9.25") id("com.google.devtools.ksp") version ("1.9.25-1.0.20") } -application { - applicationName = "application" - mainClass.set("ru.tinkoff.kora.kotlin.example.helloworld.ApplicationKt") - applicationDefaultJvmArgs = listOf("-Dfile.encoding=UTF-8") -} - kotlin { jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } @@ -42,11 +37,17 @@ dependencies { testImplementation("org.testcontainers:junit-jupiter:1.19.8") } +application { + applicationName = "application" + mainClass.set("ru.tinkoff.kora.kotlin.example.helloworld.ApplicationKt") + applicationDefaultJvmArgs = listOf("-Dfile.encoding=UTF-8") +} tasks.distTar { archiveFileName.set("application.tar") } +val jacocoExcludeSet = setOf("**/generated/**", "**/Application*", "**/\$*") tasks.test { dependsOn("distTar") @@ -66,4 +67,20 @@ tasks.test { html.required = false junitXml.required = false } + + jacoco { + jacocoExcludeSet.forEach { exclude(it) } + } +} + +tasks.jacocoTestReport { + reports { + xml.required = true + html.outputLocation = layout.buildDirectory.dir("jacocoHtml") + } + afterEvaluate { + classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching { + jacocoExcludeSet.forEach { exclude(it) } + }) + } } From cea5ce3fb881cfc84a8ebd5dcfdf684b0c055521 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Fri, 12 Sep 2025 11:02:56 +0300 Subject: [PATCH 02/12] Updated build.gradle --- kora-java-cache-caffeine/build.gradle | 6 +----- kora-java-cache-redis/build.gradle | 6 +----- kora-java-camunda-engine/build.gradle | 6 +----- kora-java-camunda-zeebe-worker/build.gradle | 6 +----- kora-java-config-hocon/build.gradle | 6 +----- kora-java-config-yaml/build.gradle | 6 +----- kora-java-crud/build.gradle | 6 +----- kora-java-database-cassandra/build.gradle | 6 +----- kora-java-database-jdbc/build.gradle | 6 +----- kora-java-database-r2dbc/build.gradle | 6 +----- kora-java-database-vertx/build.gradle | 6 +----- kora-java-graalvm-crud-cassandra/build.gradle | 6 +----- kora-java-graalvm-crud-jdbc/build.gradle | 6 +----- kora-java-graalvm-crud-r2dbc/build.gradle | 6 +----- kora-java-graalvm-crud-vertx/build.gradle | 6 +----- kora-java-graalvm-kafka/build.gradle | 6 +----- kora-java-grpc-client/build.gradle | 6 +----- kora-java-grpc-server/build.gradle | 6 +----- kora-java-helloworld/build.gradle | 6 +----- kora-java-http-client/build.gradle | 6 +----- kora-java-http-server/build.gradle | 6 +----- kora-java-kafka/build.gradle | 6 +----- kora-java-openapi-generator-http-client/build.gradle | 6 +----- kora-java-openapi-generator-http-server/build.gradle | 6 +----- kora-java-resilient/build.gradle | 6 +----- kora-java-s3-client-aws/build.gradle | 6 +----- kora-java-s3-client-minio/build.gradle | 6 +----- kora-java-scheduling-jdk/build.gradle | 6 +----- kora-java-scheduling-quartz/build.gradle | 6 +----- kora-java-soap-client/build.gradle | 6 +----- kora-java-telemetry/build.gradle | 6 +----- kora-java-validation/build.gradle | 6 +----- kora-kotlin-crud/build.gradle.kts | 2 +- 33 files changed, 33 insertions(+), 161 deletions(-) diff --git a/kora-java-cache-caffeine/build.gradle b/kora-java-cache-caffeine/build.gradle index 5a4612a6..56170721 100644 --- a/kora-java-cache-caffeine/build.gradle +++ b/kora-java-cache-caffeine/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-cache-redis/build.gradle b/kora-java-cache-redis/build.gradle index ef452d17..59743138 100644 --- a/kora-java-cache-redis/build.gradle +++ b/kora-java-cache-redis/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-camunda-engine/build.gradle b/kora-java-camunda-engine/build.gradle index 9a05f010..bdb2aa08 100644 --- a/kora-java-camunda-engine/build.gradle +++ b/kora-java-camunda-engine/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-camunda-zeebe-worker/build.gradle b/kora-java-camunda-zeebe-worker/build.gradle index 3abfb7b2..0ca33c94 100644 --- a/kora-java-camunda-zeebe-worker/build.gradle +++ b/kora-java-camunda-zeebe-worker/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-config-hocon/build.gradle b/kora-java-config-hocon/build.gradle index 6f057eb3..cb129ee9 100644 --- a/kora-java-config-hocon/build.gradle +++ b/kora-java-config-hocon/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-config-yaml/build.gradle b/kora-java-config-yaml/build.gradle index 9575390e..13812e3c 100644 --- a/kora-java-config-yaml/build.gradle +++ b/kora-java-config-yaml/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-crud/build.gradle b/kora-java-crud/build.gradle index b7ece583..76773673 100644 --- a/kora-java-crud/build.gradle +++ b/kora-java-crud/build.gradle @@ -15,11 +15,7 @@ plugins { id "org.flywaydb.flyway" version "8.4.2" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(24) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-database-cassandra/build.gradle b/kora-java-database-cassandra/build.gradle index 9c5e4d70..aaccb2b9 100644 --- a/kora-java-database-cassandra/build.gradle +++ b/kora-java-database-cassandra/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-database-jdbc/build.gradle b/kora-java-database-jdbc/build.gradle index 01223a1d..584d97fd 100644 --- a/kora-java-database-jdbc/build.gradle +++ b/kora-java-database-jdbc/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-database-r2dbc/build.gradle b/kora-java-database-r2dbc/build.gradle index 7dbb861c..b839f9e1 100644 --- a/kora-java-database-r2dbc/build.gradle +++ b/kora-java-database-r2dbc/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-database-vertx/build.gradle b/kora-java-database-vertx/build.gradle index d091f92b..480fcdc0 100644 --- a/kora-java-database-vertx/build.gradle +++ b/kora-java-database-vertx/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index e1e63605..4b0899b0 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -18,11 +18,7 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.cassandra.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index 2cd18362..42eb0613 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -19,11 +19,7 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.jdbc.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index 2ecb7ebf..56146578 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -19,11 +19,7 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.r2dbc.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index fb6d8939..dae69b46 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -19,11 +19,7 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.vertx.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index f7b5c049..9659ed13 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -9,11 +9,7 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.kafka.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-grpc-client/build.gradle b/kora-java-grpc-client/build.gradle index 596a82d8..f37f8264 100644 --- a/kora-java-grpc-client/build.gradle +++ b/kora-java-grpc-client/build.gradle @@ -6,11 +6,7 @@ plugins { id "com.google.protobuf" version "0.9.5" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-grpc-server/build.gradle b/kora-java-grpc-server/build.gradle index 184e4314..d65666e4 100644 --- a/kora-java-grpc-server/build.gradle +++ b/kora-java-grpc-server/build.gradle @@ -6,11 +6,7 @@ plugins { id "com.google.protobuf" version "0.9.4" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-helloworld/build.gradle b/kora-java-helloworld/build.gradle index 9048c89c..7b2455e7 100644 --- a/kora-java-helloworld/build.gradle +++ b/kora-java-helloworld/build.gradle @@ -7,11 +7,7 @@ plugins { applicationName = "application" mainClassName = "ru.tinkoff.kora.example.helloworld.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-http-client/build.gradle b/kora-java-http-client/build.gradle index 814c41a8..3822fa47 100644 --- a/kora-java-http-client/build.gradle +++ b/kora-java-http-client/build.gradle @@ -5,11 +5,7 @@ plugins { } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-http-server/build.gradle b/kora-java-http-server/build.gradle index db064af6..bffce630 100644 --- a/kora-java-http-server/build.gradle +++ b/kora-java-http-server/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-kafka/build.gradle b/kora-java-kafka/build.gradle index d4ef1a1b..f1267fc6 100644 --- a/kora-java-kafka/build.gradle +++ b/kora-java-kafka/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-openapi-generator-http-client/build.gradle b/kora-java-openapi-generator-http-client/build.gradle index add6300b..75cd6ea5 100644 --- a/kora-java-openapi-generator-http-client/build.gradle +++ b/kora-java-openapi-generator-http-client/build.gradle @@ -14,11 +14,7 @@ plugins { id "org.openapi.generator" version "7.14.0" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-openapi-generator-http-server/build.gradle b/kora-java-openapi-generator-http-server/build.gradle index a080ec9b..cbbbc511 100644 --- a/kora-java-openapi-generator-http-server/build.gradle +++ b/kora-java-openapi-generator-http-server/build.gradle @@ -14,11 +14,7 @@ plugins { id "org.openapi.generator" version "7.14.0" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-resilient/build.gradle b/kora-java-resilient/build.gradle index 4c5ebe2f..a60c0795 100644 --- a/kora-java-resilient/build.gradle +++ b/kora-java-resilient/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-s3-client-aws/build.gradle b/kora-java-s3-client-aws/build.gradle index 698c6129..741626bb 100644 --- a/kora-java-s3-client-aws/build.gradle +++ b/kora-java-s3-client-aws/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-s3-client-minio/build.gradle b/kora-java-s3-client-minio/build.gradle index 54df7ba3..f8fa47dc 100644 --- a/kora-java-s3-client-minio/build.gradle +++ b/kora-java-s3-client-minio/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-scheduling-jdk/build.gradle b/kora-java-scheduling-jdk/build.gradle index c0d30696..622b0239 100644 --- a/kora-java-scheduling-jdk/build.gradle +++ b/kora-java-scheduling-jdk/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-scheduling-quartz/build.gradle b/kora-java-scheduling-quartz/build.gradle index ff1e5868..811f79f0 100644 --- a/kora-java-scheduling-quartz/build.gradle +++ b/kora-java-scheduling-quartz/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-soap-client/build.gradle b/kora-java-soap-client/build.gradle index 1290970f..dc55f58d 100644 --- a/kora-java-soap-client/build.gradle +++ b/kora-java-soap-client/build.gradle @@ -6,11 +6,7 @@ plugins { id "com.github.bjornvester.wsdl2java" version "2.0.2" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-telemetry/build.gradle b/kora-java-telemetry/build.gradle index d53ed05d..52b05668 100644 --- a/kora-java-telemetry/build.gradle +++ b/kora-java-telemetry/build.gradle @@ -4,11 +4,7 @@ plugins { id "application" } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-java-validation/build.gradle b/kora-java-validation/build.gradle index ad72b9ac..09d1c3c3 100644 --- a/kora-java-validation/build.gradle +++ b/kora-java-validation/build.gradle @@ -7,11 +7,7 @@ plugins { applicationName = "application" mainClassName = "ru.tinkoff.kora.example.validation.Application" -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} +java.toolchain.languageVersion = JavaLanguageVersion.of(24) configurations { koraBom diff --git a/kora-kotlin-crud/build.gradle.kts b/kora-kotlin-crud/build.gradle.kts index 6d1f3ea8..5c1eebbf 100644 --- a/kora-kotlin-crud/build.gradle.kts +++ b/kora-kotlin-crud/build.gradle.kts @@ -9,12 +9,12 @@ buildscript { } plugins { - id("org.openapi.generator") version ("7.14.0") id("application") id("jacoco") // kotlin("kapt") version ("1.9.25") // KAPT & KSP broken since 1.9.11 kotlin("jvm") version ("1.9.25") id("com.google.devtools.ksp") version ("1.9.25-1.0.20") + id("org.openapi.generator") version ("7.14.0") id("org.flywaydb.flyway") version ("8.4.2") } From 01a24e6f3b4f33f0c57b4609907b06135258829e Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Sun, 14 Sep 2025 11:20:59 +0300 Subject: [PATCH 03/12] Exclude generated classes --- kora-java-cache-caffeine/build.gradle | 2 ++ kora-java-cache-redis/build.gradle | 2 ++ kora-java-camunda-engine/build.gradle | 2 ++ kora-java-camunda-zeebe-worker/build.gradle | 2 ++ kora-java-config-hocon/build.gradle | 2 ++ kora-java-config-yaml/build.gradle | 2 ++ kora-java-crud/build.gradle | 2 ++ kora-java-database-cassandra/build.gradle | 2 ++ kora-java-database-jdbc/build.gradle | 2 ++ kora-java-database-r2dbc/build.gradle | 2 ++ kora-java-database-vertx/build.gradle | 2 ++ kora-java-graalvm-crud-cassandra/build.gradle | 2 ++ kora-java-graalvm-crud-jdbc/build.gradle | 2 ++ kora-java-graalvm-crud-r2dbc/build.gradle | 2 ++ kora-java-graalvm-crud-vertx/build.gradle | 2 ++ kora-java-graalvm-kafka/build.gradle | 2 ++ kora-java-grpc-client/build.gradle | 2 ++ kora-java-grpc-server/build.gradle | 2 ++ kora-java-helloworld/build.gradle | 2 ++ kora-java-http-client/build.gradle | 2 ++ kora-java-http-server/build.gradle | 2 ++ kora-java-kafka/build.gradle | 2 ++ kora-java-openapi-generator-http-client/build.gradle | 2 ++ kora-java-openapi-generator-http-server/build.gradle | 2 ++ kora-java-resilient/build.gradle | 2 ++ kora-java-s3-client-aws/build.gradle | 2 ++ kora-java-s3-client-minio/build.gradle | 2 ++ kora-java-scheduling-jdk/build.gradle | 2 ++ kora-java-scheduling-quartz/build.gradle | 2 ++ kora-java-soap-client/build.gradle | 2 ++ kora-java-telemetry/build.gradle | 2 ++ kora-java-validation/build.gradle | 2 ++ kora-kotlin-crud/build.gradle.kts | 2 ++ kora-kotlin-helloworld/build.gradle.kts | 2 ++ 34 files changed, 68 insertions(+) diff --git a/kora-java-cache-caffeine/build.gradle b/kora-java-cache-caffeine/build.gradle index 56170721..1cda06c3 100644 --- a/kora-java-cache-caffeine/build.gradle +++ b/kora-java-cache-caffeine/build.gradle @@ -64,6 +64,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-cache-redis/build.gradle b/kora-java-cache-redis/build.gradle index 59743138..362e4655 100644 --- a/kora-java-cache-redis/build.gradle +++ b/kora-java-cache-redis/build.gradle @@ -66,6 +66,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-camunda-engine/build.gradle b/kora-java-camunda-engine/build.gradle index bdb2aa08..a8977503 100644 --- a/kora-java-camunda-engine/build.gradle +++ b/kora-java-camunda-engine/build.gradle @@ -76,6 +76,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-camunda-zeebe-worker/build.gradle b/kora-java-camunda-zeebe-worker/build.gradle index 0ca33c94..c902e7d0 100644 --- a/kora-java-camunda-zeebe-worker/build.gradle +++ b/kora-java-camunda-zeebe-worker/build.gradle @@ -67,6 +67,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-config-hocon/build.gradle b/kora-java-config-hocon/build.gradle index cb129ee9..dcebb030 100644 --- a/kora-java-config-hocon/build.gradle +++ b/kora-java-config-hocon/build.gradle @@ -63,6 +63,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-config-yaml/build.gradle b/kora-java-config-yaml/build.gradle index 13812e3c..4f651739 100644 --- a/kora-java-config-yaml/build.gradle +++ b/kora-java-config-yaml/build.gradle @@ -62,6 +62,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-crud/build.gradle b/kora-java-crud/build.gradle index 76773673..b703376d 100644 --- a/kora-java-crud/build.gradle +++ b/kora-java-crud/build.gradle @@ -112,6 +112,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-database-cassandra/build.gradle b/kora-java-database-cassandra/build.gradle index aaccb2b9..1c517309 100644 --- a/kora-java-database-cassandra/build.gradle +++ b/kora-java-database-cassandra/build.gradle @@ -70,6 +70,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-database-jdbc/build.gradle b/kora-java-database-jdbc/build.gradle index 584d97fd..4d023bc8 100644 --- a/kora-java-database-jdbc/build.gradle +++ b/kora-java-database-jdbc/build.gradle @@ -69,6 +69,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-database-r2dbc/build.gradle b/kora-java-database-r2dbc/build.gradle index b839f9e1..104e344d 100644 --- a/kora-java-database-r2dbc/build.gradle +++ b/kora-java-database-r2dbc/build.gradle @@ -70,6 +70,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-database-vertx/build.gradle b/kora-java-database-vertx/build.gradle index 480fcdc0..900098a5 100644 --- a/kora-java-database-vertx/build.gradle +++ b/kora-java-database-vertx/build.gradle @@ -71,6 +71,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index 4b0899b0..d0e8fcee 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -144,6 +144,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index 42eb0613..4576c8b2 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -138,6 +138,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index 56146578..80850859 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -140,6 +140,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index dae69b46..287b81dd 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -142,6 +142,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index 9659ed13..8cb648ff 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -99,6 +99,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-grpc-client/build.gradle b/kora-java-grpc-client/build.gradle index f37f8264..aea2d238 100644 --- a/kora-java-grpc-client/build.gradle +++ b/kora-java-grpc-client/build.gradle @@ -82,6 +82,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-grpc-server/build.gradle b/kora-java-grpc-server/build.gradle index d65666e4..49471f79 100644 --- a/kora-java-grpc-server/build.gradle +++ b/kora-java-grpc-server/build.gradle @@ -83,6 +83,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-helloworld/build.gradle b/kora-java-helloworld/build.gradle index 7b2455e7..56db8e8c 100644 --- a/kora-java-helloworld/build.gradle +++ b/kora-java-helloworld/build.gradle @@ -69,6 +69,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-http-client/build.gradle b/kora-java-http-client/build.gradle index 3822fa47..041805b4 100644 --- a/kora-java-http-client/build.gradle +++ b/kora-java-http-client/build.gradle @@ -68,6 +68,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-http-server/build.gradle b/kora-java-http-server/build.gradle index bffce630..37d38eac 100644 --- a/kora-java-http-server/build.gradle +++ b/kora-java-http-server/build.gradle @@ -64,6 +64,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-kafka/build.gradle b/kora-java-kafka/build.gradle index f1267fc6..4dba435a 100644 --- a/kora-java-kafka/build.gradle +++ b/kora-java-kafka/build.gradle @@ -66,6 +66,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-openapi-generator-http-client/build.gradle b/kora-java-openapi-generator-http-client/build.gradle index 75cd6ea5..3af8a673 100644 --- a/kora-java-openapi-generator-http-client/build.gradle +++ b/kora-java-openapi-generator-http-client/build.gradle @@ -120,6 +120,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-openapi-generator-http-server/build.gradle b/kora-java-openapi-generator-http-server/build.gradle index cbbbc511..696ba163 100644 --- a/kora-java-openapi-generator-http-server/build.gradle +++ b/kora-java-openapi-generator-http-server/build.gradle @@ -117,6 +117,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-resilient/build.gradle b/kora-java-resilient/build.gradle index a60c0795..b35c63b0 100644 --- a/kora-java-resilient/build.gradle +++ b/kora-java-resilient/build.gradle @@ -64,6 +64,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-s3-client-aws/build.gradle b/kora-java-s3-client-aws/build.gradle index 741626bb..cfa3b98d 100644 --- a/kora-java-s3-client-aws/build.gradle +++ b/kora-java-s3-client-aws/build.gradle @@ -72,6 +72,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-s3-client-minio/build.gradle b/kora-java-s3-client-minio/build.gradle index f8fa47dc..1d477212 100644 --- a/kora-java-s3-client-minio/build.gradle +++ b/kora-java-s3-client-minio/build.gradle @@ -72,6 +72,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-scheduling-jdk/build.gradle b/kora-java-scheduling-jdk/build.gradle index 622b0239..0e4e69d0 100644 --- a/kora-java-scheduling-jdk/build.gradle +++ b/kora-java-scheduling-jdk/build.gradle @@ -65,6 +65,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-scheduling-quartz/build.gradle b/kora-java-scheduling-quartz/build.gradle index 811f79f0..15f7e931 100644 --- a/kora-java-scheduling-quartz/build.gradle +++ b/kora-java-scheduling-quartz/build.gradle @@ -65,6 +65,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-soap-client/build.gradle b/kora-java-soap-client/build.gradle index dc55f58d..04e8340c 100644 --- a/kora-java-soap-client/build.gradle +++ b/kora-java-soap-client/build.gradle @@ -76,6 +76,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-telemetry/build.gradle b/kora-java-telemetry/build.gradle index 52b05668..03e71df0 100644 --- a/kora-java-telemetry/build.gradle +++ b/kora-java-telemetry/build.gradle @@ -60,6 +60,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-java-validation/build.gradle b/kora-java-validation/build.gradle index 09d1c3c3..536b9db4 100644 --- a/kora-java-validation/build.gradle +++ b/kora-java-validation/build.gradle @@ -54,6 +54,8 @@ test { exceptionFormat("full") } + exclude("**/\$*") + jacoco { excludes += ["**/generated/**", "**/Application*", "**/\$*"] } diff --git a/kora-kotlin-crud/build.gradle.kts b/kora-kotlin-crud/build.gradle.kts index 5c1eebbf..956c0b13 100644 --- a/kora-kotlin-crud/build.gradle.kts +++ b/kora-kotlin-crud/build.gradle.kts @@ -138,6 +138,8 @@ tasks.test { junitXml.required = false } + exclude("**/\$*") + jacoco { jacocoExcludeSet.forEach { exclude(it) } } diff --git a/kora-kotlin-helloworld/build.gradle.kts b/kora-kotlin-helloworld/build.gradle.kts index 71f8836c..4cc539d2 100644 --- a/kora-kotlin-helloworld/build.gradle.kts +++ b/kora-kotlin-helloworld/build.gradle.kts @@ -68,6 +68,8 @@ tasks.test { junitXml.required = false } + exclude("**/\$*") + jacoco { jacocoExcludeSet.forEach { exclude(it) } } From 844a99ce966c2973db81040c18c4f7de9a965669 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 12:43:21 +0300 Subject: [PATCH 04/12] Updated logback.xml and build.gradle and docker-compose.yml --- gradle.properties | 2 +- kora-java-cache-caffeine/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-cache-redis/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-camunda-engine/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-camunda-zeebe-worker/README.md | 6 +++- kora-java-camunda-zeebe-worker/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-config-hocon/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-config-yaml/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-crud-submodule/README.md | 6 +++- .../src/main/resources/application.conf | 16 ++++++++++ .../src/main/resources/logback.xml | 5 +--- .../example/submodule/app/BlackBoxTests.java | 4 ++- kora-java-crud/README.md | 6 +++- kora-java-crud/build.gradle | 3 +- .../src/main/resources/application.conf | 19 ++++++++++-- kora-java-crud/src/main/resources/logback.xml | 5 +--- .../kora/example/crud/BlackBoxTests.java | 4 ++- kora-java-database-cassandra/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-database-jdbc/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-database-r2dbc/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-database-vertx/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-graalvm-crud-cassandra/README.md | 13 ++++++++ kora-java-graalvm-crud-cassandra/build.gradle | 3 +- .../docker-compose.yml | 30 +++++++++++++++++++ .../src/main/resources/application.conf | 17 ++++++++++- .../src/main/resources/logback.xml | 5 +--- kora-java-graalvm-crud-jdbc/README.md | 6 +++- kora-java-graalvm-crud-jdbc/build.gradle | 3 +- .../src/main/resources/application.conf | 17 ++++++++++- .../src/main/resources/logback.xml | 5 +--- .../graalvm/crud/jdbc/BlackBoxTests.java | 3 +- kora-java-graalvm-crud-r2dbc/README.md | 6 +++- kora-java-graalvm-crud-r2dbc/build.gradle | 3 +- .../src/main/resources/application.conf | 17 ++++++++++- .../src/main/resources/logback.xml | 5 +--- .../graalvm/crud/r2dbc/BlackBoxTests.java | 3 +- kora-java-graalvm-crud-vertx/README.md | 6 +++- kora-java-graalvm-crud-vertx/build.gradle | 3 +- .../src/main/resources/application.conf | 17 ++++++++++- .../src/main/resources/logback.xml | 5 +--- .../graalvm/crud/vertx/BlackBoxTests.java | 3 +- kora-java-graalvm-kafka/README.md | 6 +++- kora-java-graalvm-kafka/build.gradle | 3 +- kora-java-graalvm-kafka/docker-compose.yml | 2 +- .../src/main/resources/logback.xml | 5 +--- kora-java-grpc-client/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-grpc-server/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-helloworld/build.gradle | 3 +- .../src/main/resources/logback.xml | 7 ++--- kora-java-http-client/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-http-server/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-kafka/README.md | 6 +++- kora-java-kafka/build.gradle | 3 +- kora-java-kafka/docker-compose.yml | 2 +- .../src/main/resources/logback.xml | 5 +--- .../build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- .../build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-resilient/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-s3-client-aws/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-s3-client-minio/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-scheduling-jdk/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-scheduling-quartz/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-soap-client/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-telemetry/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-java-validation/build.gradle | 3 +- .../src/main/resources/logback.xml | 5 +--- kora-kotlin-crud/README.md | 6 +++- .../src/main/resources/application.conf | 16 ++++++++++ .../src/main/resources/logback.xml | 5 +--- .../kora/kotlin/example/crud/BlackBoxTests.kt | 1 + .../src/main/resources/logback.xml | 5 +--- 94 files changed, 316 insertions(+), 197 deletions(-) create mode 100644 kora-java-graalvm-crud-cassandra/docker-compose.yml diff --git a/gradle.properties b/gradle.properties index 53897c7f..00569639 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupId=ru.tinkoff.kora -koraVersion=1.2.2 +koraVersion=1.2.0-SNAPSHOT ##### GRADLE ##### diff --git a/kora-java-cache-caffeine/build.gradle b/kora-java-cache-caffeine/build.gradle index 1cda06c3..a0b026ad 100644 --- a/kora-java-cache-caffeine/build.gradle +++ b/kora-java-cache-caffeine/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-cache-caffeine/src/main/resources/logback.xml b/kora-java-cache-caffeine/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-cache-caffeine/src/main/resources/logback.xml +++ b/kora-java-cache-caffeine/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-cache-redis/build.gradle b/kora-java-cache-redis/build.gradle index 362e4655..1bc70ef5 100644 --- a/kora-java-cache-redis/build.gradle +++ b/kora-java-cache-redis/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-cache-redis/src/main/resources/logback.xml b/kora-java-cache-redis/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-cache-redis/src/main/resources/logback.xml +++ b/kora-java-cache-redis/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-camunda-engine/build.gradle b/kora-java-camunda-engine/build.gradle index a8977503..2605bd75 100644 --- a/kora-java-camunda-engine/build.gradle +++ b/kora-java-camunda-engine/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-camunda-engine/src/main/resources/logback.xml b/kora-java-camunda-engine/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-camunda-engine/src/main/resources/logback.xml +++ b/kora-java-camunda-engine/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-camunda-zeebe-worker/README.md b/kora-java-camunda-zeebe-worker/README.md index 0e3e9b1d..e54a752e 100644 --- a/kora-java-camunda-zeebe-worker/README.md +++ b/kora-java-camunda-zeebe-worker/README.md @@ -37,7 +37,11 @@ docker build -t kora-java-camunda-zeebe-worker . ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew distTar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-camunda-zeebe-worker/build.gradle b/kora-java-camunda-zeebe-worker/build.gradle index c902e7d0..81239948 100644 --- a/kora-java-camunda-zeebe-worker/build.gradle +++ b/kora-java-camunda-zeebe-worker/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-camunda-zeebe-worker/src/main/resources/logback.xml b/kora-java-camunda-zeebe-worker/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-camunda-zeebe-worker/src/main/resources/logback.xml +++ b/kora-java-camunda-zeebe-worker/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-config-hocon/build.gradle b/kora-java-config-hocon/build.gradle index dcebb030..82970e9e 100644 --- a/kora-java-config-hocon/build.gradle +++ b/kora-java-config-hocon/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-config-hocon/src/main/resources/logback.xml b/kora-java-config-hocon/src/main/resources/logback.xml index f0fe012d..70d14ce8 100644 --- a/kora-java-config-hocon/src/main/resources/logback.xml +++ b/kora-java-config-hocon/src/main/resources/logback.xml @@ -15,10 +15,7 @@ - - - - + diff --git a/kora-java-config-yaml/build.gradle b/kora-java-config-yaml/build.gradle index 4f651739..cc9ceb7f 100644 --- a/kora-java-config-yaml/build.gradle +++ b/kora-java-config-yaml/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-config-yaml/src/main/resources/logback.xml b/kora-java-config-yaml/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-config-yaml/src/main/resources/logback.xml +++ b/kora-java-config-yaml/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-crud-submodule/README.md b/kora-java-crud-submodule/README.md index 1f7a2527..bc7e276e 100644 --- a/kora-java-crud-submodule/README.md +++ b/kora-java-crud-submodule/README.md @@ -63,7 +63,11 @@ docker build -t kora-java-crud-submodule . ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew distTar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/application.conf b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/application.conf index 99d7a4b5..eed0583d 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/application.conf +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/application.conf @@ -32,6 +32,22 @@ openapi { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/logback.xml b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/logback.xml +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java index bd0a4bf9..b821157e 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java @@ -42,7 +42,9 @@ public static void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_JDBC_URL", params.jdbcUrl(), "POSTGRES_USER", params.username(), "POSTGRES_PASS", params.password(), - "CACHE_MAX_SIZE", "0")); + "CACHE_MAX_SIZE", "0", + "RETRY_ATTEMPTS", "0", + "LOGGING_LEVEL_ALL", "INFO")); container.start(); } diff --git a/kora-java-crud/README.md b/kora-java-crud/README.md index 97789d9c..11318dc5 100644 --- a/kora-java-crud/README.md +++ b/kora-java-crud/README.md @@ -60,7 +60,11 @@ docker build -t kora-java-crud . ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew distTar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-crud/build.gradle b/kora-java-crud/build.gradle index b703376d..fcaa1567 100644 --- a/kora-java-crud/build.gradle +++ b/kora-java-crud/build.gradle @@ -15,7 +15,8 @@ plugins { id "org.flywaydb.flyway" version "8.4.2" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-crud/src/main/resources/application.conf b/kora-java-crud/src/main/resources/application.conf index 1584c222..0c36be8b 100644 --- a/kora-java-crud/src/main/resources/application.conf +++ b/kora-java-crud/src/main/resources/application.conf @@ -22,9 +22,6 @@ pet-cache { expireAfterWrite = ${?CACHE_EXPIRE_WRITE} } -metrics { - opentelemetrySpec = "V123" -} openapi { management { @@ -62,6 +59,22 @@ resilient { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-java-crud/src/main/resources/logback.xml b/kora-java-crud/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-crud/src/main/resources/logback.xml +++ b/kora-java-crud/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java b/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java index d7df68ce..03df076c 100644 --- a/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java +++ b/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java @@ -42,7 +42,9 @@ public static void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_JDBC_URL", params.jdbcUrl(), "POSTGRES_USER", params.username(), "POSTGRES_PASS", params.password(), - "CACHE_MAX_SIZE", "0")); + "CACHE_MAX_SIZE", "0", + "RETRY_ATTEMPTS", "0", + "LOGGING_LEVEL_ALL", "INFO")); container.start(); } diff --git a/kora-java-database-cassandra/build.gradle b/kora-java-database-cassandra/build.gradle index 1c517309..e153163a 100644 --- a/kora-java-database-cassandra/build.gradle +++ b/kora-java-database-cassandra/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-database-cassandra/src/main/resources/logback.xml b/kora-java-database-cassandra/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-database-cassandra/src/main/resources/logback.xml +++ b/kora-java-database-cassandra/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-database-jdbc/build.gradle b/kora-java-database-jdbc/build.gradle index 4d023bc8..91d422a1 100644 --- a/kora-java-database-jdbc/build.gradle +++ b/kora-java-database-jdbc/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-database-jdbc/src/main/resources/logback.xml b/kora-java-database-jdbc/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-database-jdbc/src/main/resources/logback.xml +++ b/kora-java-database-jdbc/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-database-r2dbc/build.gradle b/kora-java-database-r2dbc/build.gradle index 104e344d..43479459 100644 --- a/kora-java-database-r2dbc/build.gradle +++ b/kora-java-database-r2dbc/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-database-r2dbc/src/main/resources/logback.xml b/kora-java-database-r2dbc/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-database-r2dbc/src/main/resources/logback.xml +++ b/kora-java-database-r2dbc/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-database-vertx/build.gradle b/kora-java-database-vertx/build.gradle index 900098a5..c8271de9 100644 --- a/kora-java-database-vertx/build.gradle +++ b/kora-java-database-vertx/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-database-vertx/src/main/resources/logback.xml b/kora-java-database-vertx/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-database-vertx/src/main/resources/logback.xml +++ b/kora-java-database-vertx/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-graalvm-crud-cassandra/README.md b/kora-java-graalvm-crud-cassandra/README.md index 16d5c5de..457b2de9 100644 --- a/kora-java-graalvm-crud-cassandra/README.md +++ b/kora-java-graalvm-crud-cassandra/README.md @@ -58,6 +58,19 @@ docker run --rm --entrypoint cat kora-java-graalvm-crud-cassandra /opt/app/appli ./gradlew run ``` +## Run Docker-Compose + +Требуется сначала собрать артефакт: + +```shell +./gradlew shadowJar +``` + +Запустить как docker-compose: +```shell +docker-compose up +``` + ## Test Тесты используют [Testcontainers](https://java.testcontainers.org/), требуется [Docker](https://docs.docker.com/engine/install/) окружение для запуска тестов или аналогичные контейнерные окружения ([colima](https://github.com/abiosoft/colima) / итп) diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index d0e8fcee..2bbef98f 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -18,7 +18,8 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.cassandra.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-graalvm-crud-cassandra/docker-compose.yml b/kora-java-graalvm-crud-cassandra/docker-compose.yml new file mode 100644 index 00000000..ed339bf2 --- /dev/null +++ b/kora-java-graalvm-crud-cassandra/docker-compose.yml @@ -0,0 +1,30 @@ +services: + scylla: + image: scylladb/scylla:2025.3 + restart: unless-stopped + ports: + - '5432:5432' + + + +# Можно закомментировать секцию application и использовать docker-compose +# как окружения для запуска сервиса через gradle run + application: + image: kora-java-graalvm-crud-cassandra + build: . + restart: unless-stopped + ports: + - '8080:8080' + - '8085:8085' + environment: + CASSANDRA_CONTACT_POINTS: jdbc:postgresql://postgres:5432/postgres + CASSANDRA_USER: cassandra + CASSANDRA_PASS: cassandra + CASSANDRA_DC: cassandra + CASSANDRA_KEYSPACE: cassandra + REDIS_URL: redis + REDIS_USER: redis + REDIS_PASS: redis + depends_on: + - scylla + - redis diff --git a/kora-java-graalvm-crud-cassandra/src/main/resources/application.conf b/kora-java-graalvm-crud-cassandra/src/main/resources/application.conf index 6fc5191b..86cc91cf 100644 --- a/kora-java-graalvm-crud-cassandra/src/main/resources/application.conf +++ b/kora-java-graalvm-crud-cassandra/src/main/resources/application.conf @@ -72,7 +72,22 @@ resilient { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" - "ru.tinkoff.kora.application.graph.internal.loom.VirtualThreadExecutorHolder": "DEBUG" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-java-graalvm-crud-cassandra/src/main/resources/logback.xml b/kora-java-graalvm-crud-cassandra/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-graalvm-crud-cassandra/src/main/resources/logback.xml +++ b/kora-java-graalvm-crud-cassandra/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-graalvm-crud-jdbc/README.md b/kora-java-graalvm-crud-jdbc/README.md index 25b8127e..69e7a720 100644 --- a/kora-java-graalvm-crud-jdbc/README.md +++ b/kora-java-graalvm-crud-jdbc/README.md @@ -67,7 +67,11 @@ docker run --rm --entrypoint cat kora-java-graalvm-crud-jdbc /opt/app/applicatio ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew shadowJar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index 4576c8b2..9913bdeb 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -19,7 +19,8 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.jdbc.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-graalvm-crud-jdbc/src/main/resources/application.conf b/kora-java-graalvm-crud-jdbc/src/main/resources/application.conf index 18f6d473..0c36be8b 100644 --- a/kora-java-graalvm-crud-jdbc/src/main/resources/application.conf +++ b/kora-java-graalvm-crud-jdbc/src/main/resources/application.conf @@ -59,7 +59,22 @@ resilient { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" - "ru.tinkoff.kora.application.graph.internal.loom.VirtualThreadExecutorHolder": "DEBUG" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-java-graalvm-crud-jdbc/src/main/resources/logback.xml b/kora-java-graalvm-crud-jdbc/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-graalvm-crud-jdbc/src/main/resources/logback.xml +++ b/kora-java-graalvm-crud-jdbc/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java b/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java index c02f9a2f..7f188beb 100644 --- a/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java +++ b/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java @@ -44,7 +44,8 @@ public void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_USER", params.username(), "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", - "RETRY_ATTEMPTS", "0")); + "RETRY_ATTEMPTS", "0", + "LOGGING_LEVEL_ALL", "INFO")); container.start(); } diff --git a/kora-java-graalvm-crud-r2dbc/README.md b/kora-java-graalvm-crud-r2dbc/README.md index eb63e603..43480785 100644 --- a/kora-java-graalvm-crud-r2dbc/README.md +++ b/kora-java-graalvm-crud-r2dbc/README.md @@ -67,7 +67,11 @@ docker run --rm --entrypoint cat kora-java-graalvm-crud-r2dbc /opt/app/applicati ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew shadowJar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index 80850859..0661591d 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -19,7 +19,8 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.r2dbc.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-graalvm-crud-r2dbc/src/main/resources/application.conf b/kora-java-graalvm-crud-r2dbc/src/main/resources/application.conf index 84e8f127..7919aa78 100644 --- a/kora-java-graalvm-crud-r2dbc/src/main/resources/application.conf +++ b/kora-java-graalvm-crud-r2dbc/src/main/resources/application.conf @@ -59,7 +59,22 @@ resilient { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" - "ru.tinkoff.kora.application.graph.internal.loom.VirtualThreadExecutorHolder": "DEBUG" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-java-graalvm-crud-r2dbc/src/main/resources/logback.xml b/kora-java-graalvm-crud-r2dbc/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-graalvm-crud-r2dbc/src/main/resources/logback.xml +++ b/kora-java-graalvm-crud-r2dbc/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java b/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java index 536502d4..259bfd5b 100644 --- a/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java +++ b/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java @@ -45,7 +45,8 @@ public void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_USER", params.username(), "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", - "RETRY_ATTEMPTS", "0")); + "RETRY_ATTEMPTS", "0", + "LOGGING_LEVEL_ALL", "INFO")); container.start(); } diff --git a/kora-java-graalvm-crud-vertx/README.md b/kora-java-graalvm-crud-vertx/README.md index bdfaf400..c48fbc00 100644 --- a/kora-java-graalvm-crud-vertx/README.md +++ b/kora-java-graalvm-crud-vertx/README.md @@ -67,7 +67,11 @@ docker run --rm --entrypoint cat kora-java-graalvm-crud-vertx /opt/app/applicati ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew shadowJar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index 287b81dd..69c462d6 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -19,7 +19,8 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.crud.vertx.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-graalvm-crud-vertx/src/main/resources/application.conf b/kora-java-graalvm-crud-vertx/src/main/resources/application.conf index ab018f46..c4cf4024 100644 --- a/kora-java-graalvm-crud-vertx/src/main/resources/application.conf +++ b/kora-java-graalvm-crud-vertx/src/main/resources/application.conf @@ -59,7 +59,22 @@ resilient { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" - "ru.tinkoff.kora.application.graph.internal.loom.VirtualThreadExecutorHolder": "DEBUG" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-java-graalvm-crud-vertx/src/main/resources/logback.xml b/kora-java-graalvm-crud-vertx/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-graalvm-crud-vertx/src/main/resources/logback.xml +++ b/kora-java-graalvm-crud-vertx/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java b/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java index 1afa1099..7b227607 100644 --- a/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java +++ b/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java @@ -44,7 +44,8 @@ public void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_USER", params.username(), "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", - "RETRY_ATTEMPTS", "0")); + "RETRY_ATTEMPTS", "0", + "LOGGING_LEVEL_ALL", "INFO")); container.start(); } diff --git a/kora-java-graalvm-kafka/README.md b/kora-java-graalvm-kafka/README.md index 565fbd9b..4e75833f 100644 --- a/kora-java-graalvm-kafka/README.md +++ b/kora-java-graalvm-kafka/README.md @@ -45,7 +45,11 @@ docker run --rm --entrypoint cat kora-java-graalvm-kafka /opt/app/application > ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew distTar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index 8cb648ff..cb0d8ca7 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -9,7 +9,8 @@ plugins { mainClassName = "ru.tinkoff.kora.example.graalvm.kafka.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-graalvm-kafka/docker-compose.yml b/kora-java-graalvm-kafka/docker-compose.yml index 95251366..0c72015f 100644 --- a/kora-java-graalvm-kafka/docker-compose.yml +++ b/kora-java-graalvm-kafka/docker-compose.yml @@ -1,6 +1,6 @@ services: kafka: - image: confluentinc/cp-kafka:7.7.1 + image: apache/kafka-native:4.1.0 restart: unless-stopped ports: - '9092:9092' diff --git a/kora-java-graalvm-kafka/src/main/resources/logback.xml b/kora-java-graalvm-kafka/src/main/resources/logback.xml index ab9429a2..5ac63a9a 100644 --- a/kora-java-graalvm-kafka/src/main/resources/logback.xml +++ b/kora-java-graalvm-kafka/src/main/resources/logback.xml @@ -12,10 +12,7 @@ - - - - + diff --git a/kora-java-grpc-client/build.gradle b/kora-java-grpc-client/build.gradle index aea2d238..668df1b9 100644 --- a/kora-java-grpc-client/build.gradle +++ b/kora-java-grpc-client/build.gradle @@ -6,7 +6,8 @@ plugins { id "com.google.protobuf" version "0.9.5" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-grpc-client/src/main/resources/logback.xml b/kora-java-grpc-client/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-grpc-client/src/main/resources/logback.xml +++ b/kora-java-grpc-client/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-grpc-server/build.gradle b/kora-java-grpc-server/build.gradle index 49471f79..57623010 100644 --- a/kora-java-grpc-server/build.gradle +++ b/kora-java-grpc-server/build.gradle @@ -6,7 +6,8 @@ plugins { id "com.google.protobuf" version "0.9.4" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-grpc-server/src/main/resources/logback.xml b/kora-java-grpc-server/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-grpc-server/src/main/resources/logback.xml +++ b/kora-java-grpc-server/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-helloworld/build.gradle b/kora-java-helloworld/build.gradle index 56db8e8c..864c3cce 100644 --- a/kora-java-helloworld/build.gradle +++ b/kora-java-helloworld/build.gradle @@ -7,7 +7,8 @@ plugins { applicationName = "application" mainClassName = "ru.tinkoff.kora.example.helloworld.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-helloworld/src/main/resources/logback.xml b/kora-java-helloworld/src/main/resources/logback.xml index 28f5003e..c6653f78 100644 --- a/kora-java-helloworld/src/main/resources/logback.xml +++ b/kora-java-helloworld/src/main/resources/logback.xml @@ -9,11 +9,8 @@ - + - - - - + diff --git a/kora-java-http-client/build.gradle b/kora-java-http-client/build.gradle index 041805b4..a6d8df9f 100644 --- a/kora-java-http-client/build.gradle +++ b/kora-java-http-client/build.gradle @@ -5,7 +5,8 @@ plugins { } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-http-client/src/main/resources/logback.xml b/kora-java-http-client/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-http-client/src/main/resources/logback.xml +++ b/kora-java-http-client/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-http-server/build.gradle b/kora-java-http-server/build.gradle index 37d38eac..f5e60271 100644 --- a/kora-java-http-server/build.gradle +++ b/kora-java-http-server/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-http-server/src/main/resources/logback.xml b/kora-java-http-server/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-http-server/src/main/resources/logback.xml +++ b/kora-java-http-server/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-kafka/README.md b/kora-java-kafka/README.md index 1e0f3435..42b6e2b5 100644 --- a/kora-java-kafka/README.md +++ b/kora-java-kafka/README.md @@ -29,7 +29,11 @@ ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew distTar +``` Запустить как docker-compose: ```shell diff --git a/kora-java-kafka/build.gradle b/kora-java-kafka/build.gradle index 4dba435a..99cadd54 100644 --- a/kora-java-kafka/build.gradle +++ b/kora-java-kafka/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-kafka/docker-compose.yml b/kora-java-kafka/docker-compose.yml index e30fe44e..0b05ef42 100644 --- a/kora-java-kafka/docker-compose.yml +++ b/kora-java-kafka/docker-compose.yml @@ -1,6 +1,6 @@ services: kafka: - image: confluentinc/cp-kafka:7.7.1 + image: apache/kafka-native:4.1.0 restart: unless-stopped ports: - '9092:9092' diff --git a/kora-java-kafka/src/main/resources/logback.xml b/kora-java-kafka/src/main/resources/logback.xml index c98739bf..b3860715 100644 --- a/kora-java-kafka/src/main/resources/logback.xml +++ b/kora-java-kafka/src/main/resources/logback.xml @@ -12,10 +12,7 @@ - - - - + diff --git a/kora-java-openapi-generator-http-client/build.gradle b/kora-java-openapi-generator-http-client/build.gradle index 3af8a673..fb786a98 100644 --- a/kora-java-openapi-generator-http-client/build.gradle +++ b/kora-java-openapi-generator-http-client/build.gradle @@ -14,7 +14,8 @@ plugins { id "org.openapi.generator" version "7.14.0" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-openapi-generator-http-client/src/main/resources/logback.xml b/kora-java-openapi-generator-http-client/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-openapi-generator-http-client/src/main/resources/logback.xml +++ b/kora-java-openapi-generator-http-client/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-openapi-generator-http-server/build.gradle b/kora-java-openapi-generator-http-server/build.gradle index 696ba163..34bc7947 100644 --- a/kora-java-openapi-generator-http-server/build.gradle +++ b/kora-java-openapi-generator-http-server/build.gradle @@ -14,7 +14,8 @@ plugins { id "org.openapi.generator" version "7.14.0" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-openapi-generator-http-server/src/main/resources/logback.xml b/kora-java-openapi-generator-http-server/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-openapi-generator-http-server/src/main/resources/logback.xml +++ b/kora-java-openapi-generator-http-server/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-resilient/build.gradle b/kora-java-resilient/build.gradle index b35c63b0..92dcecde 100644 --- a/kora-java-resilient/build.gradle +++ b/kora-java-resilient/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-resilient/src/main/resources/logback.xml b/kora-java-resilient/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-resilient/src/main/resources/logback.xml +++ b/kora-java-resilient/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-s3-client-aws/build.gradle b/kora-java-s3-client-aws/build.gradle index cfa3b98d..5be8c7d9 100644 --- a/kora-java-s3-client-aws/build.gradle +++ b/kora-java-s3-client-aws/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-s3-client-aws/src/main/resources/logback.xml b/kora-java-s3-client-aws/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-s3-client-aws/src/main/resources/logback.xml +++ b/kora-java-s3-client-aws/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-s3-client-minio/build.gradle b/kora-java-s3-client-minio/build.gradle index 1d477212..2e13e32f 100644 --- a/kora-java-s3-client-minio/build.gradle +++ b/kora-java-s3-client-minio/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-s3-client-minio/src/main/resources/logback.xml b/kora-java-s3-client-minio/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-s3-client-minio/src/main/resources/logback.xml +++ b/kora-java-s3-client-minio/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-scheduling-jdk/build.gradle b/kora-java-scheduling-jdk/build.gradle index 0e4e69d0..aacc861b 100644 --- a/kora-java-scheduling-jdk/build.gradle +++ b/kora-java-scheduling-jdk/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-scheduling-jdk/src/main/resources/logback.xml b/kora-java-scheduling-jdk/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-scheduling-jdk/src/main/resources/logback.xml +++ b/kora-java-scheduling-jdk/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-scheduling-quartz/build.gradle b/kora-java-scheduling-quartz/build.gradle index 15f7e931..998441ae 100644 --- a/kora-java-scheduling-quartz/build.gradle +++ b/kora-java-scheduling-quartz/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-scheduling-quartz/src/main/resources/logback.xml b/kora-java-scheduling-quartz/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-scheduling-quartz/src/main/resources/logback.xml +++ b/kora-java-scheduling-quartz/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-soap-client/build.gradle b/kora-java-soap-client/build.gradle index 04e8340c..496c4150 100644 --- a/kora-java-soap-client/build.gradle +++ b/kora-java-soap-client/build.gradle @@ -6,7 +6,8 @@ plugins { id "com.github.bjornvester.wsdl2java" version "2.0.2" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-soap-client/src/main/resources/logback.xml b/kora-java-soap-client/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-soap-client/src/main/resources/logback.xml +++ b/kora-java-soap-client/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-telemetry/build.gradle b/kora-java-telemetry/build.gradle index 03e71df0..ad64ef47 100644 --- a/kora-java-telemetry/build.gradle +++ b/kora-java-telemetry/build.gradle @@ -4,7 +4,8 @@ plugins { id "application" } -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-telemetry/src/main/resources/logback.xml b/kora-java-telemetry/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-telemetry/src/main/resources/logback.xml +++ b/kora-java-telemetry/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-java-validation/build.gradle b/kora-java-validation/build.gradle index 536b9db4..69e7f605 100644 --- a/kora-java-validation/build.gradle +++ b/kora-java-validation/build.gradle @@ -7,7 +7,8 @@ plugins { applicationName = "application" mainClassName = "ru.tinkoff.kora.example.validation.Application" -java.toolchain.languageVersion = JavaLanguageVersion.of(24) +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 configurations { koraBom diff --git a/kora-java-validation/src/main/resources/logback.xml b/kora-java-validation/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-java-validation/src/main/resources/logback.xml +++ b/kora-java-validation/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-kotlin-crud/README.md b/kora-kotlin-crud/README.md index 622fa8df..ad69fbae 100644 --- a/kora-kotlin-crud/README.md +++ b/kora-kotlin-crud/README.md @@ -60,7 +60,11 @@ docker build -t kora-kotlin-crud . ## Run Docker-Compose -Требуется сначала собрать артефакт. +Требуется сначала собрать артефакт: + +```shell +./gradlew distTar +``` Запустить как docker-compose: ```shell diff --git a/kora-kotlin-crud/src/main/resources/application.conf b/kora-kotlin-crud/src/main/resources/application.conf index 7877dae1..cce614c2 100644 --- a/kora-kotlin-crud/src/main/resources/application.conf +++ b/kora-kotlin-crud/src/main/resources/application.conf @@ -55,6 +55,22 @@ resilient { logging.level { "root": "WARN" + "root": ${?LOGGING_LEVEL_ALL} + "root": ${?LOGGING_LEVEL_ROOT} + "ru.tinkoff.kora": "INFO" + "ru.tinkoff.kora": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora": ${?LOGGING_LEVEL_KORA} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.http.server": ${?LOGGING_LEVEL_KORA_HTTP_SERVER} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.database": ${?LOGGING_LEVEL_KORA_DATABASE} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.cache": ${?LOGGING_LEVEL_KORA_CACHE} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.resilient": ${?LOGGING_LEVEL_KORA_RESILIENT} + "ru.tinkoff.kora.example": "INFO" + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_ALL} + "ru.tinkoff.kora.example": ${?LOGGING_LEVEL_APP} } diff --git a/kora-kotlin-crud/src/main/resources/logback.xml b/kora-kotlin-crud/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-kotlin-crud/src/main/resources/logback.xml +++ b/kora-kotlin-crud/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + diff --git a/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt b/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt index 2f9a1b80..97f72ae1 100644 --- a/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt +++ b/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt @@ -45,6 +45,7 @@ class BlackBoxTests(@ConnectionPostgreSQL val connection: JdbcConnection) { "POSTGRES_PASS" to params.password(), "CACHE_MAX_SIZE" to "0", "RETRY_ATTEMPTS" to "0", + "LOGGING_LEVEL_ALL" to "INFO", ) ) container.start() diff --git a/kora-kotlin-helloworld/src/main/resources/logback.xml b/kora-kotlin-helloworld/src/main/resources/logback.xml index 28f5003e..dfb612dd 100644 --- a/kora-kotlin-helloworld/src/main/resources/logback.xml +++ b/kora-kotlin-helloworld/src/main/resources/logback.xml @@ -12,8 +12,5 @@ - - - - + From 69efdc29b36a2bc8e445031c4db85aa4729c1740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=B4=80=C9=B4=E1=B4=9B=E1=B4=8F=C9=B4?= Date: Tue, 30 Sep 2025 12:44:07 +0300 Subject: [PATCH 05/12] Improved HelloWorldController (#35) --- .../kora/example/helloworld/HelloWorldController.java | 7 +++++++ .../kora/kotlin/example/helloworld/HelloWorldController.kt | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/kora-java-helloworld/src/main/java/ru/tinkoff/kora/example/helloworld/HelloWorldController.java b/kora-java-helloworld/src/main/java/ru/tinkoff/kora/example/helloworld/HelloWorldController.java index dd0adfd0..ff38011e 100644 --- a/kora-java-helloworld/src/main/java/ru/tinkoff/kora/example/helloworld/HelloWorldController.java +++ b/kora-java-helloworld/src/main/java/ru/tinkoff/kora/example/helloworld/HelloWorldController.java @@ -2,6 +2,7 @@ import ru.tinkoff.kora.common.Component; import ru.tinkoff.kora.http.common.HttpMethod; +import ru.tinkoff.kora.http.common.HttpResponseEntity; import ru.tinkoff.kora.http.common.annotation.HttpRoute; import ru.tinkoff.kora.http.common.body.HttpBody; import ru.tinkoff.kora.http.server.common.HttpServerResponse; @@ -20,6 +21,12 @@ public HelloWorldResponse helloWorldJson() { return new HelloWorldResponse("Hello World"); } + @Json + @HttpRoute(method = HttpMethod.GET, path = "/hello/world/json/entity") + public HttpResponseEntity helloWorldJsonEntity() { + return HttpResponseEntity.of(200, new HelloWorldResponse("Hello World")); + } + @HttpRoute(method = HttpMethod.GET, path = "/hello/world") public HttpServerResponse helloWorld() { return HttpServerResponse.of(200, HttpBody.plaintext("Hello World")); diff --git a/kora-kotlin-helloworld/src/main/kotlin/ru/tinkoff/kora/kotlin/example/helloworld/HelloWorldController.kt b/kora-kotlin-helloworld/src/main/kotlin/ru/tinkoff/kora/kotlin/example/helloworld/HelloWorldController.kt index b6de089a..967b2c83 100644 --- a/kora-kotlin-helloworld/src/main/kotlin/ru/tinkoff/kora/kotlin/example/helloworld/HelloWorldController.kt +++ b/kora-kotlin-helloworld/src/main/kotlin/ru/tinkoff/kora/kotlin/example/helloworld/HelloWorldController.kt @@ -2,6 +2,7 @@ package ru.tinkoff.kora.kotlin.example.helloworld import ru.tinkoff.kora.common.Component import ru.tinkoff.kora.http.common.HttpMethod +import ru.tinkoff.kora.http.common.HttpResponseEntity import ru.tinkoff.kora.http.common.annotation.HttpRoute import ru.tinkoff.kora.http.common.body.HttpBody import ru.tinkoff.kora.http.server.common.HttpServerResponse @@ -20,6 +21,12 @@ class HelloWorldController { return HelloWorldResponse("Hello World") } + @Json + @HttpRoute(method = HttpMethod.GET, path = "/hello/world/json/entity") + fun helloWorldJsonEntity(): HttpResponseEntity { + return HttpResponseEntity.of(200, HelloWorldResponse("Hello World")) + } + @HttpRoute(method = HttpMethod.GET, path = "/hello/world") fun helloWorld(): HttpServerResponse { return HttpServerResponse.of(200, HttpBody.plaintext("Hello World")) From ad858cbbaf4f8a8ebc6ced89d1336157e1e1edf7 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 13:22:59 +0300 Subject: [PATCH 06/12] Fixed AfterEvaluate --- kora-java-cache-caffeine/build.gradle | 4 +--- kora-java-cache-redis/build.gradle | 4 +--- kora-java-camunda-engine/build.gradle | 4 +--- kora-java-camunda-zeebe-worker/build.gradle | 4 +--- kora-java-config-hocon/build.gradle | 4 +--- kora-java-config-yaml/build.gradle | 4 +--- kora-java-crud-submodule/build.gradle | 4 +--- kora-java-crud/build.gradle | 4 +--- kora-java-database-cassandra/build.gradle | 4 +--- kora-java-database-jdbc/build.gradle | 4 +--- kora-java-database-r2dbc/build.gradle | 4 +--- kora-java-database-vertx/build.gradle | 4 +--- kora-java-graalvm-crud-cassandra/build.gradle | 4 +--- kora-java-graalvm-crud-jdbc/build.gradle | 4 +--- kora-java-graalvm-crud-r2dbc/build.gradle | 4 +--- kora-java-graalvm-crud-vertx/build.gradle | 4 +--- kora-java-graalvm-kafka/build.gradle | 4 +--- kora-java-grpc-client/build.gradle | 4 +--- kora-java-grpc-server/build.gradle | 4 +--- kora-java-helloworld/build.gradle | 4 +--- kora-java-http-client/build.gradle | 4 +--- kora-java-http-server/build.gradle | 4 +--- kora-java-kafka/build.gradle | 4 +--- kora-java-openapi-generator-http-client/build.gradle | 4 +--- kora-java-openapi-generator-http-server/build.gradle | 4 +--- kora-java-resilient/build.gradle | 4 +--- kora-java-s3-client-aws/build.gradle | 4 +--- kora-java-s3-client-minio/build.gradle | 4 +--- kora-java-scheduling-jdk/build.gradle | 4 +--- kora-java-scheduling-quartz/build.gradle | 4 +--- kora-java-soap-client/build.gradle | 4 +--- kora-java-telemetry/build.gradle | 4 +--- kora-java-validation/build.gradle | 4 +--- kora-kotlin-crud/build.gradle.kts | 8 +++----- kora-kotlin-helloworld/build.gradle.kts | 8 +++----- 35 files changed, 39 insertions(+), 109 deletions(-) diff --git a/kora-java-cache-caffeine/build.gradle b/kora-java-cache-caffeine/build.gradle index a0b026ad..0245c5be 100644 --- a/kora-java-cache-caffeine/build.gradle +++ b/kora-java-cache-caffeine/build.gradle @@ -89,9 +89,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-cache-redis/build.gradle b/kora-java-cache-redis/build.gradle index 1bc70ef5..1e2ad284 100644 --- a/kora-java-cache-redis/build.gradle +++ b/kora-java-cache-redis/build.gradle @@ -91,9 +91,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-camunda-engine/build.gradle b/kora-java-camunda-engine/build.gradle index 2605bd75..4eecc6d8 100644 --- a/kora-java-camunda-engine/build.gradle +++ b/kora-java-camunda-engine/build.gradle @@ -101,9 +101,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-camunda-zeebe-worker/build.gradle b/kora-java-camunda-zeebe-worker/build.gradle index 81239948..22f1031b 100644 --- a/kora-java-camunda-zeebe-worker/build.gradle +++ b/kora-java-camunda-zeebe-worker/build.gradle @@ -92,9 +92,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-config-hocon/build.gradle b/kora-java-config-hocon/build.gradle index 82970e9e..13a35d4e 100644 --- a/kora-java-config-hocon/build.gradle +++ b/kora-java-config-hocon/build.gradle @@ -88,9 +88,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-config-yaml/build.gradle b/kora-java-config-yaml/build.gradle index cc9ceb7f..19317068 100644 --- a/kora-java-config-yaml/build.gradle +++ b/kora-java-config-yaml/build.gradle @@ -87,9 +87,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-crud-submodule/build.gradle b/kora-java-crud-submodule/build.gradle index a8d2f143..a7d4505b 100644 --- a/kora-java-crud-submodule/build.gradle +++ b/kora-java-crud-submodule/build.gradle @@ -64,9 +64,7 @@ subprojects { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-crud/build.gradle b/kora-java-crud/build.gradle index fcaa1567..6cff6fc1 100644 --- a/kora-java-crud/build.gradle +++ b/kora-java-crud/build.gradle @@ -147,9 +147,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-database-cassandra/build.gradle b/kora-java-database-cassandra/build.gradle index e153163a..4c226fdf 100644 --- a/kora-java-database-cassandra/build.gradle +++ b/kora-java-database-cassandra/build.gradle @@ -95,9 +95,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-database-jdbc/build.gradle b/kora-java-database-jdbc/build.gradle index 91d422a1..1811797d 100644 --- a/kora-java-database-jdbc/build.gradle +++ b/kora-java-database-jdbc/build.gradle @@ -94,9 +94,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-database-r2dbc/build.gradle b/kora-java-database-r2dbc/build.gradle index 43479459..e62efdc6 100644 --- a/kora-java-database-r2dbc/build.gradle +++ b/kora-java-database-r2dbc/build.gradle @@ -95,9 +95,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-database-vertx/build.gradle b/kora-java-database-vertx/build.gradle index c8271de9..c794386c 100644 --- a/kora-java-database-vertx/build.gradle +++ b/kora-java-database-vertx/build.gradle @@ -96,9 +96,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index 2bbef98f..5094fb96 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -169,9 +169,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index 9913bdeb..5c0dc191 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -170,9 +170,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index 0661591d..c407beae 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -172,9 +172,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index 69c462d6..3b46ec10 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -174,9 +174,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index cb0d8ca7..27a725a7 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -124,9 +124,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-grpc-client/build.gradle b/kora-java-grpc-client/build.gradle index 668df1b9..e64022d5 100644 --- a/kora-java-grpc-client/build.gradle +++ b/kora-java-grpc-client/build.gradle @@ -116,9 +116,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-grpc-server/build.gradle b/kora-java-grpc-server/build.gradle index 57623010..77e95af9 100644 --- a/kora-java-grpc-server/build.gradle +++ b/kora-java-grpc-server/build.gradle @@ -117,9 +117,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-helloworld/build.gradle b/kora-java-helloworld/build.gradle index 864c3cce..b9a2438e 100644 --- a/kora-java-helloworld/build.gradle +++ b/kora-java-helloworld/build.gradle @@ -94,9 +94,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-http-client/build.gradle b/kora-java-http-client/build.gradle index a6d8df9f..ef8d4547 100644 --- a/kora-java-http-client/build.gradle +++ b/kora-java-http-client/build.gradle @@ -93,9 +93,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-http-server/build.gradle b/kora-java-http-server/build.gradle index f5e60271..f517f4e5 100644 --- a/kora-java-http-server/build.gradle +++ b/kora-java-http-server/build.gradle @@ -89,9 +89,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-kafka/build.gradle b/kora-java-kafka/build.gradle index 99cadd54..492819fa 100644 --- a/kora-java-kafka/build.gradle +++ b/kora-java-kafka/build.gradle @@ -91,9 +91,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-openapi-generator-http-client/build.gradle b/kora-java-openapi-generator-http-client/build.gradle index fb786a98..f8fbe690 100644 --- a/kora-java-openapi-generator-http-client/build.gradle +++ b/kora-java-openapi-generator-http-client/build.gradle @@ -145,9 +145,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-openapi-generator-http-server/build.gradle b/kora-java-openapi-generator-http-server/build.gradle index 34bc7947..e0ccb6b8 100644 --- a/kora-java-openapi-generator-http-server/build.gradle +++ b/kora-java-openapi-generator-http-server/build.gradle @@ -148,9 +148,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-resilient/build.gradle b/kora-java-resilient/build.gradle index 92dcecde..eca0acfb 100644 --- a/kora-java-resilient/build.gradle +++ b/kora-java-resilient/build.gradle @@ -89,9 +89,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-s3-client-aws/build.gradle b/kora-java-s3-client-aws/build.gradle index 5be8c7d9..deb781ad 100644 --- a/kora-java-s3-client-aws/build.gradle +++ b/kora-java-s3-client-aws/build.gradle @@ -97,9 +97,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-s3-client-minio/build.gradle b/kora-java-s3-client-minio/build.gradle index 2e13e32f..00692537 100644 --- a/kora-java-s3-client-minio/build.gradle +++ b/kora-java-s3-client-minio/build.gradle @@ -97,9 +97,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-scheduling-jdk/build.gradle b/kora-java-scheduling-jdk/build.gradle index aacc861b..2f1440ba 100644 --- a/kora-java-scheduling-jdk/build.gradle +++ b/kora-java-scheduling-jdk/build.gradle @@ -90,9 +90,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-scheduling-quartz/build.gradle b/kora-java-scheduling-quartz/build.gradle index 998441ae..b377f154 100644 --- a/kora-java-scheduling-quartz/build.gradle +++ b/kora-java-scheduling-quartz/build.gradle @@ -90,9 +90,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-soap-client/build.gradle b/kora-java-soap-client/build.gradle index 496c4150..d30837b3 100644 --- a/kora-java-soap-client/build.gradle +++ b/kora-java-soap-client/build.gradle @@ -114,9 +114,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-telemetry/build.gradle b/kora-java-telemetry/build.gradle index ad64ef47..e6764163 100644 --- a/kora-java-telemetry/build.gradle +++ b/kora-java-telemetry/build.gradle @@ -85,9 +85,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-java-validation/build.gradle b/kora-java-validation/build.gradle index 69e7f605..7c9980f4 100644 --- a/kora-java-validation/build.gradle +++ b/kora-java-validation/build.gradle @@ -79,9 +79,7 @@ jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) - } + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) } javadoc { diff --git a/kora-kotlin-crud/build.gradle.kts b/kora-kotlin-crud/build.gradle.kts index 956c0b13..8fe77e0a 100644 --- a/kora-kotlin-crud/build.gradle.kts +++ b/kora-kotlin-crud/build.gradle.kts @@ -157,9 +157,7 @@ tasks.jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching { - jacocoExcludeSet.forEach { exclude(it) } - }) - } + classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching { + jacocoExcludeSet.forEach { exclude(it) } + }) } diff --git a/kora-kotlin-helloworld/build.gradle.kts b/kora-kotlin-helloworld/build.gradle.kts index 4cc539d2..26286748 100644 --- a/kora-kotlin-helloworld/build.gradle.kts +++ b/kora-kotlin-helloworld/build.gradle.kts @@ -80,9 +80,7 @@ tasks.jacocoTestReport { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - afterEvaluate { - classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching { - jacocoExcludeSet.forEach { exclude(it) } - }) - } + classDirectories.setFrom(sourceSets.main.get().output.asFileTree.matching { + jacocoExcludeSet.forEach { exclude(it) } + }) } From b1ec660143e9c47e208ef93694ef96605af89683 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 13:40:28 +0300 Subject: [PATCH 07/12] Updated images Fixed submodule --- kora-java-cache-caffeine/Dockerfile | 2 +- kora-java-cache-redis/Dockerfile | 2 +- kora-java-camunda-engine/Dockerfile | 2 +- kora-java-camunda-zeebe-worker/Dockerfile | 2 +- kora-java-config-hocon/Dockerfile | 2 +- kora-java-config-yaml/Dockerfile | 2 +- kora-java-crud-submodule/build.gradle | 10 +++++++++- .../kora-java-crud-submodule-app/Dockerfile | 2 +- kora-java-crud/Dockerfile | 2 +- kora-java-database-cassandra/Dockerfile | 2 +- kora-java-database-jdbc/Dockerfile | 2 +- kora-java-database-r2dbc/Dockerfile | 2 +- kora-java-database-vertx/Dockerfile | 2 +- kora-java-grpc-client/Dockerfile | 2 +- kora-java-grpc-server/Dockerfile | 2 +- kora-java-helloworld/Dockerfile | 2 +- kora-java-http-client/Dockerfile | 2 +- kora-java-http-server/Dockerfile | 2 +- kora-java-kafka/Dockerfile | 2 +- kora-java-openapi-generator-http-client/Dockerfile | 2 +- kora-java-openapi-generator-http-server/Dockerfile | 2 +- kora-java-resilient/Dockerfile | 2 +- kora-java-s3-client-aws/Dockerfile | 2 +- kora-java-s3-client-minio/Dockerfile | 2 +- kora-java-scheduling-jdk/Dockerfile | 2 +- kora-java-scheduling-quartz/Dockerfile | 2 +- kora-java-soap-client/Dockerfile | 2 +- kora-java-telemetry/Dockerfile | 2 +- kora-java-validation/Dockerfile | 2 +- kora-kotlin-crud/Dockerfile | 2 +- kora-kotlin-helloworld/Dockerfile | 2 +- 31 files changed, 39 insertions(+), 31 deletions(-) diff --git a/kora-java-cache-caffeine/Dockerfile b/kora-java-cache-caffeine/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-cache-caffeine/Dockerfile +++ b/kora-java-cache-caffeine/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-cache-redis/Dockerfile b/kora-java-cache-redis/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-cache-redis/Dockerfile +++ b/kora-java-cache-redis/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-camunda-engine/Dockerfile b/kora-java-camunda-engine/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-camunda-engine/Dockerfile +++ b/kora-java-camunda-engine/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-camunda-zeebe-worker/Dockerfile b/kora-java-camunda-zeebe-worker/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-camunda-zeebe-worker/Dockerfile +++ b/kora-java-camunda-zeebe-worker/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-config-hocon/Dockerfile b/kora-java-config-hocon/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-config-hocon/Dockerfile +++ b/kora-java-config-hocon/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-config-yaml/Dockerfile b/kora-java-config-yaml/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-config-yaml/Dockerfile +++ b/kora-java-config-yaml/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-crud-submodule/build.gradle b/kora-java-crud-submodule/build.gradle index a7d4505b..c869acbc 100644 --- a/kora-java-crud-submodule/build.gradle +++ b/kora-java-crud-submodule/build.gradle @@ -46,6 +46,12 @@ subprojects { exceptionFormat("full") } + exclude("**/\$*") + + jacoco { + excludes += ["**/generated/**", "**/Application*", "**/\$*"] + } + reports { html.required = false junitXml.required = false @@ -64,7 +70,9 @@ subprojects { xml.required = true html.outputLocation = layout.buildDirectory.dir("jacocoHtml") } - classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + afterEvaluate { + classDirectories = files(classDirectories.files.collect { fileTree(dir: it, excludes: test.jacoco.excludes) }) + } } javadoc { diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/Dockerfile b/kora-java-crud-submodule/kora-java-crud-submodule-app/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/Dockerfile +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-crud/Dockerfile b/kora-java-crud/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-crud/Dockerfile +++ b/kora-java-crud/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-database-cassandra/Dockerfile b/kora-java-database-cassandra/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-database-cassandra/Dockerfile +++ b/kora-java-database-cassandra/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-database-jdbc/Dockerfile b/kora-java-database-jdbc/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-database-jdbc/Dockerfile +++ b/kora-java-database-jdbc/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-database-r2dbc/Dockerfile b/kora-java-database-r2dbc/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-database-r2dbc/Dockerfile +++ b/kora-java-database-r2dbc/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-database-vertx/Dockerfile b/kora-java-database-vertx/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-database-vertx/Dockerfile +++ b/kora-java-database-vertx/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-grpc-client/Dockerfile b/kora-java-grpc-client/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-grpc-client/Dockerfile +++ b/kora-java-grpc-client/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-grpc-server/Dockerfile b/kora-java-grpc-server/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-grpc-server/Dockerfile +++ b/kora-java-grpc-server/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-helloworld/Dockerfile b/kora-java-helloworld/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-helloworld/Dockerfile +++ b/kora-java-helloworld/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-http-client/Dockerfile b/kora-java-http-client/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-http-client/Dockerfile +++ b/kora-java-http-client/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-http-server/Dockerfile b/kora-java-http-server/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-http-server/Dockerfile +++ b/kora-java-http-server/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-kafka/Dockerfile b/kora-java-kafka/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-kafka/Dockerfile +++ b/kora-java-kafka/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-openapi-generator-http-client/Dockerfile b/kora-java-openapi-generator-http-client/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-openapi-generator-http-client/Dockerfile +++ b/kora-java-openapi-generator-http-client/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-openapi-generator-http-server/Dockerfile b/kora-java-openapi-generator-http-server/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-openapi-generator-http-server/Dockerfile +++ b/kora-java-openapi-generator-http-server/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-resilient/Dockerfile b/kora-java-resilient/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-resilient/Dockerfile +++ b/kora-java-resilient/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-s3-client-aws/Dockerfile b/kora-java-s3-client-aws/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-s3-client-aws/Dockerfile +++ b/kora-java-s3-client-aws/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-s3-client-minio/Dockerfile b/kora-java-s3-client-minio/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-s3-client-minio/Dockerfile +++ b/kora-java-s3-client-minio/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-scheduling-jdk/Dockerfile b/kora-java-scheduling-jdk/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-scheduling-jdk/Dockerfile +++ b/kora-java-scheduling-jdk/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-scheduling-quartz/Dockerfile b/kora-java-scheduling-quartz/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-scheduling-quartz/Dockerfile +++ b/kora-java-scheduling-quartz/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-soap-client/Dockerfile b/kora-java-soap-client/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-soap-client/Dockerfile +++ b/kora-java-soap-client/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-telemetry/Dockerfile b/kora-java-telemetry/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-telemetry/Dockerfile +++ b/kora-java-telemetry/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-java-validation/Dockerfile b/kora-java-validation/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-java-validation/Dockerfile +++ b/kora-java-validation/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-kotlin-crud/Dockerfile b/kora-kotlin-crud/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-kotlin-crud/Dockerfile +++ b/kora-kotlin-crud/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app diff --git a/kora-kotlin-helloworld/Dockerfile b/kora-kotlin-helloworld/Dockerfile index a976c8b9..c22138f1 100644 --- a/kora-kotlin-helloworld/Dockerfile +++ b/kora-kotlin-helloworld/Dockerfile @@ -1,4 +1,4 @@ -ARG RUN_IMAGE=eclipse-temurin:17-jre-jammy +ARG RUN_IMAGE=eclipse-temurin:25-jre-jammy FROM ${RUN_IMAGE} ARG TARGET_DIR=/opt/app From 8547e7a939521501c77254e38e35cd7b58ca5e54 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 16:41:48 +0300 Subject: [PATCH 08/12] 1.2.3 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 00569639..21ba8bc0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupId=ru.tinkoff.kora -koraVersion=1.2.0-SNAPSHOT +koraVersion=1.2.3 ##### GRADLE ##### From a387ea4bfb64d3f7570009a7f6d034733e2bf31f Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 18:12:43 +0300 Subject: [PATCH 09/12] Updated build.gradle Updated Gradle to 9.1 --- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 15 +- gradlew.bat | 5 +- kora-java-cache-caffeine/build.gradle | 18 ++- kora-java-cache-redis/build.gradle | 18 ++- kora-java-camunda-engine/build.gradle | 18 ++- kora-java-camunda-zeebe-worker/build.gradle | 18 ++- kora-java-config-hocon/build.gradle | 18 ++- kora-java-config-yaml/build.gradle | 18 ++- kora-java-crud-submodule/build.gradle | 8 +- .../kora-java-crud-submodule-app/build.gradle | 7 +- .../example/submodule/app/BlackBoxTests.java | 3 +- kora-java-crud/build.gradle | 18 ++- .../kora/example/crud/BlackBoxTests.java | 3 +- kora-java-database-cassandra/build.gradle | 18 ++- kora-java-database-jdbc/build.gradle | 18 ++- kora-java-database-r2dbc/build.gradle | 18 ++- kora-java-database-vertx/build.gradle | 18 ++- kora-java-graalvm-crud-cassandra/build.gradle | 28 ++-- kora-java-graalvm-crud-jdbc/build.gradle | 28 ++-- .../graalvm/crud/jdbc/BlackBoxTests.java | 3 +- kora-java-graalvm-crud-r2dbc/build.gradle | 28 ++-- .../graalvm/crud/r2dbc/BlackBoxTests.java | 3 +- kora-java-graalvm-crud-vertx/build.gradle | 28 ++-- .../graalvm/crud/vertx/BlackBoxTests.java | 3 +- kora-java-graalvm-kafka/build.gradle | 28 ++-- kora-java-grpc-client/build.gradle | 18 ++- kora-java-grpc-server/build.gradle | 18 ++- kora-java-helloworld/build.gradle | 21 ++- kora-java-http-client/build.gradle | 18 ++- kora-java-http-server/build.gradle | 17 +-- .../server/BlockStreamingHttpBodyOutput.java | 59 ++++++++ .../server/JsonStreamingGetController.java | 129 ++++++++++++++++++ kora-java-kafka/build.gradle | 18 ++- .../build.gradle | 18 ++- .../build.gradle | 18 ++- kora-java-resilient/build.gradle | 18 ++- kora-java-s3-client-aws/build.gradle | 18 ++- kora-java-s3-client-minio/build.gradle | 18 ++- kora-java-scheduling-jdk/build.gradle | 18 ++- kora-java-scheduling-quartz/build.gradle | 18 ++- kora-java-soap-client/build.gradle | 18 ++- kora-java-telemetry/build.gradle | 18 ++- kora-java-validation/build.gradle | 25 ++-- kora-kotlin-crud/build.gradle.kts | 20 ++- .../kora/kotlin/example/crud/BlackBoxTests.kt | 3 +- kora-kotlin-helloworld/build.gradle.kts | 19 ++- 48 files changed, 530 insertions(+), 387 deletions(-) create mode 100644 kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java create mode 100644 kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..8bdaf60c75ab801e22807dde59e12a8735a34077 100644 GIT binary patch delta 37298 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 bk)x42o%IjI4BRP0u<>w0AZH4H-*Em1`@F3o delta 35308 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 BrcM9= diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9355b415..2e111328 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a42..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 25da30db..c4bdd3ab 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -68,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/kora-java-cache-caffeine/build.gradle b/kora-java-cache-caffeine/build.gradle index 0245c5be..8e785c2b 100644 --- a/kora-java-cache-caffeine/build.gradle +++ b/kora-java-cache-caffeine/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -29,9 +22,14 @@ dependencies { testImplementation "ru.tinkoff.kora:test-junit5" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.cache.caffeine.Application" + mainClass = "ru.tinkoff.kora.example.cache.caffeine.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-cache-redis/build.gradle b/kora-java-cache-redis/build.gradle index 1e2ad284..95dfdfe7 100644 --- a/kora-java-cache-redis/build.gradle +++ b/kora-java-cache-redis/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -31,9 +24,14 @@ dependencies { testImplementation "redis.clients:jedis:4.4.3" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.cache.redis.Application" + mainClass = "ru.tinkoff.kora.example.cache.redis.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-camunda-engine/build.gradle b/kora-java-camunda-engine/build.gradle index 4eecc6d8..ca7c9277 100644 --- a/kora-java-camunda-engine/build.gradle +++ b/kora-java-camunda-engine/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -39,9 +32,14 @@ dependencies { testImplementation "org.assertj:assertj-core:3.26.0" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.camunda.engine.Application" + mainClass = "ru.tinkoff.kora.example.camunda.engine.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-camunda-zeebe-worker/build.gradle b/kora-java-camunda-zeebe-worker/build.gradle index 22f1031b..751a16f5 100644 --- a/kora-java-camunda-zeebe-worker/build.gradle +++ b/kora-java-camunda-zeebe-worker/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,9 +25,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.camunda.zeebe.Application" + mainClass = "ru.tinkoff.kora.example.camunda.zeebe.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-config-hocon/build.gradle b/kora-java-config-hocon/build.gradle index 13a35d4e..08686fde 100644 --- a/kora-java-config-hocon/build.gradle +++ b/kora-java-config-hocon/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -28,9 +21,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.config.hocon.Application" + mainClass = "ru.tinkoff.kora.example.config.hocon.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-config-yaml/build.gradle b/kora-java-config-yaml/build.gradle index 19317068..6176337b 100644 --- a/kora-java-config-yaml/build.gradle +++ b/kora-java-config-yaml/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -28,9 +21,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.config.hocon.Application" + mainClass = "ru.tinkoff.kora.example.config.hocon.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-crud-submodule/build.gradle b/kora-java-crud-submodule/build.gradle index c869acbc..cdb1710e 100644 --- a/kora-java-crud-submodule/build.gradle +++ b/kora-java-crud-submodule/build.gradle @@ -5,9 +5,6 @@ plugins { subprojects { apply plugin: "jacoco" - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom annotationProcessor.extendsFrom(koraBom) @@ -29,6 +26,11 @@ subprojects { testImplementation "ru.tinkoff.kora:test-junit5" } + java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + test { jvmArgs += [ "-XX:+TieredCompilation", diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle b/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle index 3d92305e..927661e2 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/build.gradle @@ -40,9 +40,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.submodule.app.Application" + mainClass = "ru.tinkoff.kora.example.submodule.app.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java index b821157e..875c9b47 100644 --- a/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java +++ b/kora-java-crud-submodule/kora-java-crud-submodule-app/src/test/java/ru/tinkoff/kora/example/submodule/app/BlackBoxTests.java @@ -44,7 +44,8 @@ public static void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", "RETRY_ATTEMPTS", "0", - "LOGGING_LEVEL_ALL", "INFO")); + "LOGGING_LEVEL_KORA", "DEBUG", + "LOGGING_LEVEL_APP", "DEBUG")); container.start(); } diff --git a/kora-java-crud/build.gradle b/kora-java-crud/build.gradle index 6cff6fc1..f2d15d8c 100644 --- a/kora-java-crud/build.gradle +++ b/kora-java-crud/build.gradle @@ -15,17 +15,10 @@ plugins { id "org.flywaydb.flyway" version "8.4.2" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -58,9 +51,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.crud.Application" + mainClass = "ru.tinkoff.kora.example.crud.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java b/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java index 03df076c..aec77bca 100644 --- a/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java +++ b/kora-java-crud/src/test/java/ru/tinkoff/kora/example/crud/BlackBoxTests.java @@ -44,7 +44,8 @@ public static void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", "RETRY_ATTEMPTS", "0", - "LOGGING_LEVEL_ALL", "INFO")); + "LOGGING_LEVEL_KORA", "DEBUG", + "LOGGING_LEVEL_APP", "DEBUG")); container.start(); } diff --git a/kora-java-database-cassandra/build.gradle b/kora-java-database-cassandra/build.gradle index 4c226fdf..b3caa67a 100644 --- a/kora-java-database-cassandra/build.gradle +++ b/kora-java-database-cassandra/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -31,9 +24,14 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-cassandra:0.12.2" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.cassandra.Application" + mainClass = "ru.tinkoff.kora.example.cassandra.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-database-jdbc/build.gradle b/kora-java-database-jdbc/build.gradle index 1811797d..109e10c7 100644 --- a/kora-java-database-jdbc/build.gradle +++ b/kora-java-database-jdbc/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,10 +25,15 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-postgres:0.12.2" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.jdbc.Application" + mainClass = "ru.tinkoff.kora.example.jdbc.Application" } //noinspection GroovyAssignabilityCheck diff --git a/kora-java-database-r2dbc/build.gradle b/kora-java-database-r2dbc/build.gradle index e62efdc6..42b42843 100644 --- a/kora-java-database-r2dbc/build.gradle +++ b/kora-java-database-r2dbc/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,9 +26,14 @@ dependencies { testImplementation "org.postgresql:postgresql:42.7.7" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.r2dbc.Application" + mainClass = "ru.tinkoff.kora.example.r2dbc.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-database-vertx/build.gradle b/kora-java-database-vertx/build.gradle index c794386c..f4838d4d 100644 --- a/kora-java-database-vertx/build.gradle +++ b/kora-java-database-vertx/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,9 +27,14 @@ dependencies { testImplementation "org.postgresql:postgresql:42.7.7" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.vertx.Application" + mainClass = "ru.tinkoff.kora.example.vertx.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index 5094fb96..ef6d3e4b 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -12,23 +12,14 @@ plugins { id "application" id "org.openapi.generator" version "7.14.0" - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.2.2" id "org.graalvm.buildtools.native" version "0.11.0" } -mainClassName = "ru.tinkoff.kora.example.graalvm.crud.cassandra.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -63,6 +54,15 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + mainClass = "ru.tinkoff.kora.example.graalvm.crud.cassandra.Application" +} + def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", GenerateTask) { generatorName = "kora" group = "openapi tools" @@ -84,7 +84,7 @@ graalvmNative { binaries { main { imageName = "$project.name" - mainClass = "$mainClassName" + mainClass = "$application.mainClass" javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21) vendor = JvmVendorSpec.matching("GraalVM Community") @@ -117,7 +117,7 @@ jar.enabled = false shadowJar { mergeServiceFiles() manifest { - attributes "Main-Class": mainClassName + attributes "Main-Class": application.mainClass attributes "Implementation-Version": koraVersion } } diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index 5c0dc191..4d7f4d0f 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -13,23 +13,14 @@ plugins { id "org.openapi.generator" version "7.14.0" id "org.flywaydb.flyway" version "8.4.2" - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.2.2" id "org.graalvm.buildtools.native" version "0.11.0" } -mainClassName = "ru.tinkoff.kora.example.graalvm.crud.jdbc.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -62,6 +53,15 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + mainClass = "ru.tinkoff.kora.example.graalvm.crud.jdbc.Application" +} + def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", GenerateTask) { generatorName = "kora" group = "openapi tools" @@ -83,7 +83,7 @@ graalvmNative { binaries { main { imageName = "$project.name" - mainClass = "$mainClassName" + mainClass = "$application.mainClass" javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21) vendor = JvmVendorSpec.matching("GraalVM Community") @@ -111,7 +111,7 @@ jar.enabled = false shadowJar { mergeServiceFiles() manifest { - attributes "Main-Class": mainClassName + attributes "Main-Class": application.mainClass attributes "Implementation-Version": koraVersion } } diff --git a/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java b/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java index 7f188beb..308fd40e 100644 --- a/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java +++ b/kora-java-graalvm-crud-jdbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/jdbc/BlackBoxTests.java @@ -45,7 +45,8 @@ public void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", "RETRY_ATTEMPTS", "0", - "LOGGING_LEVEL_ALL", "INFO")); + "LOGGING_LEVEL_KORA", "DEBUG", + "LOGGING_LEVEL_APP", "DEBUG")); container.start(); } diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index c407beae..99651cda 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -13,23 +13,14 @@ plugins { id "org.openapi.generator" version "7.14.0" id "org.flywaydb.flyway" version "8.4.2" - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.2.2" id "org.graalvm.buildtools.native" version "0.11.0" } -mainClassName = "ru.tinkoff.kora.example.graalvm.crud.r2dbc.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -64,6 +55,15 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + mainClass = "ru.tinkoff.kora.example.graalvm.crud.r2dbc.Application" +} + def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", GenerateTask) { generatorName = "kora" group = "openapi tools" @@ -85,7 +85,7 @@ graalvmNative { binaries { main { imageName = "$project.name" - mainClass = "$mainClassName" + mainClass = "$application.mainClass" javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21) vendor = JvmVendorSpec.matching("GraalVM Community") @@ -113,7 +113,7 @@ jar.enabled = false shadowJar { mergeServiceFiles() manifest { - attributes "Main-Class": mainClassName + attributes "Main-Class": application.mainClass attributes "Implementation-Version": koraVersion } } diff --git a/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java b/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java index 259bfd5b..bd3e7dca 100644 --- a/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java +++ b/kora-java-graalvm-crud-r2dbc/src/test/java/ru/tinkoff/kora/example/graalvm/crud/r2dbc/BlackBoxTests.java @@ -46,7 +46,8 @@ public void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", "RETRY_ATTEMPTS", "0", - "LOGGING_LEVEL_ALL", "INFO")); + "LOGGING_LEVEL_KORA", "DEBUG", + "LOGGING_LEVEL_APP", "DEBUG")); container.start(); } diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index 3b46ec10..b40b64aa 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -13,23 +13,14 @@ plugins { id "org.openapi.generator" version "7.14.0" id "org.flywaydb.flyway" version "8.4.2" - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.2.2" id "org.graalvm.buildtools.native" version "0.11.0" } -mainClassName = "ru.tinkoff.kora.example.graalvm.crud.vertx.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -66,6 +57,15 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + mainClass = "ru.tinkoff.kora.example.graalvm.crud.vertx.Application" +} + def openApiGenerateHttpServer = tasks.register("openApiGenerateHttpServer", GenerateTask) { generatorName = "kora" group = "openapi tools" @@ -87,7 +87,7 @@ graalvmNative { binaries { main { imageName = "$project.name" - mainClass = "$mainClassName" + mainClass = "$application.mainClass" javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21) vendor = JvmVendorSpec.matching("GraalVM Community") @@ -115,7 +115,7 @@ jar.enabled = false shadowJar { mergeServiceFiles() manifest { - attributes "Main-Class": mainClassName + attributes "Main-Class": application.mainClass attributes "Implementation-Version": koraVersion } } diff --git a/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java b/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java index 7b227607..447fe318 100644 --- a/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java +++ b/kora-java-graalvm-crud-vertx/src/test/java/ru/tinkoff/kora/example/graalvm/crud/vertx/BlackBoxTests.java @@ -45,7 +45,8 @@ public void setup(@ConnectionPostgreSQL JdbcConnection connection) { "POSTGRES_PASS", params.password(), "CACHE_MAX_SIZE", "0", "RETRY_ATTEMPTS", "0", - "LOGGING_LEVEL_ALL", "INFO")); + "LOGGING_LEVEL_KORA", "DEBUG", + "LOGGING_LEVEL_APP", "DEBUG")); container.start(); } diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index 27a725a7..2519353f 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -3,23 +3,14 @@ plugins { id "jacoco" id "application" - id "com.github.johnrengelman.shadow" version "8.1.1" + id "com.gradleup.shadow" version "9.2.2" id "org.graalvm.buildtools.native" version "0.11.0" } -mainClassName = "ru.tinkoff.kora.example.graalvm.kafka.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -42,11 +33,20 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + mainClass = "ru.tinkoff.kora.example.graalvm.crud.kafka.Application" +} + graalvmNative { binaries { main { imageName = "$project.name" - mainClass = "$mainClassName" + mainClass = "$application.mainClass" javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(21) vendor = JvmVendorSpec.matching("GraalVM Community") @@ -72,7 +72,7 @@ jar.enabled = false shadowJar { mergeServiceFiles() manifest { - attributes "Main-Class": mainClassName + attributes "Main-Class": application.mainClass attributes "Implementation-Version": koraVersion } } diff --git a/kora-java-grpc-client/build.gradle b/kora-java-grpc-client/build.gradle index e64022d5..25678cd6 100644 --- a/kora-java-grpc-client/build.gradle +++ b/kora-java-grpc-client/build.gradle @@ -6,17 +6,10 @@ plugins { id "com.google.protobuf" version "0.9.5" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,9 +27,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.grpc.client.Application" + mainClass = "ru.tinkoff.kora.example.grpc.client.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-grpc-server/build.gradle b/kora-java-grpc-server/build.gradle index 77e95af9..8ae19289 100644 --- a/kora-java-grpc-server/build.gradle +++ b/kora-java-grpc-server/build.gradle @@ -6,17 +6,10 @@ plugins { id "com.google.protobuf" version "0.9.4" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,9 +27,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.grpc.server.Application" + mainClass = "ru.tinkoff.kora.example.grpc.server.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-helloworld/build.gradle b/kora-java-helloworld/build.gradle index b9a2438e..f529f5de 100644 --- a/kora-java-helloworld/build.gradle +++ b/kora-java-helloworld/build.gradle @@ -4,20 +4,10 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.helloworld.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,9 +24,14 @@ dependencies { testImplementation "org.skyscreamer:jsonassert:1.5.1" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.helloworld.Application" + mainClass = "ru.tinkoff.kora.example.helloworld.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-http-client/build.gradle b/kora-java-http-client/build.gradle index ef8d4547..0a9fd708 100644 --- a/kora-java-http-client/build.gradle +++ b/kora-java-http-client/build.gradle @@ -5,17 +5,10 @@ plugins { } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -33,9 +26,14 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-mockserver:0.12.2" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.http.client.Application" + mainClass = "ru.tinkoff.kora.example.http.client.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-http-server/build.gradle b/kora-java-http-server/build.gradle index f517f4e5..665a6fb0 100644 --- a/kora-java-http-server/build.gradle +++ b/kora-java-http-server/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -35,10 +28,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.http.server.Application" + mainClass = "ru.tinkoff.kora.example.http.server.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java b/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java new file mode 100644 index 00000000..a40c7979 --- /dev/null +++ b/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java @@ -0,0 +1,59 @@ +package ru.tinkoff.kora.example.http.server; + +import jakarta.annotation.Nullable; +import java.io.Closeable; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.concurrent.Flow; +import ru.tinkoff.kora.http.common.body.HttpBodyOutput; + +class BlockStreamingHttpBodyOutput implements HttpBodyOutput { + + @FunctionalInterface + public interface OutputConsumer { + + void accept(T t) throws IOException; + } + + private final String contentType; + private final OutputConsumer outputStreamConsumer; + private final Closeable closeable; + + BlockStreamingHttpBodyOutput(String contentType, + OutputConsumer outputStreamConsumer) { + this(contentType, outputStreamConsumer, () -> {}); + } + + BlockStreamingHttpBodyOutput(String contentType, + OutputConsumer outputStreamConsumer, + Closeable closeable) { + this.contentType = contentType; + this.outputStreamConsumer = outputStreamConsumer; + this.closeable = closeable; + } + + @Override + public long contentLength() { + return -1; + } + + @Nullable + @Override + public String contentType() { + return contentType; + } + + @Override + public void subscribe(Flow.Subscriber subscriber) {} + + @Override + public void write(OutputStream os) throws IOException { + outputStreamConsumer.accept(os); + } + + @Override + public void close() throws IOException { + closeable.close(); + } +} diff --git a/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java b/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java new file mode 100644 index 00000000..6aed2ca6 --- /dev/null +++ b/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java @@ -0,0 +1,129 @@ +package ru.tinkoff.kora.example.http.server; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.concurrent.Flow; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.adapter.JdkFlowAdapter; +import reactor.core.publisher.Flux; +import ru.tinkoff.kora.common.Component; +import ru.tinkoff.kora.http.common.HttpMethod; +import ru.tinkoff.kora.http.common.annotation.HttpRoute; +import ru.tinkoff.kora.http.common.body.HttpBodyOutput; +import ru.tinkoff.kora.http.server.common.HttpServerResponse; +import ru.tinkoff.kora.http.server.common.annotation.HttpController; +import ru.tinkoff.kora.json.common.JsonWriter; +import ru.tinkoff.kora.json.common.annotation.Json; + +/** + * @see Json - Indicates that response should be serialized as JSON + * @see HttpMethod#GET - Indicates that GET request is expected + */ +@Component +@HttpController +public final class JsonStreamingGetController { + + private static final Logger logger = LoggerFactory.getLogger(JsonStreamingGetController.class); + + private static final int ELEMENTS = 5; + + @Json + public record HelloWorldResponse(String greeting) {} + + private final JsonWriter jsonWriter; + + public JsonStreamingGetController(JsonWriter jsonWriter) { + this.jsonWriter = jsonWriter; + } + + @HttpRoute(method = HttpMethod.GET, path = "/json/streaming/flow") + public HttpServerResponse getFlowPublisher() { + Flow.Publisher publisher = subscriber -> { + Flow.Subscription subscribtion = new Flow.Subscription() { + + final AtomicInteger counter = new AtomicInteger(); + final AtomicBoolean closed = new AtomicBoolean(false); + + @Override + public void request(long n) { + if (closed.get()) { + return; + } else if (n <= 0) { + subscriber.onError(new IllegalArgumentException("Rule violated: non-positive requests")); + return; + } + + logger.info("Requested {}: {}", counter.get(), n); + + String res = jsonWriter.toStringUnchecked(new HelloWorldResponse("Hello World " + counter.incrementAndGet())); + ByteBuffer buffer = ByteBuffer.wrap((res + "\n").getBytes(StandardCharsets.UTF_8)); + + try { + logger.info("Providing {}: {}", counter.get(), n); + subscriber.onNext(buffer); + logger.info("Provided {}: {}", counter.get(), n); + + if (counter.get() >= ELEMENTS) { + closed.set(true); + subscriber.onComplete(); + } else { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } catch (Exception e) { + subscriber.onError(e); + } + } + + @Override + public void cancel() { + closed.set(true); + logger.info("Canceled"); + } + }; + + subscriber.onSubscribe(subscribtion); + }; + + return HttpServerResponse.of(200, HttpBodyOutput.of("application/stream+json", publisher)); + } + + @HttpRoute(method = HttpMethod.GET, path = "/json/streaming/flux") + public HttpServerResponse getFlux() { + var publisher = JdkFlowAdapter.publisherToFlowPublisher(Flux.interval(Duration.ofSeconds(1)) + .take(ELEMENTS) + .map(n -> new HelloWorldResponse("Hello World " + n)) + .map(r -> ByteBuffer.wrap((jsonWriter.toStringUnchecked(r) + "\n").getBytes(StandardCharsets.UTF_8)))); + + return HttpServerResponse.of(200, HttpBodyOutput.of("application/stream+json", publisher)); + } + + @HttpRoute(method = HttpMethod.GET, path = "/json/streaming/os") + public HttpServerResponse getOS() { + HttpBodyOutput osBody = HttpBodyOutput.ofBlockingStream( + "application/stream+json", + os -> { + for (int i = 0; i < ELEMENTS; i++) { + String res = jsonWriter.toStringUnchecked(new HelloWorldResponse("Hello World " + i)); + var buffer = (res + "\n").getBytes(StandardCharsets.UTF_8); + os.write(buffer); + os.flush(); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }); + + return HttpServerResponse.of(200, osBody); + } +} diff --git a/kora-java-kafka/build.gradle b/kora-java-kafka/build.gradle index 492819fa..20672f9e 100644 --- a/kora-java-kafka/build.gradle +++ b/kora-java-kafka/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -31,9 +24,14 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-kafka:0.12.2" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.kafka.Application" + mainClass = "ru.tinkoff.kora.example.kafka.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-openapi-generator-http-client/build.gradle b/kora-java-openapi-generator-http-client/build.gradle index f8fbe690..bb6f020f 100644 --- a/kora-java-openapi-generator-http-client/build.gradle +++ b/kora-java-openapi-generator-http-client/build.gradle @@ -14,17 +14,10 @@ plugins { id "org.openapi.generator" version "7.14.0" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -45,9 +38,14 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-mockserver:0.12.2" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.openapi.http.client.Application" + mainClass = "ru.tinkoff.kora.example.openapi.http.client.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-openapi-generator-http-server/build.gradle b/kora-java-openapi-generator-http-server/build.gradle index e0ccb6b8..faeef52f 100644 --- a/kora-java-openapi-generator-http-server/build.gradle +++ b/kora-java-openapi-generator-http-server/build.gradle @@ -14,17 +14,10 @@ plugins { id "org.openapi.generator" version "7.14.0" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -45,9 +38,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.openapi.http.server.Application" + mainClass = "ru.tinkoff.kora.example.openapi.http.server.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-resilient/build.gradle b/kora-java-resilient/build.gradle index eca0acfb..1a37e544 100644 --- a/kora-java-resilient/build.gradle +++ b/kora-java-resilient/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -29,9 +22,14 @@ dependencies { testImplementation "ru.tinkoff.kora:test-junit5" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.resilient.Application" + mainClass = "ru.tinkoff.kora.example.resilient.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-s3-client-aws/build.gradle b/kora-java-s3-client-aws/build.gradle index deb781ad..61b215db 100644 --- a/kora-java-s3-client-aws/build.gradle +++ b/kora-java-s3-client-aws/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,9 +27,14 @@ dependencies { testImplementation "ru.tinkoff.kora:test-junit5" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.s3.aws.Application" + mainClass = "ru.tinkoff.kora.example.s3.aws.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-s3-client-minio/build.gradle b/kora-java-s3-client-minio/build.gradle index 00692537..88dc185e 100644 --- a/kora-java-s3-client-minio/build.gradle +++ b/kora-java-s3-client-minio/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -34,9 +27,14 @@ dependencies { testImplementation "ru.tinkoff.kora:test-junit5" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.s3.minio.Application" + mainClass = "ru.tinkoff.kora.example.s3.minio.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-scheduling-jdk/build.gradle b/kora-java-scheduling-jdk/build.gradle index 2f1440ba..0884269e 100644 --- a/kora-java-scheduling-jdk/build.gradle +++ b/kora-java-scheduling-jdk/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -30,9 +23,14 @@ dependencies { testImplementation "org.awaitility:awaitility:4.2.0" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.scheduling.jdk.Application" + mainClass = "ru.tinkoff.kora.example.scheduling.jdk.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-scheduling-quartz/build.gradle b/kora-java-scheduling-quartz/build.gradle index b377f154..07c2c63f 100644 --- a/kora-java-scheduling-quartz/build.gradle +++ b/kora-java-scheduling-quartz/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -30,9 +23,14 @@ dependencies { testImplementation "org.awaitility:awaitility:4.2.0" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.scheduling.quartz.Application" + mainClass = "ru.tinkoff.kora.example.scheduling.quartz.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-soap-client/build.gradle b/kora-java-soap-client/build.gradle index d30837b3..a2753a13 100644 --- a/kora-java-soap-client/build.gradle +++ b/kora-java-soap-client/build.gradle @@ -6,17 +6,10 @@ plugins { id "com.github.bjornvester.wsdl2java" version "2.0.2" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -41,9 +34,14 @@ dependencies { testImplementation "io.goodforgod:testcontainers-extensions-mockserver:0.12.2" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.soap.client.Application" + mainClass = "ru.tinkoff.kora.example.soap.client.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-telemetry/build.gradle b/kora-java-telemetry/build.gradle index e6764163..5bfa791a 100644 --- a/kora-java-telemetry/build.gradle +++ b/kora-java-telemetry/build.gradle @@ -4,17 +4,10 @@ plugins { id "application" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,9 +25,14 @@ dependencies { testImplementation "org.testcontainers:junit-jupiter:1.19.8" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + application { applicationName = "application" - mainClassName = "ru.tinkoff.kora.example.telemetry.Application" + mainClass = "ru.tinkoff.kora.example.telemetry.Application" applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] } diff --git a/kora-java-validation/build.gradle b/kora-java-validation/build.gradle index 7c9980f4..8f3994ce 100644 --- a/kora-java-validation/build.gradle +++ b/kora-java-validation/build.gradle @@ -4,20 +4,10 @@ plugins { id "application" } -applicationName = "application" -mainClassName = "ru.tinkoff.kora.example.validation.Application" - -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - configurations { koraBom - annotationProcessor.extendsFrom(koraBom) - compileOnly.extendsFrom(koraBom) - implementation.extendsFrom(koraBom) - api.extendsFrom(koraBom) - testImplementation.extendsFrom(koraBom) - testAnnotationProcessor.extendsFrom(koraBom) + annotationProcessor.extendsFrom(koraBom); compileOnly.extendsFrom(koraBom); implementation.extendsFrom(koraBom) + api.extendsFrom(koraBom); testImplementation.extendsFrom(koraBom); testAnnotationProcessor.extendsFrom(koraBom) } dependencies { @@ -32,6 +22,17 @@ dependencies { testImplementation "ru.tinkoff.kora:test-junit5" } +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +application { + applicationName = "application" + mainClass = "ru.tinkoff.kora.example.validation.Application" + applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"] +} + distTar { archiveFileName = "application.tar" } diff --git a/kora-kotlin-crud/build.gradle.kts b/kora-kotlin-crud/build.gradle.kts index 8fe77e0a..a15ca416 100644 --- a/kora-kotlin-crud/build.gradle.kts +++ b/kora-kotlin-crud/build.gradle.kts @@ -18,19 +18,10 @@ plugins { id("org.flywaydb.flyway") version ("8.4.2") } -kotlin { - jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } - sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } - sourceSets.test { kotlin.srcDir("build/generated/ksp/test/kotlin") } -// sourceSets.main { kotlin.srcDir("build/generated/source/kapt/main") } // KAPT & KSP broken since 1.9.11 -} - val koraBom: Configuration by configurations.creating configurations { - ksp.get().extendsFrom(koraBom) - compileOnly.get().extendsFrom(koraBom) - api.get().extendsFrom(koraBom) - implementation.get().extendsFrom(koraBom) + ksp.get().extendsFrom(koraBom); compileOnly.get().extendsFrom(koraBom) + api.get().extendsFrom(koraBom); implementation.get().extendsFrom(koraBom) } dependencies { @@ -65,6 +56,13 @@ dependencies { testImplementation("org.testcontainers:junit-jupiter:1.19.8") } +kotlin { + jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } + sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } + sourceSets.test { kotlin.srcDir("build/generated/ksp/test/kotlin") } +// sourceSets.main { kotlin.srcDir("build/generated/source/kapt/main") } // KAPT & KSP broken since 1.9.11 +} + application { applicationName = "application" mainClass.set("ru.tinkoff.kora.kotlin.example.crud.ApplicationKt") diff --git a/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt b/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt index 97f72ae1..7c213aad 100644 --- a/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt +++ b/kora-kotlin-crud/src/test/kotlin/ru/tinkoff/kora/kotlin/example/crud/BlackBoxTests.kt @@ -45,7 +45,8 @@ class BlackBoxTests(@ConnectionPostgreSQL val connection: JdbcConnection) { "POSTGRES_PASS" to params.password(), "CACHE_MAX_SIZE" to "0", "RETRY_ATTEMPTS" to "0", - "LOGGING_LEVEL_ALL" to "INFO", + "LOGGING_LEVEL_KORA" to "DEBUG", + "LOGGING_LEVEL_APP" to "DEBUG" ) ) container.start() diff --git a/kora-kotlin-helloworld/build.gradle.kts b/kora-kotlin-helloworld/build.gradle.kts index 26286748..8c077a41 100644 --- a/kora-kotlin-helloworld/build.gradle.kts +++ b/kora-kotlin-helloworld/build.gradle.kts @@ -7,18 +7,10 @@ plugins { id("com.google.devtools.ksp") version ("1.9.25-1.0.20") } -kotlin { - jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } - sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } - sourceSets.test { kotlin.srcDir("build/generated/ksp/test/kotlin") } -} - val koraBom: Configuration by configurations.creating configurations { - ksp.get().extendsFrom(koraBom) - compileOnly.get().extendsFrom(koraBom) - api.get().extendsFrom(koraBom) - implementation.get().extendsFrom(koraBom) + ksp.get().extendsFrom(koraBom); compileOnly.get().extendsFrom(koraBom) + api.get().extendsFrom(koraBom); implementation.get().extendsFrom(koraBom) } val koraVersion: String by project @@ -37,6 +29,13 @@ dependencies { testImplementation("org.testcontainers:junit-jupiter:1.19.8") } +kotlin { + jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } + sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } + sourceSets.test { kotlin.srcDir("build/generated/ksp/test/kotlin") } +// sourceSets.main { kotlin.srcDir("build/generated/source/kapt/main") } // KAPT & KSP broken since 1.9.11 +} + application { applicationName = "application" mainClass.set("ru.tinkoff.kora.kotlin.example.helloworld.ApplicationKt") From 4da1c96de52d212db73b0f3b993132e46d961511 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 18:14:36 +0300 Subject: [PATCH 10/12] Cleanup --- kora-kotlin-helloworld/build.gradle.kts | 1 - 1 file changed, 1 deletion(-) diff --git a/kora-kotlin-helloworld/build.gradle.kts b/kora-kotlin-helloworld/build.gradle.kts index 8c077a41..c8b960ed 100644 --- a/kora-kotlin-helloworld/build.gradle.kts +++ b/kora-kotlin-helloworld/build.gradle.kts @@ -33,7 +33,6 @@ kotlin { jvmToolchain { languageVersion.set(JavaLanguageVersion.of(17)) } sourceSets.main { kotlin.srcDir("build/generated/ksp/main/kotlin") } sourceSets.test { kotlin.srcDir("build/generated/ksp/test/kotlin") } -// sourceSets.main { kotlin.srcDir("build/generated/source/kapt/main") } // KAPT & KSP broken since 1.9.11 } application { From 6ae870c582aea8a056d883611f3401142a2760c5 Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 18:28:09 +0300 Subject: [PATCH 11/12] Cleanup --- .../server/BlockStreamingHttpBodyOutput.java | 59 -------- .../server/JsonStreamingGetController.java | 129 ------------------ 2 files changed, 188 deletions(-) delete mode 100644 kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java delete mode 100644 kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java diff --git a/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java b/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java deleted file mode 100644 index a40c7979..00000000 --- a/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/BlockStreamingHttpBodyOutput.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.tinkoff.kora.example.http.server; - -import jakarta.annotation.Nullable; -import java.io.Closeable; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.util.concurrent.Flow; -import ru.tinkoff.kora.http.common.body.HttpBodyOutput; - -class BlockStreamingHttpBodyOutput implements HttpBodyOutput { - - @FunctionalInterface - public interface OutputConsumer { - - void accept(T t) throws IOException; - } - - private final String contentType; - private final OutputConsumer outputStreamConsumer; - private final Closeable closeable; - - BlockStreamingHttpBodyOutput(String contentType, - OutputConsumer outputStreamConsumer) { - this(contentType, outputStreamConsumer, () -> {}); - } - - BlockStreamingHttpBodyOutput(String contentType, - OutputConsumer outputStreamConsumer, - Closeable closeable) { - this.contentType = contentType; - this.outputStreamConsumer = outputStreamConsumer; - this.closeable = closeable; - } - - @Override - public long contentLength() { - return -1; - } - - @Nullable - @Override - public String contentType() { - return contentType; - } - - @Override - public void subscribe(Flow.Subscriber subscriber) {} - - @Override - public void write(OutputStream os) throws IOException { - outputStreamConsumer.accept(os); - } - - @Override - public void close() throws IOException { - closeable.close(); - } -} diff --git a/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java b/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java deleted file mode 100644 index 6aed2ca6..00000000 --- a/kora-java-http-server/src/main/java/ru/tinkoff/kora/example/http/server/JsonStreamingGetController.java +++ /dev/null @@ -1,129 +0,0 @@ -package ru.tinkoff.kora.example.http.server; - -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.concurrent.Flow; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import reactor.adapter.JdkFlowAdapter; -import reactor.core.publisher.Flux; -import ru.tinkoff.kora.common.Component; -import ru.tinkoff.kora.http.common.HttpMethod; -import ru.tinkoff.kora.http.common.annotation.HttpRoute; -import ru.tinkoff.kora.http.common.body.HttpBodyOutput; -import ru.tinkoff.kora.http.server.common.HttpServerResponse; -import ru.tinkoff.kora.http.server.common.annotation.HttpController; -import ru.tinkoff.kora.json.common.JsonWriter; -import ru.tinkoff.kora.json.common.annotation.Json; - -/** - * @see Json - Indicates that response should be serialized as JSON - * @see HttpMethod#GET - Indicates that GET request is expected - */ -@Component -@HttpController -public final class JsonStreamingGetController { - - private static final Logger logger = LoggerFactory.getLogger(JsonStreamingGetController.class); - - private static final int ELEMENTS = 5; - - @Json - public record HelloWorldResponse(String greeting) {} - - private final JsonWriter jsonWriter; - - public JsonStreamingGetController(JsonWriter jsonWriter) { - this.jsonWriter = jsonWriter; - } - - @HttpRoute(method = HttpMethod.GET, path = "/json/streaming/flow") - public HttpServerResponse getFlowPublisher() { - Flow.Publisher publisher = subscriber -> { - Flow.Subscription subscribtion = new Flow.Subscription() { - - final AtomicInteger counter = new AtomicInteger(); - final AtomicBoolean closed = new AtomicBoolean(false); - - @Override - public void request(long n) { - if (closed.get()) { - return; - } else if (n <= 0) { - subscriber.onError(new IllegalArgumentException("Rule violated: non-positive requests")); - return; - } - - logger.info("Requested {}: {}", counter.get(), n); - - String res = jsonWriter.toStringUnchecked(new HelloWorldResponse("Hello World " + counter.incrementAndGet())); - ByteBuffer buffer = ByteBuffer.wrap((res + "\n").getBytes(StandardCharsets.UTF_8)); - - try { - logger.info("Providing {}: {}", counter.get(), n); - subscriber.onNext(buffer); - logger.info("Provided {}: {}", counter.get(), n); - - if (counter.get() >= ELEMENTS) { - closed.set(true); - subscriber.onComplete(); - } else { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - } catch (Exception e) { - subscriber.onError(e); - } - } - - @Override - public void cancel() { - closed.set(true); - logger.info("Canceled"); - } - }; - - subscriber.onSubscribe(subscribtion); - }; - - return HttpServerResponse.of(200, HttpBodyOutput.of("application/stream+json", publisher)); - } - - @HttpRoute(method = HttpMethod.GET, path = "/json/streaming/flux") - public HttpServerResponse getFlux() { - var publisher = JdkFlowAdapter.publisherToFlowPublisher(Flux.interval(Duration.ofSeconds(1)) - .take(ELEMENTS) - .map(n -> new HelloWorldResponse("Hello World " + n)) - .map(r -> ByteBuffer.wrap((jsonWriter.toStringUnchecked(r) + "\n").getBytes(StandardCharsets.UTF_8)))); - - return HttpServerResponse.of(200, HttpBodyOutput.of("application/stream+json", publisher)); - } - - @HttpRoute(method = HttpMethod.GET, path = "/json/streaming/os") - public HttpServerResponse getOS() { - HttpBodyOutput osBody = HttpBodyOutput.ofBlockingStream( - "application/stream+json", - os -> { - for (int i = 0; i < ELEMENTS; i++) { - String res = jsonWriter.toStringUnchecked(new HelloWorldResponse("Hello World " + i)); - var buffer = (res + "\n").getBytes(StandardCharsets.UTF_8); - os.write(buffer); - os.flush(); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - }); - - return HttpServerResponse.of(200, osBody); - } -} From 39004ed00224062bd9ceb02293f1a89652119f8d Mon Sep 17 00:00:00 2001 From: Anton Kurako Date: Tue, 30 Sep 2025 18:47:30 +0300 Subject: [PATCH 12/12] Downgraded Gradle to 8.14.3 due to GraalVM Plugin --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 45457 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 5 ++++- gradlew.bat | 3 ++- kora-java-graalvm-crud-cassandra/build.gradle | 2 +- kora-java-graalvm-crud-jdbc/build.gradle | 2 +- kora-java-graalvm-crud-r2dbc/build.gradle | 2 +- kora-java-graalvm-crud-vertx/build.gradle | 2 +- kora-java-graalvm-kafka/build.gradle | 2 +- 10 files changed, 13 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 29d00c9e..c89f38f3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id "com.diffplug.spotless" version "6.19.0" - id "org.graalvm.buildtools.native" version "0.11.0" // or dependsOn fails in graalvm examples id "com.asarkar.gradle.build-time-tracker" version "4.3.0" + id "org.graalvm.buildtools.native" version "0.11.1" apply false // or dependsOn fails in graalvm examples id "org.jetbrains.kotlin.jvm" version "1.9.25" apply false id "org.jetbrains.kotlin.kapt" version "1.9.25" apply false } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 8bdaf60c75ab801e22807dde59e12a8735a34077..1b33c55baabb587c669f562ae36f953de2481846 100644 GIT binary patch delta 35551 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 delta 37256 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e111328..d4081da4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index adff685a..23d15a93 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,6 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -171,6 +172,7 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -210,6 +212,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index c4bdd3ab..db3a6ac2 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,10 +70,11 @@ goto fail :execute @rem Setup the command line +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/kora-java-graalvm-crud-cassandra/build.gradle b/kora-java-graalvm-crud-cassandra/build.gradle index ef6d3e4b..8742889a 100644 --- a/kora-java-graalvm-crud-cassandra/build.gradle +++ b/kora-java-graalvm-crud-cassandra/build.gradle @@ -13,7 +13,7 @@ plugins { id "org.openapi.generator" version "7.14.0" id "com.gradleup.shadow" version "9.2.2" - id "org.graalvm.buildtools.native" version "0.11.0" + id "org.graalvm.buildtools.native" version "0.11.1" } configurations { diff --git a/kora-java-graalvm-crud-jdbc/build.gradle b/kora-java-graalvm-crud-jdbc/build.gradle index 4d7f4d0f..14573564 100644 --- a/kora-java-graalvm-crud-jdbc/build.gradle +++ b/kora-java-graalvm-crud-jdbc/build.gradle @@ -14,7 +14,7 @@ plugins { id "org.openapi.generator" version "7.14.0" id "org.flywaydb.flyway" version "8.4.2" id "com.gradleup.shadow" version "9.2.2" - id "org.graalvm.buildtools.native" version "0.11.0" + id "org.graalvm.buildtools.native" version "0.11.1" } configurations { diff --git a/kora-java-graalvm-crud-r2dbc/build.gradle b/kora-java-graalvm-crud-r2dbc/build.gradle index 99651cda..2be91f5d 100644 --- a/kora-java-graalvm-crud-r2dbc/build.gradle +++ b/kora-java-graalvm-crud-r2dbc/build.gradle @@ -14,7 +14,7 @@ plugins { id "org.openapi.generator" version "7.14.0" id "org.flywaydb.flyway" version "8.4.2" id "com.gradleup.shadow" version "9.2.2" - id "org.graalvm.buildtools.native" version "0.11.0" + id "org.graalvm.buildtools.native" version "0.11.1" } configurations { diff --git a/kora-java-graalvm-crud-vertx/build.gradle b/kora-java-graalvm-crud-vertx/build.gradle index b40b64aa..ac952ac8 100644 --- a/kora-java-graalvm-crud-vertx/build.gradle +++ b/kora-java-graalvm-crud-vertx/build.gradle @@ -14,7 +14,7 @@ plugins { id "org.openapi.generator" version "7.14.0" id "org.flywaydb.flyway" version "8.4.2" id "com.gradleup.shadow" version "9.2.2" - id "org.graalvm.buildtools.native" version "0.11.0" + id "org.graalvm.buildtools.native" version "0.11.1" } configurations { diff --git a/kora-java-graalvm-kafka/build.gradle b/kora-java-graalvm-kafka/build.gradle index 2519353f..a1fcfb13 100644 --- a/kora-java-graalvm-kafka/build.gradle +++ b/kora-java-graalvm-kafka/build.gradle @@ -4,7 +4,7 @@ plugins { id "application" id "com.gradleup.shadow" version "9.2.2" - id "org.graalvm.buildtools.native" version "0.11.0" + id "org.graalvm.buildtools.native" version "0.11.1" } configurations {