From 4199846ae54e7236124f80be4d31dabdf8a63cfb Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 19:42:29 +0100 Subject: [PATCH 01/16] Fix duplicate generated sources in the test source set (#19) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `protoc` writes generated code to `build/generated/sources/proto/` and the Compiler writes its processed output to `generated/`. Both must not reach `javac`/`kotlinc` at once, or compilation fails with `duplicate class` errors. The plugin deduplicates by rewriting source-set directories once during configuration (`configureSourceSetDirs`), but that eager rewrite is fragile and does not always hold for the `test` source set — depending on the plugin-application order, a symlinked project path, or another plugin re-adding the directory, the `protoc` output may end up back in the set. Re-introduce order-independent compile-task filtering (the historic `configureCompileTasks` mechanism): `excludeProtocOutputFromCompilation()` keeps the `protoc` output directory out of every `JavaCompile`/`KotlinCompile` source via a live filter, so the deduplication holds regardless of when the directory was added. `JavaCompile` re-sets its `source` to a filtered view (it ignores `exclude(Spec)` for the files it passes to `javac`); `KotlinCompile` honors `exclude(Spec)`. The deprecated in-place mode is left untouched. Harden `Paths.residesIn` to canonicalize both operands so a symlinked project path no longer defeats the check. Add the `test-source-set` functional-test fixture and a regression test that reproduces the leaked state and asserts the `test` source set still compiles. Co-Authored-By: Claude Opus 4.8 --- .../tasks/fix-test-source-set-duplicates.md | 54 +++++++++++ docs/dependencies/dependencies.md | 44 ++++----- docs/dependencies/pom.xml | 2 +- .../compiler/gradle/plugin/PluginSpec.kt | 28 ++++++ .../test-source-set/build.gradle.kts | 94 +++++++++++++++++++ .../test-source-set/settings.gradle.kts | 31 ++++++ .../src/main/proto/main_scope.proto | 11 +++ .../src/test/proto/test_scope.proto | 14 +++ .../tools/compiler/gradle/plugin/Paths.kt | 11 ++- .../tools/compiler/gradle/plugin/Plugin.kt | 64 +++++++++++++ version.gradle.kts | 2 +- 11 files changed, 330 insertions(+), 25 deletions(-) create mode 100644 .agents/tasks/fix-test-source-set-duplicates.md create mode 100644 gradle-plugin/src/functionalTest/resources/test-source-set/build.gradle.kts create mode 100644 gradle-plugin/src/functionalTest/resources/test-source-set/settings.gradle.kts create mode 100644 gradle-plugin/src/functionalTest/resources/test-source-set/src/main/proto/main_scope.proto create mode 100644 gradle-plugin/src/functionalTest/resources/test-source-set/src/test/proto/test_scope.proto diff --git a/.agents/tasks/fix-test-source-set-duplicates.md b/.agents/tasks/fix-test-source-set-duplicates.md new file mode 100644 index 0000000000..d65b11964a --- /dev/null +++ b/.agents/tasks/fix-test-source-set-duplicates.md @@ -0,0 +1,54 @@ +--- +slug: fix-test-source-set-duplicates +branch: claude/vibrant-jang-fa76b9 +owner: claude +status: in-review +started: 2026-06-30 +--- + +## Goal + +Fix [issue #19](https://github.com/SpineEventEngine/compiler/issues/19): +generated source sets in tests may contain duplicates. The Compiler reads the +`protoc` output and writes processed code into a separate directory; both must +not reach the Java/Kotlin compiler at once, or compilation fails with +`duplicate class` errors. This "sometimes does not work for the test source +set." + +## Context + +- `protoc` writes to `build/generated/sources/proto//{java,kotlin}`; + the Compiler writes to `generated//{java,kotlin}`. +- Deduplication lived in `configureCompileTasks` (live compile-task filtering) in + ProtoData until a 2023 commit ("Improve filtering of duplicated generated + sources") replaced it with an eager, one-time source-set rewrite, now in + tool-base's `GeneratedSourcePlugin.configureSourceSetDirs`. +- The eager rewrite is fragile: plugin-application order, a symlinked project + path (the old `residesIn` compared a canonical path to a merely absolute one), + or a consumer plugin re-adding the directory can leave the `protoc` output in + the source set. + +## Plan + +- [x] Reproduce: `test-source-set` fixture with protos in `main` + `test`; an + `afterEvaluate` re-adds the `protoc` output dir to the `test` source set, + reproducing the leaked state. Confirmed `compileTestJava` fails with + `duplicate class`. +- [x] Fix (compiler-side, order-independent): re-introduce live compile-task + filtering in `Plugin.excludeProtocOutputFromCompilation()` — re-set + `JavaCompile.source` to a filtered view and add an `exclude` spec to + `KotlinCompile`. Skips the deprecated in-place mode. +- [x] Harden `Paths.residesIn` to canonicalize both operands (symlink-safe). +- [x] Regression test `keep duplicate generated classes out of the 'test' + compilation` asserts `testClasses` succeeds. +- [x] Version bump `2.0.0-SNAPSHOT.057` → `.058`. +- [x] Full `PluginSpec` green: 16 tests, 0 failures (1 pre-existing skip). + `:gradle-plugin:detekt` (the `check` gate) passes. + +## Log +- 2026-06-30 — reproduced RED (duplicate class in `compileTestJava`), implemented + the fix, verified GREEN with a marker proving the fixed plugin code executed in + the inner testkit build. +- Note: local incremental/build-cache is stale in this checkout; verifying + functional tests needs `--rerun-tasks --no-build-cache` and `arch -arm64` + (gradle-doctor Rosetta check). See auto-memory `gradle-arch-arm64`. diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md index 3c7981933f..370eec917f 100644 --- a/docs/dependencies/dependencies.md +++ b/docs/dependencies/dependencies.md @@ -1,6 +1,6 @@ -# Dependencies of `io.spine.tools:compiler-api:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-api:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -1067,14 +1067,14 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-api-tests:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-api-tests:2.0.0-SNAPSHOT.058` ## Runtime ## Compile, tests, and tooling @@ -1444,14 +1444,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:23 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:14 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-backend:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-backend:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -2522,14 +2522,14 @@ This report was generated on **Sat Jun 27 23:12:23 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-cli:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-cli:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -3759,14 +3759,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-gradle-api:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-gradle-api:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -4783,14 +4783,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-gradle-plugin:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-gradle-plugin:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -5851,14 +5851,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-jvm:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-jvm:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -6946,14 +6946,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-params:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-params:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -8012,14 +8012,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-protoc-plugin:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-protoc-plugin:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2. @@ -8852,14 +8852,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-test-env:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-test-env:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -9926,14 +9926,14 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-testlib:2.0.0-SNAPSHOT.057` +# Dependencies of `io.spine.tools:compiler-testlib:2.0.0-SNAPSHOT.058` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -11107,6 +11107,6 @@ This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Sat Jun 27 23:12:24 WEST 2026** using +This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml index 7f838991c9..c373d89d90 100644 --- a/docs/dependencies/pom.xml +++ b/docs/dependencies/pom.xml @@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject. --> io.spine.tools compiler -2.0.0-SNAPSHOT.057 +2.0.0-SNAPSHOT.058 2015 diff --git a/gradle-plugin/src/functionalTest/kotlin/io/spine/tools/compiler/gradle/plugin/PluginSpec.kt b/gradle-plugin/src/functionalTest/kotlin/io/spine/tools/compiler/gradle/plugin/PluginSpec.kt index 9caee83331..0d31200598 100644 --- a/gradle-plugin/src/functionalTest/kotlin/io/spine/tools/compiler/gradle/plugin/PluginSpec.kt +++ b/gradle-plugin/src/functionalTest/kotlin/io/spine/tools/compiler/gradle/plugin/PluginSpec.kt @@ -119,6 +119,34 @@ class PluginSpec { createProject("java-kotlin-test") } + /** + * Verifies that the `test` source set compiles even when the `protoc` output + * directory ends up among its source directories. + * + * The Compiler reads the `protoc` output and writes the processed code into + * a separate directory, which is added to the source set. The plugin keeps the + * `protoc` output directory out of the compilation so that each generated class + * is compiled once. That filtering must hold for the `test` source set too — + * see [issue #19](https://github.com/SpineEventEngine/compiler/issues/19). + * + * The `test-source-set` project re-adds the `protoc` output directory to the + * `test` source set after the plugin has configured it, reproducing the state + * in which the directory leaked back in. Without the compilation-level filter + * the `test` sources contain each generated class twice, and the compilation + * fails with duplicate class errors. + */ + @Test + fun `keep duplicate generated classes out of the 'test' compilation`() { + createProject("test-source-set") + val testClasses = TaskName.of("testClasses") + + val result = project.executeTask(testClasses) + + result[CompilerTaskName(SourceSetName.test)] shouldBe SUCCESS + result[TaskName.of("compileTestJava")] shouldBe SUCCESS + result[TaskName.of("compileTestKotlin")] shouldBe SUCCESS + } + private fun launchAndExpectResult(expected: TaskOutcome) { val result = launch() diff --git a/gradle-plugin/src/functionalTest/resources/test-source-set/build.gradle.kts b/gradle-plugin/src/functionalTest/resources/test-source-set/build.gradle.kts new file mode 100644 index 0000000000..268c92ce6d --- /dev/null +++ b/gradle-plugin/src/functionalTest/resources/test-source-set/build.gradle.kts @@ -0,0 +1,94 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import com.google.protobuf.gradle.ProtobufExtension +import io.spine.dependency.lib.Protobuf +import io.spine.gradle.repo.standardToSpineSdk +import org.gradle.api.tasks.SourceSetContainer + +buildscript { + standardSpineSdkRepositories() +} + +group = "io.spine.tools.test" +version = "1.0.0-SNAPSHOT" + +plugins { + java + kotlin("jvm") + id("com.google.protobuf") + id("@COMPILER_PLUGIN_ID@") version "@COMPILER_VERSION@" +} + +repositories { + mavenLocal() // Must come first for `compiler-test-env`. + standardToSpineSdk() +} + +spine { + compiler { + plugins( + "io.spine.tools.compiler.test.NoOpRendererPlugin", + "io.spine.tools.compiler.test.TestPlugin" + ) + } +} +configurations.all { + resolutionStrategy { + force( + io.spine.dependency.local.Base.lib, + ) + } +} + +dependencies { + spineCompiler("io.spine.tools:compiler-test-env:+") + Protobuf.libs.forEach { implementation(it) } +} + +// Simulate the `protoc` output directory leaking back into the `test` source set. +// +// The Compiler reads the `protoc` output from `build/generated/sources/proto/test` +// and writes its own output under `generated/test`. The plugin removes the +// `protoc` directories from the source sets to avoid compiling the same class +// twice. That removal is a one-time rewrite of the source-set directories and is +// fragile: depending on the plugin-configuration order, a symlinked project path, +// or a consumer plugin re-adding the directory, the `protoc` output may end up in +// the `test` source set anyway. We reproduce that final state directly by +// re-adding the directory after the plugin has configured the source set. +// +// Without compile-task-level filtering, `compileTestJava` and `compileTestKotlin` +// then see each generated class twice and fail with "duplicate class" errors. +afterEvaluate { + val sourceSets = project.extensions.getByType(SourceSetContainer::class.java) + val test = sourceSets.getByName("test") + // The `protoc` output base directory of the Protobuf Gradle Plugin + // (`build/generated/sources/proto` by default). + val protocBaseDir = project.extensions.getByType(ProtobufExtension::class.java) + .generatedFilesBaseDir + test.java.srcDir("$protocBaseDir/test/java") + test.java.srcDir("$protocBaseDir/test/kotlin") +} diff --git a/gradle-plugin/src/functionalTest/resources/test-source-set/settings.gradle.kts b/gradle-plugin/src/functionalTest/resources/test-source-set/settings.gradle.kts new file mode 100644 index 0000000000..f5ecc1b72b --- /dev/null +++ b/gradle-plugin/src/functionalTest/resources/test-source-set/settings.gradle.kts @@ -0,0 +1,31 @@ +/* + * Copyright 2022, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +pluginManagement { + repositories { + mavenLocal() + } +} diff --git a/gradle-plugin/src/functionalTest/resources/test-source-set/src/main/proto/main_scope.proto b/gradle-plugin/src/functionalTest/resources/test-source-set/src/main/proto/main_scope.proto new file mode 100644 index 0000000000..9ed9c60dd6 --- /dev/null +++ b/gradle-plugin/src/functionalTest/resources/test-source-set/src/main/proto/main_scope.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +package spine.compiler.test; + +option java_package = "io.spine.tools.compiler.test"; +option java_outer_classname = "MainScopeProto"; +option java_multiple_files = true; + +// A `main`-scope definition so that the `main` source set has generated code too. +message MainScoped { +} diff --git a/gradle-plugin/src/functionalTest/resources/test-source-set/src/test/proto/test_scope.proto b/gradle-plugin/src/functionalTest/resources/test-source-set/src/test/proto/test_scope.proto new file mode 100644 index 0000000000..38ba072050 --- /dev/null +++ b/gradle-plugin/src/functionalTest/resources/test-source-set/src/test/proto/test_scope.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package spine.compiler.test; + +option java_package = "io.spine.tools.compiler.test"; +option java_outer_classname = "TestScopeProto"; +option java_multiple_files = true; + +// A `test`-scope definition. The Compiler generates code for it under +// `generated/test`, while `protoc` puts its output under +// `build/generated/sources/proto/test`. Both must not end up in the `test` +// source set at the same time, or the compilation fails with duplicate classes. +message TestScoped { +} diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt index 431e3a7d92..2203e485e7 100644 --- a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt +++ b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt @@ -55,6 +55,15 @@ internal fun Iterable.excluding(excludeDir: File): Set = /** * Tells if this file resides in the given [directory]. + * + * Both paths are resolved to their canonical form before the comparison, so the + * check is not defeated by symbolic links. Comparing a canonical path against + * a merely absolute one (which keeps symlinks unresolved) could otherwise yield + * a false negative when the project resides under a symlinked path — leaving the + * `protoc` output directory unfiltered and the generated classes duplicated. + * + * The comparison is performed on [Path] name components, so a sibling directory + * such as `…/test2` is not mistaken for residing in `…/test`. */ internal fun File.residesIn(directory: File): Boolean = - canonicalFile.startsWith(directory.absolutePath) + canonicalFile.toPath().startsWith(directory.canonicalFile.toPath()) diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt index 86882879ac..21c1893c96 100644 --- a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt +++ b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt @@ -67,11 +67,16 @@ import io.spine.tools.protobuf.gradle.protobufExtension import java.io.File import java.nio.file.Path import org.gradle.api.Project +import org.gradle.api.file.FileTreeElement +import org.gradle.api.specs.Spec import org.gradle.api.tasks.Delete import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.TaskProvider +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.api.tasks.util.PatternFilterable import org.gradle.kotlin.dsl.exclude import org.gradle.kotlin.dsl.register +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask /** * The Gradle plugin of the Spine Compiler. @@ -299,6 +304,65 @@ private fun Project.configureWithProtobufPlugin(compilerVersion: String) { } setProtocPluginArtifact(protocPlugin) configureGenerateProtoTasks() + excludeProtocOutputFromCompilation() + } +} + +/** + * Excludes the `protoc` output directory from the input of the Java and Kotlin + * compilation tasks of this project. + * + * The Compiler takes the code generated by `protoc` as its input and writes the + * processed code into a separate directory (`generated` by default). The plugin + * adds that directory to the source sets. The `protoc` output directory + * ([protocOutputDir]) must be kept out of the compilation: otherwise each + * generated class is compiled twice — once from the `protoc` output and once + * from the Compiler output — and the build fails with duplicate class errors. + * + * The plugin already removes the `protoc` directories from the source sets via + * [configureSourceSetDirs][io.spine.tools.protobuf.gradle.plugin.configureSourceSetDirs]. + * That removal rewrites the source-set directories once during configuration and + * does not always hold for the `test` source set: depending on the order in which + * the plugins are applied, a symlinked project path, or another plugin re-adding + * the directory, the `protoc` output may end up back in the source set. This + * function adds an order-independent line of defence by filtering the compilation + * input directly. The filter is evaluated when a compilation task resolves its + * sources, so it holds regardless of when the directory was added to the source + * set. + * + * The deprecated in-place mode, in which the Compiler overwrites the `protoc` + * output instead of writing to a separate directory, is left untouched: there the + * generated code legitimately resides in the `protoc` output directory, so + * filtering it out would drop it from compilation. + * + * @see [GenerateProtoTask.configureSourceSetDirs] + */ +private fun Project.excludeProtocOutputFromCompilation() { + afterEvaluate { + val protocOutput = protocOutputDir + val compilerWritesInPlace = generatedDir.toFile().residesIn(protocOutput) + if (compilerWritesInPlace) { + return@afterEvaluate + } + // `JavaCompile` ignores an `exclude(Spec)` predicate for the files it + // passes to `javac`, so its source is re-set to a filtered view of + // itself. The view wraps the task's own (live) source and preserves the + // task dependencies it carries, so the generated code is still produced + // before compilation. + tasks.withType(JavaCompile::class.java).configureEach { task -> + task.source = task.source.filter { file -> + !file.residesIn(protocOutput) + }.asFileTree + } + // `KotlinCompile` honors `exclude(Spec)` — a live predicate that needs no + // source re-wiring. The cast targets `KotlinCompile` (which is a + // `PatternFilterable`); any other `KotlinCompilationTask` is skipped. + val underProtocOutput = Spec { element -> + element.file.residesIn(protocOutput) + } + tasks.withType(KotlinCompilationTask::class.java).configureEach { task -> + (task as? PatternFilterable)?.exclude(underProtocOutput) + } } } diff --git a/version.gradle.kts b/version.gradle.kts index e6860dfd24..7d7b1687d5 100644 --- a/version.gradle.kts +++ b/version.gradle.kts @@ -30,7 +30,7 @@ * This version is also used by integration test projects. * E.g. see `tests/consumer/build.gradle.kts`. */ -val compilerVersion: String by extra("2.0.0-SNAPSHOT.057") +val compilerVersion: String by extra("2.0.0-SNAPSHOT.058") /** * The version, same as [compilerVersion], which is used for publishing From 6f754c9b4a8c066311a1e89e666975966b49fc2a Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 21:08:57 +0100 Subject: [PATCH 02/16] Pin CoreJvmCompiler to 2.0.0-SNAPSHOT.079 `CoreJvmCompiler` 2.0.0-SNAPSHOT.080 breaks the repository's self-build: the code it generates for the compiler's own Protobuf types is not loadable at test runtime, so `:backend:test` and `:backend:performanceTest` fail with `io.spine.type.UnknownTypeException: No Java class found for the Protobuf message of type ...` for many types (e.g. `spine.compiler.ProtobufSourceFile`). This affects every PR built against the current `master`. Pin both `dogfoodingVersion` (build classpath) and `version` back to the last-known-good `.079`, under which `:backend:test` (0 failed) and `:backend:performanceTest` pass locally. Co-Authored-By: Claude Opus 4.8 --- .../main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt | 4 ++-- docs/dependencies/pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt index c8d28e7f23..4754ad5b9e 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt @@ -46,12 +46,12 @@ object CoreJvmCompiler { /** * The version used in the build classpath. */ - const val dogfoodingVersion = "2.0.0-SNAPSHOT.080" + const val dogfoodingVersion = "2.0.0-SNAPSHOT.079" /** * The version to be used for integration tests. */ - const val version = "2.0.0-SNAPSHOT.080" + const val version = "2.0.0-SNAPSHOT.079" /** * The ID of the Gradle plugin. diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml index c373d89d90..4153ae08df 100644 --- a/docs/dependencies/pom.xml +++ b/docs/dependencies/pom.xml @@ -387,7 +387,7 @@ all modules and does not describe the project structure per-subproject. io.spine.tools core-jvm-plugins - 2.0.0-SNAPSHOT.080 + 2.0.0-SNAPSHOT.079 io.spine.tools From 0d92e841078b14ca3cc7371d3bfca94a7414e2f7 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 21:29:20 +0100 Subject: [PATCH 03/16] Bump Compiler and CoreJvm Compiler --- .../src/main/kotlin/io/spine/dependency/local/Compiler.kt | 4 ++-- .../main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt index 0de5a57129..8667b50e4d 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt @@ -72,7 +72,7 @@ object Compiler : Dependency() { * The version of the Compiler dependencies. */ override val version: String - private const val fallbackVersion = "2.0.0-SNAPSHOT.055" + private const val fallbackVersion = "2.0.0-SNAPSHOT.057" /** * The distinct version of the Compiler used by other build tools. @@ -81,7 +81,7 @@ object Compiler : Dependency() { * transitive dependencies, this is the version used to build the project itself. */ val dogfoodingVersion: String - private const val fallbackDfVersion = "2.0.0-SNAPSHOT.055" + private const val fallbackDfVersion = "2.0.0-SNAPSHOT.057" /** * The artifact for the Compiler Gradle plugin. diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt index 4754ad5b9e..c8d28e7f23 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt @@ -46,12 +46,12 @@ object CoreJvmCompiler { /** * The version used in the build classpath. */ - const val dogfoodingVersion = "2.0.0-SNAPSHOT.079" + const val dogfoodingVersion = "2.0.0-SNAPSHOT.080" /** * The version to be used for integration tests. */ - const val version = "2.0.0-SNAPSHOT.079" + const val version = "2.0.0-SNAPSHOT.080" /** * The ID of the Gradle plugin. From 071cdf3a2248331eb654bfb30e4f6736dc042d1e Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 21:29:30 +0100 Subject: [PATCH 04/16] Update dependency reports --- docs/dependencies/dependencies.md | 22 +++++++++++----------- docs/dependencies/pom.xml | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md index 370eec917f..281826f91c 100644 --- a/docs/dependencies/dependencies.md +++ b/docs/dependencies/dependencies.md @@ -1067,7 +1067,7 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -1444,7 +1444,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:14 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -2522,7 +2522,7 @@ This report was generated on **Tue Jun 30 19:56:14 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -3759,7 +3759,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -4783,7 +4783,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -5851,7 +5851,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -6946,7 +6946,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -8012,7 +8012,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -8852,7 +8852,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -9926,7 +9926,7 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -11107,6 +11107,6 @@ This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 19:56:15 WEST 2026** using +This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml index 4153ae08df..d340626815 100644 --- a/docs/dependencies/pom.xml +++ b/docs/dependencies/pom.xml @@ -377,17 +377,17 @@ all modules and does not describe the project structure per-subproject. io.spine.tools compiler-cli-all - 2.0.0-SNAPSHOT.055 + 2.0.0-SNAPSHOT.057 io.spine.tools compiler-protoc-plugin - 2.0.0-SNAPSHOT.055 + 2.0.0-SNAPSHOT.057 io.spine.tools core-jvm-plugins - 2.0.0-SNAPSHOT.079 + 2.0.0-SNAPSHOT.080 io.spine.tools From 16f4e0ba764057477c27cc215fc8b5ade8ed90a3 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 22:14:52 +0100 Subject: [PATCH 05/16] Canonicalize the protoc output directory once when filtering sources `residesIn` canonicalizes both operands, so calling it per source file re-canonicalized the `protoc` output directory on every file. Add a `residesIn(Path)` overload that takes an already-canonical directory, and canonicalize the `protoc` output once in `excludeProtocOutputFromCompilation`, avoiding the repeated filesystem work on large source sets. Co-Authored-By: Claude Opus 4.8 --- .../io/spine/tools/compiler/gradle/plugin/Paths.kt | 14 +++++++++++++- .../spine/tools/compiler/gradle/plugin/Plugin.kt | 4 +++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt index 2203e485e7..e4a917481f 100644 --- a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt +++ b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Paths.kt @@ -66,4 +66,16 @@ internal fun Iterable.excluding(excludeDir: File): Set = * such as `…/test2` is not mistaken for residing in `…/test`. */ internal fun File.residesIn(directory: File): Boolean = - canonicalFile.toPath().startsWith(directory.canonicalFile.toPath()) + residesIn(directory.canonicalFile.toPath()) + +/** + * Tells if this file resides under [canonicalDir] — a path that is *already* in + * canonical form. + * + * Resolving a path to its canonical form is a filesystem operation. This overload + * lets a caller canonicalize the directory once and reuse the result across many + * files — for example, while filtering a large source set — instead of + * re-canonicalizing the directory on every call, as the `File`-typed overload does. + */ +internal fun File.residesIn(canonicalDir: Path): Boolean = + canonicalFile.toPath().startsWith(canonicalDir) diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt index 21c1893c96..64148d91e3 100644 --- a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt +++ b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt @@ -339,7 +339,9 @@ private fun Project.configureWithProtobufPlugin(compilerVersion: String) { */ private fun Project.excludeProtocOutputFromCompilation() { afterEvaluate { - val protocOutput = protocOutputDir + // Canonicalize the `protoc` output directory once and reuse it while + // filtering each source file, instead of re-canonicalizing it per file. + val protocOutput = protocOutputDir.canonicalFile.toPath() val compilerWritesInPlace = generatedDir.toFile().residesIn(protocOutput) if (compilerWritesInPlace) { return@afterEvaluate From aad7887389049d4940c5da9f4689aa9b35edc6f3 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 22:43:21 +0100 Subject: [PATCH 06/16] Keep the plugin loadable without the Kotlin Gradle Plugin `KotlinCompilationTask` comes from the Kotlin Gradle Plugin, which is a `compileOnly` dependency and is therefore not on the plugin's runtime classpath. Referencing it via a class literal forced the class to load even for consumers that apply `io.spine.compiler` without Kotlin (e.g. `tests/in-place-consumer`), risking a `NoClassDefFoundError` during plugin application. Guard the Kotlin compile-task filtering with `hasKotlin()` (a name-based check), so the task type is referenced only when Kotlin is present. Also align the `compiler-cli-all` and `compiler-protoc-plugin` versions in `docs/dependencies/pom.xml` with the bumped project version (`.058`), matching `dependencies.md`. Co-Authored-By: Claude Opus 4.8 --- docs/dependencies/pom.xml | 4 ++-- .../tools/compiler/gradle/plugin/Plugin.kt | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml index d340626815..29152550e5 100644 --- a/docs/dependencies/pom.xml +++ b/docs/dependencies/pom.xml @@ -377,12 +377,12 @@ all modules and does not describe the project structure per-subproject. io.spine.tools compiler-cli-all - 2.0.0-SNAPSHOT.057 + 2.0.0-SNAPSHOT.058 io.spine.tools compiler-protoc-plugin - 2.0.0-SNAPSHOT.057 + 2.0.0-SNAPSHOT.058 io.spine.tools diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt index 64148d91e3..7cbefd5787 100644 --- a/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt +++ b/gradle-plugin/src/main/kotlin/io/spine/tools/compiler/gradle/plugin/Plugin.kt @@ -56,6 +56,7 @@ import io.spine.tools.compiler.params.WorkingDirectory import io.spine.tools.gradle.lib.LibraryPlugin import io.spine.tools.gradle.lib.spineExtension import io.spine.tools.gradle.project.hasJavaOrKotlin +import io.spine.tools.gradle.project.hasKotlin import io.spine.tools.gradle.project.sourceSets import io.spine.tools.gradle.task.SpineTaskGroup import io.spine.tools.meta.ArtifactMeta @@ -359,11 +360,18 @@ private fun Project.excludeProtocOutputFromCompilation() { // `KotlinCompile` honors `exclude(Spec)` — a live predicate that needs no // source re-wiring. The cast targets `KotlinCompile` (which is a // `PatternFilterable`); any other `KotlinCompilationTask` is skipped. - val underProtocOutput = Spec { element -> - element.file.residesIn(protocOutput) - } - tasks.withType(KotlinCompilationTask::class.java).configureEach { task -> - (task as? PatternFilterable)?.exclude(underProtocOutput) + // + // The Kotlin Gradle Plugin is a `compileOnly` dependency, so its task type + // is not on the runtime classpath. The reference to `KotlinCompilationTask` + // is therefore guarded by `hasKotlin()` (a name-based check), keeping the + // plugin loadable for consumers that apply it without Kotlin. + if (hasKotlin()) { + val underProtocOutput = Spec { element -> + element.file.residesIn(protocOutput) + } + tasks.withType(KotlinCompilationTask::class.java).configureEach { task -> + (task as? PatternFilterable)?.exclude(underProtocOutput) + } } } } From 6c37d627e0a94a64c817071a4f2fbe037cb219c8 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 23:07:02 +0100 Subject: [PATCH 07/16] Update `config` --- .github/workflows/build-on-ubuntu.yml | 2 +- .../src/main/kotlin/DependencyResolution.kt | 6 +- .../src/main/kotlin/dokka-setup.gradle.kts | 11 +- .../kotlin/io/spine/dependency/Dependency.kt | 11 ++ .../io/spine/dependency/boms/BomsPlugin.kt | 5 +- .../io/spine/dependency/local/Logging.kt | 2 +- .../kotlin/io/spine/dependency/storage/H2.kt | 40 ++++++ .../io/spine/dependency/storage/Hikari.kt | 40 ++++++ .../io/spine/dependency/storage/HsqlDb.kt | 41 ++++++ .../io/spine/dependency/storage/MySql.kt | 41 ++++++ .../io/spine/dependency/storage/PostgreSql.kt | 40 ++++++ .../io/spine/dependency/storage/QueryDsl.kt | 45 +++++++ .../spine/dependency/test/Testcontainers.kt | 28 +++- .../io/spine/gradle/kotlin/KotlinConfig.kt | 20 ++- .../gradle/report/pom/DependencyWriter.kt | 123 ++++++++++++++---- .../gradle/report/pom/ProjectMetadata.kt | 8 +- .../src/main/kotlin/jacoco-kmm-jvm.gradle.kts | 87 ------------- .../main/kotlin/jacoco-kotlin-jvm.gradle.kts | 80 ------------ .../src/main/kotlin/jvm-module.gradle.kts | 6 +- .../src/main/kotlin/kmp-module.gradle.kts | 9 +- .../main/kotlin/uber-jar-module.gradle.kts | 9 +- .../src/main/kotlin/write-manifest.gradle.kts | 2 +- .../gradle/report/pom/DependencyWriterSpec.kt | 113 ++++++++++++++++ config | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 4 +- gradlew.bat | 4 +- 27 files changed, 553 insertions(+), 228 deletions(-) create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/storage/H2.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/storage/Hikari.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/storage/HsqlDb.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/storage/MySql.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/storage/PostgreSql.kt create mode 100644 buildSrc/src/main/kotlin/io/spine/dependency/storage/QueryDsl.kt delete mode 100644 buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts diff --git a/.github/workflows/build-on-ubuntu.yml b/.github/workflows/build-on-ubuntu.yml index 01f6fd71a8..b07bf0fb0a 100644 --- a/.github/workflows/build-on-ubuntu.yml +++ b/.github/workflows/build-on-ubuntu.yml @@ -87,7 +87,7 @@ jobs: # there anyway). - name: Upload code coverage report if: steps.codecov.outputs.available == 'true' || github.event_name == 'push' - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true diff --git a/buildSrc/src/main/kotlin/DependencyResolution.kt b/buildSrc/src/main/kotlin/DependencyResolution.kt index 124adb3f55..7d76bbba90 100644 --- a/buildSrc/src/main/kotlin/DependencyResolution.kt +++ b/buildSrc/src/main/kotlin/DependencyResolution.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import io.spine.dependency.build.Dokka import io.spine.dependency.build.ErrorProne import io.spine.dependency.build.FindBugs import io.spine.dependency.build.JSpecify +import io.spine.dependency.isDokka import io.spine.dependency.lib.Asm import io.spine.dependency.lib.AutoCommon import io.spine.dependency.lib.AutoService @@ -73,6 +74,9 @@ fun doForceVersions(configurations: ConfigurationContainer) { */ fun NamedDomainObjectContainer.forceVersions() { all { + if (isDokka) { + return@all + } resolutionStrategy { failOnVersionConflict() cacheChangingModulesFor(0, "seconds") diff --git a/buildSrc/src/main/kotlin/dokka-setup.gradle.kts b/buildSrc/src/main/kotlin/dokka-setup.gradle.kts index d34615c3fe..a1915cf0c3 100644 --- a/buildSrc/src/main/kotlin/dokka-setup.gradle.kts +++ b/buildSrc/src/main/kotlin/dokka-setup.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,15 @@ tasks.withType().configureEach { } } +// The Dokka Javadoc format does not support Kotlin Multiplatform source sets, so its +// publication task fails for KMP modules ("No source set found for /jvmMain"). +// KMP modules publish HTML documentation, so skip the Javadoc publication for them. +plugins.withId("org.jetbrains.kotlin.multiplatform") { + tasks.matching { it.name == "dokkaGeneratePublicationJavadoc" }.configureEach { + enabled = false + } +} + afterEvaluate { dokka { configureForKotlin( diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt b/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt index 372651128e..0eb1956bda 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/Dependency.kt @@ -111,6 +111,17 @@ abstract class DependencyWithBom : Dependency() { fun Configuration.diagSuffix(project: Project): String = "the configuration `$name` in the project: `${project.path}`." +/** + * Tells if this configuration belongs to Dokka's own generator/plugin classpath. + * + * Dokka resolves these `dokka*` configurations using dependency versions pinned by + * Dokka itself (for example, Jackson or Kotlin), which legitimately differ from the + * project's. Forcing the project's versions onto them breaks `dokkaGenerate`, so such + * configurations must be excluded from the project's version forcing. + */ +val Configuration.isDokka: Boolean + get() = name.startsWith("dokka") + private fun ResolutionStrategy.forceWithLogging( project: Project, configuration: Configuration, diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt b/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt index c5444a00d5..e60d6dea54 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/boms/BomsPlugin.kt @@ -29,6 +29,7 @@ package io.spine.dependency.boms import io.gitlab.arturbosch.detekt.getSupportedKotlinVersion import io.spine.dependency.DependencyWithBom import io.spine.dependency.diagSuffix +import io.spine.dependency.isDokka import io.spine.dependency.kotlinx.Coroutines import io.spine.dependency.lib.Kotlin import io.spine.dependency.test.JUnit @@ -88,7 +89,7 @@ class BomsPlugin : Plugin { applyBoms(project, Boms.core + Boms.testing) } - matching { !supportsBom(it.name) }.all { + matching { !supportsBom(it.name) && !it.isDokka }.all { resolutionStrategy.eachDependency { if (requested.group == Kotlin.group) { val kotlinVersion = Kotlin.runtimeVersion @@ -170,7 +171,7 @@ private fun supportsBom(name: String) = private fun Project.forceArtifacts() = configurations.all { resolutionStrategy { - if (!isDetekt) { + if (!isDetekt && !isDokka) { val rs = this@resolutionStrategy val project = this@forceArtifacts val cfg = this@all diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt index 04d19ea52d..e9f477ac3c 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt @@ -33,7 +33,7 @@ package io.spine.dependency.local */ @Suppress("ConstPropertyName", "unused") object Logging { - const val version = "2.0.0-SNAPSHOT.417" + const val version = "2.0.0-SNAPSHOT.419" const val group = Spine.group const val loggingArtifact = "spine-logging" diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/storage/H2.kt b/buildSrc/src/main/kotlin/io/spine/dependency/storage/H2.kt new file mode 100644 index 0000000000..5232e63fa5 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/storage/H2.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.dependency.storage + +/** + * The H2 Database Engine — a fast, in-memory/embedded SQL database used for exercising + * the JDBC storage in tests. + * + * @see H2 Database Engine at GitHub + * @see H2 Database Engine site + */ +@Suppress("unused", "ConstPropertyName") +object H2 { + private const val version = "2.4.240" + const val lib = "com.h2database:h2:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/storage/Hikari.kt b/buildSrc/src/main/kotlin/io/spine/dependency/storage/Hikari.kt new file mode 100644 index 0000000000..5ab609ef35 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/storage/Hikari.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.dependency.storage + +/** + * HikariCP — a fast, lightweight JDBC connection pool. + * + * The JDBC storage uses it to pool database connections. + * + * @see HikariCP at GitHub + */ +@Suppress("unused", "ConstPropertyName") +object Hikari { + private const val version = "7.1.0" + const val lib = "com.zaxxer:HikariCP:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/storage/HsqlDb.kt b/buildSrc/src/main/kotlin/io/spine/dependency/storage/HsqlDb.kt new file mode 100644 index 0000000000..3a6b509ca7 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/storage/HsqlDb.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.dependency.storage + +/** + * HyperSQL DataBase (HSQLDB) — a relational database engine written in Java, used in its + * in-memory mode for exercising the JDBC storage in tests. + * + * HSQLDB is hosted on SourceForge rather than GitHub. + * + * @see HyperSQL Database site + */ +@Suppress("unused", "ConstPropertyName") +object HsqlDb { + private const val version = "2.7.4" + const val lib = "org.hsqldb:hsqldb:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/storage/MySql.kt b/buildSrc/src/main/kotlin/io/spine/dependency/storage/MySql.kt new file mode 100644 index 0000000000..78bbfc3b1a --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/storage/MySql.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.dependency.storage + +/** + * MySQL Connector/J — the official JDBC driver for MySQL. + * + * Used by the MySQL-based storage tests. Note the modern `com.mysql:mysql-connector-j` + * coordinates, which superseded the legacy `mysql:mysql-connector-java` artifact. + * + * @see MySQL Connector/J at GitHub + */ +@Suppress("unused", "ConstPropertyName") +object MySql { + private const val version = "9.7.0" + const val connector = "com.mysql:mysql-connector-j:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/storage/PostgreSql.kt b/buildSrc/src/main/kotlin/io/spine/dependency/storage/PostgreSql.kt new file mode 100644 index 0000000000..d4083c65c9 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/storage/PostgreSql.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.dependency.storage + +/** + * The PostgreSQL JDBC driver (pgJDBC). + * + * Used by the PostgreSQL-based storage tests to connect to a real PostgreSQL server. + * + * @see PostgreSQL JDBC Driver at GitHub + */ +@Suppress("unused", "ConstPropertyName") +object PostgreSql { + private const val version = "42.7.11" + const val connector = "org.postgresql:postgresql:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/storage/QueryDsl.kt b/buildSrc/src/main/kotlin/io/spine/dependency/storage/QueryDsl.kt new file mode 100644 index 0000000000..e22cd9a90b --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/dependency/storage/QueryDsl.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.dependency.storage + +/** + * QueryDSL — a framework for constructing type-safe SQL-like queries in Java. + * + * The JDBC storage uses the SQL module to build database queries. + * + * @see QueryDSL at GitHub + */ +@Suppress("unused", "ConstPropertyName") +object QueryDsl { + private const val version = "5.1.0" + private const val group = "com.querydsl" + + /** + * The SQL module of QueryDSL. + */ + const val sql = "$group:querydsl-sql:$version" +} diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Testcontainers.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Testcontainers.kt index bb3b22e39a..85c91b5048 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Testcontainers.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Testcontainers.kt @@ -26,12 +26,38 @@ package io.spine.dependency.test -// https://github.com/testcontainers/testcontainers-java +/** + * Testcontainers for Java — provides throwaway, lightweight instances of databases and other + * services running in Docker containers. + * + * The modules below are versioned and released together, so a single [version] applies to all + * of them. + * + * @see + * Testcontainers for Java at GitHub + */ @Suppress("unused", "ConstPropertyName") object Testcontainers { private const val version = "1.21.4" private const val group = "org.testcontainers" + + /** + * The core Testcontainers library. + */ const val lib = "$group:testcontainers:$version" + + /** + * The JUnit 5 (Jupiter) integration. + */ const val junitJupiter = "$group:junit-jupiter:$version" + + /** + * The Google Cloud (GCP) emulator container support. + */ const val gcloud = "$group:gcloud:$version" + + /** + * The MySQL container support. + */ + const val mySql = "$group:mysql:$version" } diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt b/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt index 92b7a38743..0e5099a77f 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/kotlin/KotlinConfig.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,20 +55,26 @@ fun KotlinJvmProjectExtension.applyJvmToolchain(version: String) = */ @Suppress("unused") fun KotlinCommonCompilerOptions.setFreeCompilerArgs() { + val optIns = mutableListOf( + "kotlin.contracts.ExperimentalContracts", + "kotlin.ExperimentalUnsignedTypes", + "kotlin.ExperimentalStdlibApi", + "kotlin.experimental.ExperimentalTypeInference", + ) if (this is KotlinJvmCompilerOptions) { jvmDefault.set(JvmDefaultMode.NO_COMPATIBILITY) + // `kotlin.io.path` ships only in the JVM standard library, so for common + // and Native compilations this opt-in marker is unresolved and the compiler + // warns about it. Scope it to JVM compilations; multiplatform common and + // Native code cannot use the API anyway. + optIns.add("kotlin.io.path.ExperimentalPathApi") } freeCompilerArgs.addAll( listOf( "-Xskip-prerelease-check", "-Xexpect-actual-classes", "-Xcontext-parameters", - "-opt-in=" + - "kotlin.contracts.ExperimentalContracts," + - "kotlin.io.path.ExperimentalPathApi," + - "kotlin.ExperimentalUnsignedTypes," + - "kotlin.ExperimentalStdlibApi," + - "kotlin.experimental.ExperimentalTypeInference", + "-opt-in=" + optIns.joinToString(separator = ","), ) ) } diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt index 64e46ef75b..2a2a4c1c32 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/DependencyWriter.kt @@ -34,6 +34,7 @@ import kotlin.reflect.full.isSubclassOf import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.internal.artifacts.dependencies.AbstractExternalModuleDependency import org.gradle.kotlin.dsl.withGroovyBuilder @@ -54,6 +55,11 @@ import org.gradle.kotlin.dsl.withGroovyBuilder * * ``` * + * The version reported for each dependency is the one selected by Gradle's + * dependency resolution — the version actually placed on the classpath — rather + * than the version requested in the build script. This reflects `force(...)` + * directives, platform/BOM constraints, and conflict resolution. + * * When there are several versions of the same dependency, only the one with * the newest version is retained. If the retained version is used in several * configurations, the highest-ranking Maven scope is reported, e.g. `compile` @@ -107,38 +113,70 @@ private constructor( /** * Returns the [scoped dependencies][ScopedDependency] of a Gradle project. + * + * The version of each dependency is the one selected by dependency resolution + * for the project it comes from. See [resolvedVersions]. + */ +fun Project.dependencies(): SortedSet = + collectScopedDependencies { it.resolvedVersions() } + +/** + * Returns the [scoped dependencies][ScopedDependency] of a Gradle project, taking + * the version of each dependency from the given [resolvedVersions] map instead of + * resolving the project's own configurations. + * + * This overload exists for tests: a project created with `ProjectBuilder` cannot + * resolve its configurations against real repositories, so the resolved versions + * are supplied directly. The keys are the `"group:name"` of the modules. */ -fun Project.dependencies(): SortedSet { +internal fun Project.dependencies( + resolvedVersions: Map +): SortedSet = + collectScopedDependencies { resolvedVersions } + +/** + * Collects the [scoped dependencies][ScopedDependency] of this project and its + * subprojects, deduplicates them, and returns them in the conventional Maven order. + * + * The version of each dependency is taken from the map returned by the supplied + * `resolvedVersionsOf` function for the project the dependency comes from. + */ +private fun Project.collectScopedDependencies( + resolvedVersionsOf: (Project) -> Map +): SortedSet { val dependencies = mutableSetOf() - dependencies.addAll(this.depsFromAllConfigurations()) + dependencies.addAll(depsFromAllConfigurations(resolvedVersionsOf(this))) - this.subprojects.forEach { subproject -> - val subprojectDeps = subproject.depsFromAllConfigurations() + subprojects.forEach { subproject -> + val subprojectDeps = subproject.depsFromAllConfigurations(resolvedVersionsOf(subproject)) dependencies.addAll(subprojectDeps) } - val result = deduplicate(dependencies) + return deduplicate(dependencies) .map { it.scoped } .toSortedSet() - return result } /** * Returns the external dependencies of the project from all the project configurations. + * + * The version of each returned dependency is taken from [resolvedVersions] by its + * `"group:name"` key, falling back to the declared version when the module is on no + * resolvable configuration — for example, a version managed by a BOM, which carries + * no explicit version of its own. */ -private fun Project.depsFromAllConfigurations(): Set { +private fun Project.depsFromAllConfigurations( + resolvedVersions: Map +): Set { val result = mutableSetOf() - this.configurations.forEach { configuration -> + configurations.forEach { configuration -> configuration.dependencies .filter { it.isExternal() } .forEach { dependency -> - val forcedVersion = configuration.forcedVersionOf(dependency) + val version = resolvedVersions[moduleKey(dependency.group, dependency.name)] + ?: dependency.version val moduleDependency = - if (forcedVersion != null) { - ModuleDependency(project, configuration, dependency, forcedVersion) - } else { - ModuleDependency(project, configuration, dependency) - } + ModuleDependency(this, configuration, dependency, factualVersion = version) result.add(moduleDependency) } } @@ -146,20 +184,55 @@ private fun Project.depsFromAllConfigurations(): Set { } /** - * Searches for a forced version of given [dependency] in this [Configuration]. + * Returns the versions selected by dependency resolution for this project, keyed + * by the `"group:name"` of each module. + * + * The declared version of a dependency is what the build script *requested*, which + * may differ from what the build *uses*: a `force(...)`, a platform/BOM constraint, + * or Gradle's conflict resolution can all select another version. Reading the + * resolution result captures the selected version, so the report describes the + * dependencies actually on the classpath rather than the requested ones. * - * Returns `null`, if it wasn't forced. + * Only resolvable configurations contribute. When a module resolves to different + * versions across configurations, the newest one (by [VersionComparator]) is kept, + * matching the deduplication applied afterwards. A configuration that fails to + * resolve in isolation is skipped and logged, so the report never breaks the build. */ -private fun Configuration.forcedVersionOf(dependency: Dependency): String? { - val forcedModules = resolutionStrategy.forcedModules - val maybeForced = forcedModules.firstOrNull { - it.group == dependency.group - && it.name == dependency.name - && it.version != null - } - return maybeForced?.version +private fun Project.resolvedVersions(): Map { + // Resolving an individual configuration may fail for reasons unrelated to the + // report — missing repositories for a niche configuration, an unsatisfiable + // constraint, and the like. Such a configuration contributes no versions. + @Suppress("TooGenericExceptionCaught") // Any resolution failure is non-fatal here. + fun componentsOf(configuration: Configuration): Set = + try { + configuration.incoming.resolutionResult.allComponents + } catch (e: Exception) { + logger.info( + "Skipping configuration `${configuration.name}` " + + "while collecting resolved dependency versions.", + e + ) + emptySet() + } + + return configurations + .filter { it.isCanBeResolved } + .flatMap { componentsOf(it) } + .mapNotNull { it.moduleVersion } + .groupBy { moduleKey(it.group, it.name) } + .mapValues { (_, versions) -> versions.maxOfWith(VersionComparator) { it.version } } } +/** + * Builds the `"group:name"` key under which a module's resolved version is recorded + * and looked up. + * + * Forming the key in one place keeps the lookup in [depsFromAllConfigurations] + * consistent with what [resolvedVersions] records and with the grouping done by + * [deduplicate]. + */ +private fun moduleKey(group: String?, name: String): String = "$group:$name" + /** * Tells whether the dependency is an external module dependency. */ @@ -193,7 +266,7 @@ private fun Dependency.isExternal(): Boolean { * The rejected duplicates are logged. */ private fun Project.deduplicate(dependencies: Set): List { - val groups = dependencies.groupBy { it.run { "$group:$name" } } + val groups = dependencies.groupBy { moduleKey(it.group, it.name) } logDuplicates(groups.mapValues { (_, deps) -> deps.distinctBy { it.gav } }) diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt index ffb89a263f..66e3400e28 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/pom/ProjectMetadata.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,9 +30,7 @@ import groovy.xml.MarkupBuilder import java.io.StringWriter import kotlin.reflect.KProperty import org.gradle.api.Project -import org.gradle.kotlin.dsl.PropertyDelegate import org.gradle.kotlin.dsl.extra -import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.withGroovyBuilder /** @@ -90,10 +88,10 @@ private fun Project.nonEmptyValue(prop: Any): NonEmptyValue { private class NonEmptyValue( private val defaultValue: String, private val project: Project -) : PropertyDelegate { +) { @Suppress("UNCHECKED_CAST") - override fun getValue(receiver: Any?, property: KProperty<*>): T { + operator fun getValue(receiver: Any?, property: KProperty<*>): T { if (defaultValue.isNotEmpty()) { return defaultValue as T } diff --git a/buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts b/buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts deleted file mode 100644 index 7334ef97f0..0000000000 --- a/buildSrc/src/main/kotlin/jacoco-kmm-jvm.gradle.kts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2026, TeamDev. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Redistribution and use in source and/or binary forms, with or without - * modification, must retain the above copyright notice and the following - * disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -import java.io.File -import org.gradle.kotlin.dsl.getValue -import org.gradle.kotlin.dsl.getting -import org.gradle.kotlin.dsl.jacoco -import org.gradle.testing.jacoco.tasks.JacocoReport - -// DEPRECATED: this script plugin distributes vanilla JaCoCo. -// New code should apply `kmp-module`, which configures Kover via -// `useJacoco(version = Jacoco.version)` and writes JaCoCo-format XML at -// `build/reports/kover/report.xml`. (Same task and path as Kotlin-JVM — -// `kmp-module` configures only Kover's `total` report, so no -// `koverXmlReport` task is generated.) The `raise-coverage` skill -// migrates existing consumers automatically. Kept so older consumer repos -// continue to build; will be removed in a future release. -// See: .agents/skills/raise-coverage/references/migrate-to-kover.md - -plugins { - jacoco -} - -logger.warn( - "'jacoco-kmm-jvm' is deprecated; use 'kmp-module' which applies Kover. " + - "See .agents/skills/raise-coverage/references/migrate-to-kover.md." -) - -/** - * Configures [JacocoReport] task to run in a Kotlin KMM project for `commonMain` and `jvmMain` - * source sets. - * - * This script plugin must be applied using the following construct at the end of - * a `build.gradle.kts` file of a module: - * - * ```kotlin - * apply(plugin="jacoco-kmm-jvm") - * ``` - * Please do not apply this script plugin in the `plugins {}` block because `jacocoTestReport` - * task is not yet available at this stage. - */ -@Suppress("unused") -private val about = "" - -/** - * Configure the Jacoco task with custom input a KMM project - * to which this convention plugin is applied. - */ -@Suppress("unused") -val jacocoTestReport: JacocoReport by tasks.getting(JacocoReport::class) { - val buildDir = project.layout.buildDirectory.get().asFile.absolutePath - val classFiles = File("${buildDir}/classes/kotlin/jvm/") - .walkBottomUp() - .toSet() - classDirectories.setFrom(classFiles) - - val coverageSourceDirs = arrayOf( - "src/commonMain", - "src/jvmMain" - ) - sourceDirectories.setFrom(files(coverageSourceDirs)) - - executionData.setFrom(files("${buildDir}/jacoco/jvmTest.exec")) -} diff --git a/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts b/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts deleted file mode 100644 index 185c9cdfdd..0000000000 --- a/buildSrc/src/main/kotlin/jacoco-kotlin-jvm.gradle.kts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2026, TeamDev. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Redistribution and use in source and/or binary forms, with or without - * modification, must retain the above copyright notice and the following - * disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -import io.spine.gradle.buildDirectory - -// DEPRECATED: this script plugin distributes vanilla JaCoCo. -// New code should apply `jvm-module`, which configures Kover via -// `useJacoco(version = Jacoco.version)` and writes JaCoCo-format XML at -// `build/reports/kover/report.xml`. The `raise-coverage` skill migrates -// existing consumers automatically. Kept so older consumer repos continue to -// build; will be removed in a future release. -// See: .agents/skills/raise-coverage/references/migrate-to-kover.md - -plugins { - jacoco -} - -logger.warn( - "'jacoco-kotlin-jvm' is deprecated; use 'jvm-module' which applies Kover. " + - "See .agents/skills/raise-coverage/references/migrate-to-kover.md." -) - -/** - * Configures [JacocoReport] task to run in a Kotlin Multiplatform project for - * `commonMain` and `jvmMain` source sets. - * - * This script plugin must be applied using the following construct at the end of - * a `build.gradle.kts` file of a module: - * - * ```kotlin - * apply(plugin="jacoco-kotlin-jvm") - * ``` - * Please do not apply this script plugin in the `plugins {}` block because `jacocoTestReport` - * task is not yet available at this stage. - */ -@Suppress("unused") -private val about = "" - -/** - * Configure Jacoco task with custom input from this Kotlin Multiplatform project. - */ -@Suppress("unused") -val jacocoTestReport: JacocoReport by tasks.getting(JacocoReport::class) { - - val classFiles = File("$buildDirectory/classes/kotlin/jvm/") - .walkBottomUp() - .toSet() - classDirectories.setFrom(classFiles) - - val coverageSourceDirs = arrayOf( - "src/commonMain", - "src/jvmMain" - ) - sourceDirectories.setFrom(files(coverageSourceDirs)) - - executionData.setFrom(files("$buildDirectory/jacoco/jvmTest.exec")) -} diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts index a7b3113092..1438116b77 100644 --- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts +++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts @@ -29,6 +29,7 @@ import io.spine.dependency.build.CheckerFramework import io.spine.dependency.build.Dokka import io.spine.dependency.build.ErrorProne import io.spine.dependency.build.JSpecify +import io.spine.dependency.isDokka import io.spine.dependency.lib.Guava import io.spine.dependency.lib.Jackson import io.spine.dependency.lib.Kotlin @@ -132,6 +133,9 @@ fun Module.forceConfigurations() { forceVersions() excludeProtobufLite() all { + if (isDokka) { + return@all + } resolutionStrategy { val cfg = this@all val rs = this@resolutionStrategy @@ -150,7 +154,7 @@ fun Module.forceConfigurations() { fun Module.setTaskDependencies(generatedDir: String) { tasks { - val cleanGenerated by registering(Delete::class) { + val cleanGenerated = register("cleanGenerated") { group = SpineTaskGroup.name description = "Deletes the directory with generated sources" delete(generatedDir) diff --git a/buildSrc/src/main/kotlin/kmp-module.gradle.kts b/buildSrc/src/main/kotlin/kmp-module.gradle.kts index a2e6d82e58..089722e612 100644 --- a/buildSrc/src/main/kotlin/kmp-module.gradle.kts +++ b/buildSrc/src/main/kotlin/kmp-module.gradle.kts @@ -25,6 +25,7 @@ */ import io.spine.dependency.boms.BomsPlugin +import io.spine.dependency.isDokka import io.spine.dependency.lib.Jackson import io.spine.dependency.lib.Kotlin import io.spine.dependency.local.Reflect @@ -83,6 +84,9 @@ fun Project.forceConfigurations() { with(configurations) { forceVersions() all { + if (isDokka) { + return@all + } resolutionStrategy { val cfg = this@all val rs = this@resolutionStrategy @@ -122,9 +126,8 @@ kotlin { // Dependencies are specified per-target. // Please note, common sources are implicitly available in all targets. - @Suppress("unused") // source set `val`s are used implicitly. sourceSets { - val commonTest by getting { + getByName("commonTest") { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) @@ -132,7 +135,7 @@ kotlin { implementation(Kotest.frameworkEngine) } } - val jvmTest by getting { + getByName("jvmTest") { dependencies { implementation(dependencies.enforcedPlatform(JUnit.bom)) implementation(TestLib.lib) diff --git a/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts b/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts index 0cace2ebe3..e59e30ef82 100644 --- a/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts +++ b/buildSrc/src/main/kotlin/uber-jar-module.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -70,11 +70,8 @@ publishing { } } -/** - * Declare dependency explicitly to address the Gradle error. - */ -@Suppress("unused") -val publishFatJarPublicationToMavenLocal: Task by tasks.getting { +// Declare dependency explicitly to address the Gradle error. +tasks.getByName("publishFatJarPublicationToMavenLocal") { dependsOn(tasks.shadowJar) } diff --git a/buildSrc/src/main/kotlin/write-manifest.gradle.kts b/buildSrc/src/main/kotlin/write-manifest.gradle.kts index 49130c0c4b..2c49daa7cc 100644 --- a/buildSrc/src/main/kotlin/write-manifest.gradle.kts +++ b/buildSrc/src/main/kotlin/write-manifest.gradle.kts @@ -104,7 +104,7 @@ val manifestAttributes = mapOf( * when running tests. We cannot depend on the `Jar` from `resources` because it would * form a circular dependency. */ -val exposeManifestForTests by tasks.registering { +val exposeManifestForTests = tasks.register("exposeManifestForTests") { group = SpineTaskGroup.name description = "Writes a `MANIFEST.MF` to `resources/main` so that it is visible to tests" diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/report/pom/DependencyWriterSpec.kt b/buildSrc/src/test/kotlin/io/spine/gradle/report/pom/DependencyWriterSpec.kt index 0c4b23355f..baec7877dd 100644 --- a/buildSrc/src/test/kotlin/io/spine/gradle/report/pom/DependencyWriterSpec.kt +++ b/buildSrc/src/test/kotlin/io/spine/gradle/report/pom/DependencyWriterSpec.kt @@ -31,12 +31,16 @@ import io.kotest.matchers.ints.shouldBeLessThan import io.kotest.matchers.shouldBe import io.kotest.matchers.string.shouldContain import io.kotest.matchers.string.shouldNotContain +import java.io.File import java.io.StringWriter +import org.gradle.api.Action import org.gradle.api.Project +import org.gradle.api.artifacts.repositories.MavenArtifactRepository import org.gradle.testfixtures.ProjectBuilder import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir @DisplayName("`DependencyWriter` should") internal class DependencyWriterSpec { @@ -246,6 +250,112 @@ internal class DependencyWriterSpec { } } + @Nested inner class + `report the version selected by dependency resolution` { + + /** + * A `force(...)` pins an artifact to a version that is *older* than one of + * the declared ones. The report must show the resolved version — the one + * actually on the classpath — and not the newest of the declared ones, + * which the deduplication would otherwise pick. + */ + @Test + fun `preferring it over a newer declared version`() { + val older = "$VALIDATION_RUNTIME:2.0.0-SNAPSHOT.40" + val newer = "$VALIDATION_RUNTIME:2.0.0-SNAPSHOT.61" + subproject("a-text").declare("implementation", newer) + subproject("b-text").declare("implementation", older) + + val resolved = mapOf(VALIDATION_RUNTIME to "2.0.0-SNAPSHOT.40") + val dependency = rootProject.dependencies(resolved).single() + + dependency.dependency().version shouldBe "2.0.0-SNAPSHOT.40" + } + + /** + * Two versions of the same artifact declared in a single module and + * configuration — the case that used to log a spurious "several versions" + * warning — collapse to the single resolved version. + */ + @Test + fun `collapsing several declarations within one configuration`() { + val text = subproject("text") + text.declare("implementation", "$VALIDATION_RUNTIME:2.0.0-SNAPSHOT.61") + text.declare("implementation", "$VALIDATION_RUNTIME:2.0.0-SNAPSHOT.40") + + val resolved = mapOf(VALIDATION_RUNTIME to "2.0.0-SNAPSHOT.61") + val dependency = rootProject.dependencies(resolved).single() + + dependency.dependency().version shouldBe "2.0.0-SNAPSHOT.61" + } + + @Test + fun `falling back to the declared version when it is not resolved`() { + subproject("lib").declare("api", SPINE_BASE) + + val dependency = rootProject.dependencies(emptyMap()).single() + + dependency.dependency().version shouldBe "2.0.0" + } + } + + @Nested inner class + `read the version from a resolved configuration` { + + /** + * Drives the real (non-injected) `dependencies()` entry point against an + * actually resolved configuration. A module is declared at one version but + * `force`d to an older one; the report must show the forced, i.e. resolved, + * version. The forcing is observable only through resolution, so the module + * is resolved from a local repository of metadata-only POMs. + */ + @Test + fun `honoring a forced version over the declared one`(@TempDir repoDir: File) { + val group = "io.spine.validation" + val name = "spine-validation-java-runtime" + publishPom(repoDir, group, name, "1.0.40") + publishPom(repoDir, group, name, "1.0.61") + + val text = subproject("text") + text.addMavenRepository(repoDir) + val api = text.configurations.create("api") + api.isCanBeResolved = true + api.resolutionStrategy.force("$group:$name:1.0.40") + text.dependencies.add("api", "$group:$name:1.0.61") + + val dependency = rootProject.dependencies().single() + + dependency.dependency().version shouldBe "1.0.40" + } + + /** Writes a metadata-only Maven POM for the module under [repoDir]. */ + private fun publishPom(repoDir: File, group: String, name: String, version: String) { + val dir = File(repoDir, "${group.replace('.', '/')}/$name/$version") + dir.mkdirs() + File(dir, "$name-$version.pom").writeText( + """ + + 4.0.0 + $group + $name + $version + + """.trimIndent() + ) + } + + private fun Project.addMavenRepository(dir: File) { + // The `org.gradle.kotlin.dsl` `maven { }` accessors are not on the + // `buildSrc` test compile classpath, so the core `Action` overload is + // used directly rather than the DSL lambda. + repositories.maven(object : Action { + override fun execute(repository: MavenArtifactRepository) { + repository.setUrl(dir.toURI()) + } + }) + } + } + @Test fun `omit the scope of a dependency coming only from an unknown configuration`() { subproject("lib").declare("spineCompiler", SPINE_BASE) @@ -308,5 +418,8 @@ internal class DependencyWriterSpec { private companion object { const val SPINE_BASE = "io.spine:spine-base:2.0.0" const val SPINE_BASE_NEWER = "io.spine:spine-base:2.0.1" + + /** The `"group:name"` of the validation runtime artifact, without a version. */ + const val VALIDATION_RUNTIME = "io.spine.validation:spine-validation-java-runtime" } } diff --git a/config b/config index 8068c5d2a2..fdf78d7a2c 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit 8068c5d2a291925a3207d2d881165c714cc364a3 +Subproject commit fdf78d7a2c2372cead94ea29e9155707e200b94e diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df6a6ad763..a9db11550c 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.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip networkTimeout=10000 retries=0 retryBackOffMs=500 diff --git a/gradlew b/gradlew index b9bb139f79..249efbb032 100755 --- a/gradlew +++ b/gradlew @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: diff --git a/gradlew.bat b/gradlew.bat index 24c62d56f2..a51ec4f588 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,7 +19,7 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## @@ -72,7 +72,7 @@ echo location of your Java installation. 1>&2 -@rem Execute Gradle +@rem Execute gradlew @rem endlocal doesn't take effect until after the line is parsed and variables are expanded @rem which allows us to clear the local environment before executing the java command endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel From 2c09a153145130081856b96d24ca0265656038b0 Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 23:12:33 +0100 Subject: [PATCH 08/16] Add unit tests for protoc-output exclusion and `residesIn` Cover `excludeProtocOutputFromCompilation` and `File.residesIn` with in-process tests so the deduplication logic is exercised under Kover. The functional test runs in a separate TestKit JVM that coverage cannot instrument, which left the new lines uncovered. `ExcludeProtocOutputSpec` evaluates a project with the plugin applied and asserts a file under the `protoc` output directory is kept out of the `compileJava` source. `PathsSpec` covers the nested, self, sibling, and already-canonical cases of `residesIn`. Co-Authored-By: Claude Opus 4.8 --- .../io/spine/dependency/local/Compiler.kt | 2 + .../gradle/plugin/ExcludeProtocOutputSpec.kt | 75 +++++++++++++++++++ .../tools/compiler/gradle/plugin/PathsSpec.kt | 68 +++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/ExcludeProtocOutputSpec.kt create mode 100644 gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/PathsSpec.kt diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt index 8667b50e4d..e3b4d0aa4d 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt @@ -27,6 +27,8 @@ package io.spine.dependency.local import io.spine.dependency.Dependency +import io.spine.dependency.local.Compiler.DF_VERSION_ENV +import io.spine.dependency.local.Compiler.VERSION_ENV /** * Dependencies on the Spine Compiler modules. diff --git a/gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/ExcludeProtocOutputSpec.kt b/gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/ExcludeProtocOutputSpec.kt new file mode 100644 index 0000000000..52e77aff11 --- /dev/null +++ b/gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/ExcludeProtocOutputSpec.kt @@ -0,0 +1,75 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.tools.compiler.gradle.plugin + +import com.google.protobuf.gradle.ProtobufPlugin +import io.kotest.matchers.shouldBe +import java.io.File +import org.gradle.api.internal.project.ProjectInternal +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.kotlin.dsl.apply +import org.gradle.testfixtures.ProjectBuilder +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir + +@DisplayName("The plugin should exclude the `protoc` output from compilation") +internal class ExcludeProtocOutputSpec { + + /** + * Reproduces the state in which the `protoc` output directory is among the + * source directories of the `main` source set, and verifies that the file it + * contains does not reach the `compileJava` task — see + * [issue #19](https://github.com/SpineEventEngine/compiler/issues/19). + */ + @Test + fun `keeping it out of the Java compile task source`(@TempDir projectDir: File) { + val project = ProjectBuilder.builder().withProjectDir(projectDir).build() + project.group = "io.spine.stubs" + with(project) { + apply(plugin = "java") + apply() + apply() + repositories.mavenLocal() + } + + // A file under the default `protoc` output directory, added to the source set + // as if the source-set-level deduplication had not removed it. + val protocJavaDir = projectDir.resolve("build/generated/sources/proto/main/java") + protocJavaDir.mkdirs() + val leaked = protocJavaDir.resolve("Leaked.java") + leaked.writeText("class Leaked {}") + val sourceSets = project.extensions.getByType(SourceSetContainer::class.java) + sourceSets.getByName("main").java.srcDir(protocJavaDir) + + (project as ProjectInternal).evaluate() + + val compileJava = project.tasks.getByName("compileJava") as JavaCompile + compileJava.source.contains(leaked) shouldBe false + } +} diff --git a/gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/PathsSpec.kt b/gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/PathsSpec.kt new file mode 100644 index 0000000000..4dd113b7ed --- /dev/null +++ b/gradle-plugin/src/test/kotlin/io/spine/tools/compiler/gradle/plugin/PathsSpec.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.tools.compiler.gradle.plugin + +import io.kotest.matchers.shouldBe +import java.io.File +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir + +@DisplayName("`File.residesIn` should") +internal class PathsSpec { + + @Test + fun `treat a nested file as residing in the directory`(@TempDir dir: File) { + val root = dir.resolve("test").apply { mkdirs() } + val nested = root.resolve("java/Stub.java") + + nested.residesIn(root) shouldBe true + } + + @Test + fun `treat the directory itself as residing in it`(@TempDir dir: File) { + val root = dir.resolve("test").apply { mkdirs() } + + root.residesIn(root) shouldBe true + } + + @Test + fun `not treat a sibling directory as residing in it`(@TempDir dir: File) { + val test = dir.resolve("test").apply { mkdirs() } + val sibling = dir.resolve("test2").apply { mkdirs() } + + sibling.residesIn(test) shouldBe false + } + + @Test + fun `accept a directory that is already canonical`(@TempDir dir: File) { + val root = dir.resolve("test").apply { mkdirs() } + val nested = root.resolve("Stub.java") + + nested.residesIn(root.canonicalFile.toPath()) shouldBe true + } +} From 0287f6d4959a30217736d1df3b0d63af9fb2563b Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Tue, 30 Jun 2026 23:19:33 +0100 Subject: [PATCH 09/16] Remove redundant imports --- buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt index e3b4d0aa4d..8667b50e4d 100644 --- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt +++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt @@ -27,8 +27,6 @@ package io.spine.dependency.local import io.spine.dependency.Dependency -import io.spine.dependency.local.Compiler.DF_VERSION_ENV -import io.spine.dependency.local.Compiler.VERSION_ENV /** * Dependencies on the Spine Compiler modules. From 6099afc22d1af99fd63340c6950db3a47216a2ef Mon Sep 17 00:00:00 2001 From: Alexander Yevsyukov Date: Wed, 1 Jul 2026 01:32:44 +0100 Subject: [PATCH 10/16] Update dependency reports --- docs/dependencies/dependencies.md | 410 +++++++++++++++++++++++------- docs/dependencies/pom.xml | 24 +- 2 files changed, 336 insertions(+), 98 deletions(-) diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md index 281826f91c..eda7690486 100644 --- a/docs/dependencies/dependencies.md +++ b/docs/dependencies/dependencies.md @@ -190,11 +190,11 @@ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -674,13 +674,13 @@ * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/) * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2. * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) @@ -848,6 +848,10 @@ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -880,6 +884,10 @@ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -888,10 +896,18 @@ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -900,6 +916,10 @@ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -932,10 +952,18 @@ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -944,6 +972,10 @@ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -956,11 +988,11 @@ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -1067,7 +1099,7 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -1304,13 +1336,13 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [http://junit.org](http://junit.org) * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2. * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) @@ -1384,11 +1416,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -1444,7 +1476,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -1645,11 +1677,11 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2129,13 +2161,13 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/) * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2. * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) @@ -2303,6 +2335,10 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2335,6 +2371,10 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2343,10 +2383,18 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2355,6 +2403,10 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2387,10 +2439,18 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2399,6 +2459,10 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2411,11 +2475,11 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -2522,7 +2586,7 @@ This report was generated on **Tue Jun 30 21:29:05 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -2809,11 +2873,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3366,13 +3430,13 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) * **License:** [LGPL-2.1-or-later](https://www.gnu.org/licenses/old-licenses/lgpl-2.1) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2. * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) @@ -3540,6 +3604,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3572,6 +3640,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3580,10 +3652,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3592,6 +3672,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3624,10 +3708,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3636,6 +3728,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3648,11 +3744,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -3759,7 +3855,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -3956,11 +4052,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -4672,11 +4768,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -4783,7 +4879,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -4980,11 +5076,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -5736,11 +5832,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -5851,7 +5947,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -6069,11 +6165,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6553,13 +6649,13 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/) * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2. * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) @@ -6727,6 +6823,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6759,6 +6859,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6767,10 +6871,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6779,6 +6891,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6811,10 +6927,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6823,6 +6947,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6835,11 +6963,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -6946,7 +7074,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -7143,11 +7271,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7793,6 +7921,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7825,6 +7957,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7833,10 +7969,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7845,6 +7989,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7877,10 +8025,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7889,6 +8045,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -7901,11 +8061,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -8012,7 +8172,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -8745,11 +8905,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -8852,7 +9012,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -9053,11 +9213,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9707,6 +9867,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9739,6 +9903,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9747,10 +9915,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9759,6 +9935,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9791,10 +9971,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9803,6 +9991,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9815,11 +10007,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -9926,7 +10118,7 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -10141,13 +10333,13 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [http://junit.org](http://junit.org) * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3. * **Project URL:** [https://checkerframework.org](https://checkerframework.org) @@ -10209,11 +10401,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10714,13 +10906,13 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/) * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0. - * **Project URL:** [https://www.apache.org/](https://www.apache.org/) - * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.26.0. + * **Project URL:** [https://logging.apache.org/log4j/2.x/](https://logging.apache.org/log4j/2.x/) + * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) 1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2. * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian) @@ -10888,6 +11080,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10920,6 +11116,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10928,10 +11128,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.1.21. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10940,6 +11148,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 1.8.20. + * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) + * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21. * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/) * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10972,10 +11184,18 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10984,6 +11204,10 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.7.3. + * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) + * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) + 1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2. * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -10996,11 +11220,11 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) -1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1. +1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.8.0. * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime) * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -11107,6 +11331,6 @@ This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 21:29:06 WEST 2026** using +This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml index 29152550e5..93d68f4c7b 100644 --- a/docs/dependencies/pom.xml +++ b/docs/dependencies/pom.xml @@ -38,6 +38,7 @@ all modules and does not describe the project structure per-subproject. com.fasterxml.jackson.dataformat jackson-dataformat-yaml + 2.22.0 compile @@ -91,11 +92,13 @@ all modules and does not describe the project structure per-subproject. io.grpc grpc-protobuf + 1.81.0 compile io.grpc grpc-stub + 1.81.0 compile @@ -119,13 +122,13 @@ all modules and does not describe the project structure per-subproject. io.spine spine-logging - 2.0.0-SNAPSHOT.417 + 2.0.0-SNAPSHOT.419 compile io.spine spine-logging-jvm - 2.0.0-SNAPSHOT.417 + 2.0.0-SNAPSHOT.419 compile @@ -179,7 +182,7 @@ all modules and does not describe the project structure per-subproject. io.spine.tools logging-testlib - 2.0.0-SNAPSHOT.417 + 2.0.0-SNAPSHOT.419 compile @@ -347,6 +350,7 @@ all modules and does not describe the project structure per-subproject. org.junit.platform junit-platform-launcher + 6.1.0 test @@ -377,12 +381,12 @@ all modules and does not describe the project structure per-subproject. io.spine.tools compiler-cli-all - 2.0.0-SNAPSHOT.058 + 2.0.0-SNAPSHOT.057 io.spine.tools compiler-protoc-plugin - 2.0.0-SNAPSHOT.058 + 2.0.0-SNAPSHOT.057 io.spine.tools @@ -449,6 +453,11 @@ all modules and does not describe the project structure per-subproject. templating-plugin 2.2.0 + + org.jetbrains.kotlin + abi-tools + 2.3.21 + org.jetbrains.kotlin kotlin-build-tools-compat @@ -459,6 +468,11 @@ all modules and does not describe the project structure per-subproject. kotlin-build-tools-impl 2.3.21 + + org.jetbrains.kotlin + kotlin-klib-commonizer-embeddable + 2.3.21 + org.jetbrains.kotlin kotlin-scripting-compiler-embeddable From 1221242530161314a7cc61993aaa8dda33f5c75e Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 1 Jul 2026 16:08:15 +0100 Subject: [PATCH 11/16] Address Gradle deprecations Also: * Remove redundant script. --- build.gradle.kts | 6 +- .../kotlin/version-to-resources.gradle.kts | 59 ------------------- cli/build.gradle.kts | 1 - gradle-plugin/build.gradle.kts | 1 - 4 files changed, 3 insertions(+), 64 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/version-to-resources.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 920bd99ed9..fdd006043f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -128,7 +128,7 @@ KoverConfig.applyTo(project) * publishing in the root project. */ val projectsToPublish: Set = the().modules -val localPublish by tasks.registering { +val localPublish = tasks.register("localPublish") { /* Integration tests need the plugin subproject published to Maven Local too because they apply the plugin. @@ -187,7 +187,7 @@ fun materializeTestsLink(linkName: String) { * This build should run _only_ if all tests of all modules passed. * Otherwise, integration tests make little sense. */ -val integrationTest by tasks.registering(RunBuild::class) { +val integrationTest = tasks.register("integrationTest") { directory = "$rootDir/tests" /* The `tests` build consumes the Compiler published to Maven Local by `localPublish`, so the build cache in that build exercises the plugin under development. */ @@ -195,7 +195,7 @@ val integrationTest by tasks.registering(RunBuild::class) { dependsOn(localPublish) subprojects.forEach { it.tasks.findByName("test")?.let { testTask -> - this@registering.dependsOn(testTask) + this@register.dependsOn(testTask) } } doFirst { diff --git a/buildSrc/src/main/kotlin/version-to-resources.gradle.kts b/buildSrc/src/main/kotlin/version-to-resources.gradle.kts deleted file mode 100644 index 6ac408c574..0000000000 --- a/buildSrc/src/main/kotlin/version-to-resources.gradle.kts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2025, TeamDev. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Redistribution and use in source and/or binary forms, with or without - * modification, must retain the above copyright notice and the following - * disclaimer. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -plugins { - java -} - -val versionDir = layout.buildDirectory.dir("version").get().asFile.path - -/** - * This file, containing the version of ProtoData, is generated at build time and included into - * the project's resources. - * - * Please search for the usages of "version.txt" when making changes. - */ -val versionFile = "$versionDir/version.txt" - -sourceSets { - main { - resources.srcDir(versionDir) - } -} - -val createVersionFile by tasks.registering { - - inputs.property("version", project.version) - outputs.file(versionFile) - - doLast { - file(versionFile).writeText(project.version.toString()) - } -} - -tasks.processResources { - dependsOn(createVersionFile) -} diff --git a/cli/build.gradle.kts b/cli/build.gradle.kts index 3e15e65aa2..207c1056eb 100644 --- a/cli/build.gradle.kts +++ b/cli/build.gradle.kts @@ -36,7 +36,6 @@ import io.spine.gradle.publish.setup plugins { module application - `version-to-resources` `write-manifest` `build-proto-model` `maven-publish` diff --git a/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts index c6cb5f80b1..2c98e03253 100644 --- a/gradle-plugin/build.gradle.kts +++ b/gradle-plugin/build.gradle.kts @@ -41,7 +41,6 @@ plugins { `java-gradle-plugin` `maven-publish` id("com.gradle.plugin-publish").version("1.3.1") - `version-to-resources` `write-manifest` } From 822a0a9e6fee6cdb9a4f6ef870279a5abc1579ca Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 1 Jul 2026 16:13:49 +0100 Subject: [PATCH 12/16] Bump version -> `2.0.0-SNAPSHOT.059` --- version.gradle.kts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/version.gradle.kts b/version.gradle.kts index 7d7b1687d5..a31766223d 100644 --- a/version.gradle.kts +++ b/version.gradle.kts @@ -30,10 +30,11 @@ * This version is also used by integration test projects. * E.g. see `tests/consumer/build.gradle.kts`. */ -val compilerVersion: String by extra("2.0.0-SNAPSHOT.058") +private val compilerVersion = "2.0.0-SNAPSHOT.059" +extra.set("compilerVersion", compilerVersion) /** * The version, same as [compilerVersion], which is used for publishing * the Compiler Maven artifacts. */ -val versionToPublish by extra(compilerVersion) +extra.set("versionToPublish", compilerVersion) From 41991841f9c9edf66f87c96155e6a4a131928fc1 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 1 Jul 2026 16:14:06 +0100 Subject: [PATCH 13/16] Update dependency reports --- docs/dependencies/dependencies.md | 44 +++++++++++++++---------------- docs/dependencies/pom.xml | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md index eda7690486..639b23d11c 100644 --- a/docs/dependencies/dependencies.md +++ b/docs/dependencies/dependencies.md @@ -1,6 +1,6 @@ -# Dependencies of `io.spine.tools:compiler-api:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-api:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -1099,14 +1099,14 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-api-tests:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-api-tests:2.0.0-SNAPSHOT.059` ## Runtime ## Compile, tests, and tooling @@ -1476,14 +1476,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:16 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-backend:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-backend:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -2586,14 +2586,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-cli:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-cli:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -3855,14 +3855,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-gradle-api:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-gradle-api:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -4879,14 +4879,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-gradle-plugin:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-gradle-plugin:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -5947,14 +5947,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-jvm:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-jvm:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -7074,14 +7074,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-params:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-params:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -8172,14 +8172,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-protoc-plugin:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-protoc-plugin:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2. @@ -9012,14 +9012,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-test-env:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-test-env:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -10118,14 +10118,14 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). -# Dependencies of `io.spine.tools:compiler-testlib:2.0.0-SNAPSHOT.058` +# Dependencies of `io.spine.tools:compiler-testlib:2.0.0-SNAPSHOT.059` ## Runtime 1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.22.0. @@ -11331,6 +11331,6 @@ This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Tue Jun 30 23:13:38 WEST 2026** using +This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file diff --git a/docs/dependencies/pom.xml b/docs/dependencies/pom.xml index 93d68f4c7b..b2e383144b 100644 --- a/docs/dependencies/pom.xml +++ b/docs/dependencies/pom.xml @@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject. --> io.spine.tools compiler -2.0.0-SNAPSHOT.058 +2.0.0-SNAPSHOT.059 2015 From aa7cbe6b15cecc60d70de7f6bce73221878a0a14 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 1 Jul 2026 16:14:41 +0100 Subject: [PATCH 14/16] Update `config` --- .../kotlin/io/spine/gradle/fs/LazyTempPath.kt | 9 +- .../kotlin/io/spine/gradle/fs/SpineTempDir.kt | 92 +++++++++++++++++++ .../io/spine/gradle/fs/LazyTempPathSpec.kt | 69 ++++++++++++++ .../io/spine/gradle/fs/SpineTempDirSpec.kt | 54 +++++++++++ config | 2 +- 5 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 buildSrc/src/main/kotlin/io/spine/gradle/fs/SpineTempDir.kt create mode 100644 buildSrc/src/test/kotlin/io/spine/gradle/fs/LazyTempPathSpec.kt create mode 100644 buildSrc/src/test/kotlin/io/spine/gradle/fs/SpineTempDirSpec.kt diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt b/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt index 0344819f22..b31cd3087f 100644 --- a/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt +++ b/buildSrc/src/main/kotlin/io/spine/gradle/fs/LazyTempPath.kt @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,11 +41,16 @@ import java.nio.file.WatchService * * After the first usage, the instances of this type delegate all calls to the internally * created instance of [Path] created with [createTempDirectory]. + * + * The directory is created under the [shared base directory][SpineTempDir], which is removed + * when the JVM — the Gradle daemon — shuts down. Build tasks delete their own directories + * eagerly as the primary cleanup; this shutdown removal is a safety net, so a directory does + * not outlive the daemon even when a build fails before its eager cleanup runs. */ @Suppress("TooManyFunctions") class LazyTempPath(private val prefix: String) : Path { - private val delegate: Path by lazy { createTempDirectory(prefix) } + private val delegate: Path by lazy { createTempDirectory(SpineTempDir.path, prefix) } override fun compareTo(other: Path): Int = delegate.compareTo(other) diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/fs/SpineTempDir.kt b/buildSrc/src/main/kotlin/io/spine/gradle/fs/SpineTempDir.kt new file mode 100644 index 0000000000..d6e856e01f --- /dev/null +++ b/buildSrc/src/main/kotlin/io/spine/gradle/fs/SpineTempDir.kt @@ -0,0 +1,92 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.gradle.fs + +import java.nio.file.Files.createDirectories +import java.nio.file.Files.createTempDirectory +import java.nio.file.Path + +/** + * A per-JVM parent directory for the temporary directories created by the build. + * + * The directory is created [lazily][path] under a common, attributable namespace — + * `/io.spine.gradle.fs`, named after the package of [LazyTempPath] — so + * that leftover files are easy to attribute. Within that namespace, each JVM gets its own + * subdirectory named after the process id, so concurrent Gradle daemons never delete one + * another's temporary files. + * + * Upon creation, the per-JVM directory is scheduled for recursive removal when the JVM + * shuts down. This is a safety net should the explicit cleanup performed by the build + * tasks not run — for example, when a build fails before reaching it. The shared namespace + * directory itself is intentionally left in place: deleting it on shutdown could wipe + * directories still in use by another JVM running on the same machine. + * + * @see LazyTempPath + */ +internal object SpineTempDir { + + /** + * The per-JVM directory, created on the first access and removed on JVM shutdown. + */ + val path: Path by lazy { createPerJvmDir() } + + private fun createPerJvmDir(): Path { + val namespace = Path.of(systemTempDir(), LazyTempPath::class.java.packageName) + createDirectories(namespace) + // A per-JVM directory keeps concurrent Gradle daemons from deleting one another's + // files when their shutdown hooks fire. The PID makes a leftover directory easy + // to attribute; `createTempDirectory` adds a random suffix so that a reused PID + // still yields a unique directory. + val pid = ProcessHandle.current().pid() + val jvmDir = createTempDirectory(namespace, "$pid-") + deleteRecursivelyOnShutdown(jvmDir) + return jvmDir + } + + /** + * Obtains the value of the system property pointing to the temporary directory. + */ + private fun systemTempDir(): String = + checkNotNull(System.getProperty("java.io.tmpdir")) { + "The `java.io.tmpdir` system property is not set." + } + + /** + * Requests the recursive removal of the given [directory] when the JVM shuts down. + * + * @see Runtime.addShutdownHook + */ + private fun deleteRecursivelyOnShutdown(directory: Path) { + val runtime = Runtime.getRuntime() + runtime.addShutdownHook(Thread { + val deleted = directory.toFile().deleteRecursively() + if (!deleted) { + System.err.println("Unable to delete the temporary directory `$directory`.") + } + }) + } +} diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/fs/LazyTempPathSpec.kt b/buildSrc/src/test/kotlin/io/spine/gradle/fs/LazyTempPathSpec.kt new file mode 100644 index 0000000000..260e852fe2 --- /dev/null +++ b/buildSrc/src/test/kotlin/io/spine/gradle/fs/LazyTempPathSpec.kt @@ -0,0 +1,69 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.gradle.fs + +import io.kotest.matchers.shouldBe +import io.kotest.matchers.string.shouldContain +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +@DisplayName("`LazyTempPath` should") +class LazyTempPathSpec { + + @Test + fun `create the directory on the first use`() { + val directory = LazyTempPath("created").toFile() + + directory.exists() shouldBe true + directory.isDirectory shouldBe true + } + + @Test + fun `create the directory under the system temporary directory`() { + val path = LazyTempPath("under-tmp").toString() + + path shouldContain systemTempDir() + } + + @Test + fun `create the directory under a folder named after its package`() { + val path = LazyTempPath("under-base").toString() + + path shouldContain LazyTempPath::class.java.packageName + } + + @Test + fun `place all instances under the same base directory`() { + val first = LazyTempPath("first").toFile() + val second = LazyTempPath("second").toFile() + + first.parentFile shouldBe second.parentFile + first.parentFile.toString() shouldBe SpineTempDir.path.toString() + } +} + +private fun systemTempDir(): String = System.getProperty("java.io.tmpdir") diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/fs/SpineTempDirSpec.kt b/buildSrc/src/test/kotlin/io/spine/gradle/fs/SpineTempDirSpec.kt new file mode 100644 index 0000000000..8bf42500a8 --- /dev/null +++ b/buildSrc/src/test/kotlin/io/spine/gradle/fs/SpineTempDirSpec.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2026, TeamDev. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and/or binary forms, with or without + * modification, must retain the above copyright notice and the following + * disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package io.spine.gradle.fs + +import io.kotest.matchers.shouldBe +import java.nio.file.Path +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +@DisplayName("`SpineTempDir` should") +class SpineTempDirSpec { + + @Test + fun `place its per-JVM directory under the package-named namespace`() { + val namespace = Path.of( + System.getProperty("java.io.tmpdir"), + LazyTempPath::class.java.packageName + ) + + SpineTempDir.path.parent shouldBe namespace + } + + @Test + fun `create the directory on access`() { + val directory = SpineTempDir.path.toFile() + + directory.exists() shouldBe true + directory.isDirectory shouldBe true + } +} diff --git a/config b/config index fdf78d7a2c..73d246ad7e 160000 --- a/config +++ b/config @@ -1 +1 @@ -Subproject commit fdf78d7a2c2372cead94ea29e9155707e200b94e +Subproject commit 73d246ad7ebe4e3b8e3f0c14335152435daa1b20 From 1cb7dbf52b1aeb5c73e9c352eba338bed749cd62 Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 1 Jul 2026 16:22:34 +0100 Subject: [PATCH 15/16] Address Gradle deprecations --- gradle-plugin/build.gradle.kts | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts index 2c98e03253..d5583ad6a8 100644 --- a/gradle-plugin/build.gradle.kts +++ b/gradle-plugin/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright 2025, TeamDev. All rights reserved. + * Copyright 2026, TeamDev. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -68,13 +68,10 @@ artifactMeta { } } -@Suppress( - "UnstableApiUsage" /* testing suites feature */, - "unused" /* suite variable names obtained via `by` calls. */ -) +@Suppress("UnstableApiUsage") /* testing suites feature */ testing { suites { - val test by getting(JvmTestSuite::class) { + getByName("test") { useJUnitJupiter(JUnit.version) dependencies { implementation(Kotlin.GradlePlugin.lib) @@ -85,7 +82,7 @@ testing { } } - val functionalTest by registering(JvmTestSuite::class) { + register("functionalTest") { useJUnitJupiter(JUnit.version) dependencies { implementation(Kotlin.GradlePlugin.lib) @@ -123,8 +120,7 @@ dependencies { * Make functional tests depend on publishing all the submodules to Maven Local so that * the Gradle plugin can get all the dependencies when it's applied to the test projects. */ -@Suppress("unused") -val functionalTest: Task by tasks.getting { +tasks.getByName("functionalTest") { val task = this productionModules.forEach { subproject -> task.dependsOn(":${subproject.name}:publishToMavenLocal") @@ -136,15 +132,14 @@ java { withJavadocJar() } -val compilerVersion: String by extra +val compilerVersion = extra["compilerVersion"] as String val isSnapshot = compilerVersion.isSnapshot() -val publishPlugins: Task by tasks.getting { +val publishPlugins: Task = tasks.getByName("publishPlugins") { enabled = !isSnapshot } -@Suppress("unused") -val publish: Task by tasks.getting { +tasks.getByName("publish") { if (!isSnapshot) { dependsOn(publishPlugins) } @@ -178,13 +173,12 @@ gradlePlugin { tags.set(listOf("spine", "ddd", "protobuf", "compiler", "code-generation", "codegen")) } } - val functionalTest by sourceSets.getting + val functionalTest = sourceSets.getByName("functionalTest") testSourceSets( functionalTest ) } - tasks { check { dependsOn(testing.suites.named("functionalTest")) From e41e7f1c14cd7e135ec82d2068fa30650834ffdc Mon Sep 17 00:00:00 2001 From: alexander-yevsyukov Date: Wed, 1 Jul 2026 16:22:41 +0100 Subject: [PATCH 16/16] Update build time --- docs/dependencies/dependencies.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/dependencies/dependencies.md b/docs/dependencies/dependencies.md index 639b23d11c..8726f5f5e8 100644 --- a/docs/dependencies/dependencies.md +++ b/docs/dependencies/dependencies.md @@ -1099,7 +1099,7 @@ The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -1476,7 +1476,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:16 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:16 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -2586,7 +2586,7 @@ This report was generated on **Wed Jul 01 16:05:16 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -3855,7 +3855,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -4879,7 +4879,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -5947,7 +5947,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -7074,7 +7074,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -8172,7 +8172,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -9012,7 +9012,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -10118,7 +10118,7 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). @@ -11331,6 +11331,6 @@ This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using The dependencies distributed under several licenses, are used according their commercial-use-friendly license. -This report was generated on **Wed Jul 01 16:05:17 WEST 2026** using +This report was generated on **Wed Jul 01 16:19:17 WEST 2026** using [Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under [Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE). \ No newline at end of file