From bb719cf77c8840ecd62da2bd0712a131ea74bf11 Mon Sep 17 00:00:00 2001 From: GitHub Date: Wed, 1 Apr 2026 12:53:49 +0000 Subject: [PATCH 1/7] chore: update scripts/update-gradle.sh to v9.4.1 --- CHANGELOG.md | 6 ++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bd3b127948..04b98e606fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ - Android: Attachments on the scope will now be synced to native ([#5211](https://github.com/getsentry/sentry-java/pull/5211)) - Add THIRD_PARTY_NOTICES.md for vendored third-party code, bundled as SENTRY_THIRD_PARTY_NOTICES.md in the sentry JAR under META-INF ([#5186](https://github.com/getsentry/sentry-java/pull/5186)) +### Dependencies + +- Bump Gradle from v8.14.3 to v9.4.1 ([#5063](https://github.com/getsentry/sentry-java/pull/5063)) + - [changelog](https://github.com/gradle/gradle/blob/master/CHANGELOG.md#v941) + - [diff](https://github.com/gradle/gradle/compare/v8.14.3...v9.4.1) + ## 8.37.1 ### Fixes diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da476b..c61a118f7dd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From eb456fe37cac1e66476dd3e2e251db9234741008 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 2 Apr 2026 10:45:04 +0200 Subject: [PATCH 2/7] Fix build --- build.gradle.kts | 4 ++-- buildSrc/src/main/java/Config.kt | 2 +- gradle.properties | 2 +- gradle/libs.versions.toml | 2 +- .../sentry-opentelemetry-agent/build.gradle.kts | 4 ++-- .../build.gradle.kts | 2 +- sentry-samples/sentry-samples-console-otlp/build.gradle.kts | 2 +- sentry-samples/sentry-samples-console/build.gradle.kts | 2 +- sentry-samples/sentry-samples-jul/build.gradle.kts | 2 +- sentry-samples/sentry-samples-log4j2/build.gradle.kts | 2 +- sentry-samples/sentry-samples-logback/build.gradle.kts | 2 +- sentry-system-test-support/build.gradle.kts | 2 +- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 376d0652832..8a60b355974 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -249,9 +249,9 @@ tasks.register("buildForCodeQL") { } .forEach { proj -> if (proj.plugins.hasPlugin("com.android.library")) { - this.dependsOn(proj.tasks.findByName("compileReleaseUnitTestSources")) + this.dependsOn("compileReleaseUnitTestSources") } else { - this.dependsOn(proj.tasks.findByName("testClasses")) + this.dependsOn("testClasses") } } } diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index b5d1dafeb74..3285db23a98 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -2,7 +2,7 @@ import java.math.BigDecimal object Config { - val AGP = System.getenv("VERSION_AGP") ?: "8.6.0" + val AGP = System.getenv("VERSION_AGP") ?: "8.13.1" val kotlinStdLib = "stdlib-jdk8" val kotlinStdLibVersionAndroid = "1.9.24" val kotlinTestJunit = "test-junit" diff --git a/gradle.properties b/gradle.properties index 3ce5df53b45..74e535312be 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled # AndroidX required by AGP >= 3.6.x android.useAndroidX=true -android.experimental.lint.version=8.9.0 +android.experimental.lint.version=8.13.1 # Release information versionName=8.37.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eb7ab86e4bd..dada406508b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -64,7 +64,7 @@ vanniktech-maven-publish = { id = "com.vanniktech.maven.publish", version = "0.3 springboot2 = { id = "org.springframework.boot", version.ref = "springboot2" } springboot3 = { id = "org.springframework.boot", version.ref = "springboot3" } springboot4 = { id = "org.springframework.boot", version.ref = "springboot4" } -spring-dependency-management = { id = "io.spring.dependency-management", version = "1.0.11.RELEASE" } +spring-dependency-management = { id = "io.spring.dependency-management", version = "1.1.7" } gretty = { id = "org.gretty", version = "4.0.0" } animalsniffer = { id = "ru.vyarus.animalsniffer", version = "2.0.1" } sentry = { id = "io.sentry.android.gradle", version = "6.0.0-alpha.6"} diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 7ee17c09385..a9485dcf2fd 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -133,7 +133,7 @@ tasks { // each CopySpec has // its own duplicatesStrategy register("isolateJavaagentLibs", Copy::class.java) { - dependsOn(findByName("relocateJavaagentLibs")) + dependsOn("relocateJavaagentLibs") with(isolateClasses(findByName("relocateJavaagentLibs")!!.outputs.files)) into(project.layout.buildDirectory.file("isolated/javaagentLibs").get().asFile) @@ -145,7 +145,7 @@ tasks { named("shadowJar", ShadowJar::class) { configurations = listOf(bootstrapLibs) + listOf(upstreamAgent) - dependsOn(findByName("isolateJavaagentLibs")) + dependsOn("isolateJavaagentLibs") from(findByName("isolateJavaagentLibs")!!.outputs) archiveClassifier.set("") diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts index 338241078ae..b6e053b0ee0 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "9.4.1" } application { mainClass.set("io.sentry.samples.console.Main") } diff --git a/sentry-samples/sentry-samples-console-otlp/build.gradle.kts b/sentry-samples/sentry-samples-console-otlp/build.gradle.kts index 18836c89555..7c8cb878599 100644 --- a/sentry-samples/sentry-samples-console-otlp/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-otlp/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "9.4.1" } application { mainClass.set("io.sentry.samples.console.Main") } diff --git a/sentry-samples/sentry-samples-console/build.gradle.kts b/sentry-samples/sentry-samples-console/build.gradle.kts index 0dc6183b4fc..751904c98f3 100644 --- a/sentry-samples/sentry-samples-console/build.gradle.kts +++ b/sentry-samples/sentry-samples-console/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "9.4.1" } application { mainClass.set("io.sentry.samples.console.Main") } diff --git a/sentry-samples/sentry-samples-jul/build.gradle.kts b/sentry-samples/sentry-samples-jul/build.gradle.kts index 8b5f5057054..a6ced19bbae 100644 --- a/sentry-samples/sentry-samples-jul/build.gradle.kts +++ b/sentry-samples/sentry-samples-jul/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "9.4.1" } application { mainClass.set("io.sentry.samples.jul.Main") } diff --git a/sentry-samples/sentry-samples-log4j2/build.gradle.kts b/sentry-samples/sentry-samples-log4j2/build.gradle.kts index dede2d9cb29..b392df86772 100644 --- a/sentry-samples/sentry-samples-log4j2/build.gradle.kts +++ b/sentry-samples/sentry-samples-log4j2/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "9.4.1" } application { mainClass.set("io.sentry.samples.log4j2.Main") } diff --git a/sentry-samples/sentry-samples-logback/build.gradle.kts b/sentry-samples/sentry-samples-logback/build.gradle.kts index ee6949c6c6b..ab14c5f362a 100644 --- a/sentry-samples/sentry-samples-logback/build.gradle.kts +++ b/sentry-samples/sentry-samples-logback/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.github.johnrengelman.shadow") version "8.1.1" + id("com.gradleup.shadow") version "9.4.1" } application { mainClass.set("io.sentry.samples.logback.Main") } diff --git a/sentry-system-test-support/build.gradle.kts b/sentry-system-test-support/build.gradle.kts index dea680b4db1..ab21fffe858 100644 --- a/sentry-system-test-support/build.gradle.kts +++ b/sentry-system-test-support/build.gradle.kts @@ -5,7 +5,7 @@ plugins { jacoco alias(libs.plugins.errorprone) alias(libs.plugins.gradle.versions) - id("com.apollographql.apollo3") version "3.8.2" + id("com.apollographql.apollo") version "4.4.2" } configure { From f58cd00adf50016f8c8f92a706f28a34bccf18a5 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 2 Apr 2026 11:08:42 +0200 Subject: [PATCH 3/7] fix dependsOn --- build.gradle.kts | 8 ++++++-- .../sentry-opentelemetry-agent/build.gradle.kts | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8a60b355974..bfa4aef86f3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -249,9 +249,13 @@ tasks.register("buildForCodeQL") { } .forEach { proj -> if (proj.plugins.hasPlugin("com.android.library")) { - this.dependsOn("compileReleaseUnitTestSources") + proj.tasks.findByName("compileReleaseUnitTestSources")?.let { testTask -> + this.dependsOn(testTask) + } } else { - this.dependsOn("testClasses") + proj.tasks.findByName("testClasses")?.let { testTask -> + this.dependsOn(testTask) + } } } } diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index a9485dcf2fd..bf2df497dcf 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -133,7 +133,9 @@ tasks { // each CopySpec has // its own duplicatesStrategy register("isolateJavaagentLibs", Copy::class.java) { - dependsOn("relocateJavaagentLibs") + findByName("relocateJavaagentLibs")?.let { task -> + dependsOn(task) + } with(isolateClasses(findByName("relocateJavaagentLibs")!!.outputs.files)) into(project.layout.buildDirectory.file("isolated/javaagentLibs").get().asFile) @@ -145,7 +147,9 @@ tasks { named("shadowJar", ShadowJar::class) { configurations = listOf(bootstrapLibs) + listOf(upstreamAgent) - dependsOn("isolateJavaagentLibs") + findByName("isolateJavaagentLibs")?.let { task -> + dependsOn(task) + } from(findByName("isolateJavaagentLibs")!!.outputs) archiveClassifier.set("") From d240e673056823e3f94e8e50ea044a7134aaa695 Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 2 Apr 2026 11:17:08 +0200 Subject: [PATCH 4/7] align shadow plugin version --- gradle/libs.versions.toml | 1 + .../sentry-opentelemetry-agent/build.gradle.kts | 2 +- .../build.gradle.kts | 2 +- sentry-samples/sentry-samples-console-otlp/build.gradle.kts | 2 +- sentry-samples/sentry-samples-console/build.gradle.kts | 2 +- sentry-samples/sentry-samples-jul/build.gradle.kts | 2 +- sentry-samples/sentry-samples-log4j2/build.gradle.kts | 2 +- sentry-samples/sentry-samples-logback/build.gradle.kts | 2 +- 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dada406508b..9eb39e5066e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,6 +68,7 @@ spring-dependency-management = { id = "io.spring.dependency-management", version gretty = { id = "org.gretty", version = "4.0.0" } animalsniffer = { id = "ru.vyarus.animalsniffer", version = "2.0.1" } sentry = { id = "io.sentry.android.gradle", version = "6.0.0-alpha.6"} +shadow = { id = "com.gradleup.shadow", version = "8.3.6" } [libraries] apache-httpclient = { module = "org.apache.httpcomponents.client5:httpclient5", version = "5.0.4" } diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index bf2df497dcf..f1e3206e195 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -3,7 +3,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { `java-library` id("io.sentry.javadoc") - id("com.gradleup.shadow") version "8.3.6" + alias(libs.plugins.shadow) } fun relocatePackages(shadowJar: ShadowJar) { diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts index b6e053b0ee0..dfab063591b 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.gradleup.shadow") version "9.4.1" + alias(libs.plugins.shadow) } application { mainClass.set("io.sentry.samples.console.Main") } diff --git a/sentry-samples/sentry-samples-console-otlp/build.gradle.kts b/sentry-samples/sentry-samples-console-otlp/build.gradle.kts index 7c8cb878599..08b9315f785 100644 --- a/sentry-samples/sentry-samples-console-otlp/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-otlp/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.gradleup.shadow") version "9.4.1" + alias(libs.plugins.shadow) } application { mainClass.set("io.sentry.samples.console.Main") } diff --git a/sentry-samples/sentry-samples-console/build.gradle.kts b/sentry-samples/sentry-samples-console/build.gradle.kts index 751904c98f3..6d0a4fc736b 100644 --- a/sentry-samples/sentry-samples-console/build.gradle.kts +++ b/sentry-samples/sentry-samples-console/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.gradleup.shadow") version "9.4.1" + alias(libs.plugins.shadow) } application { mainClass.set("io.sentry.samples.console.Main") } diff --git a/sentry-samples/sentry-samples-jul/build.gradle.kts b/sentry-samples/sentry-samples-jul/build.gradle.kts index a6ced19bbae..ac1afa03d37 100644 --- a/sentry-samples/sentry-samples-jul/build.gradle.kts +++ b/sentry-samples/sentry-samples-jul/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.gradleup.shadow") version "9.4.1" + alias(libs.plugins.shadow) } application { mainClass.set("io.sentry.samples.jul.Main") } diff --git a/sentry-samples/sentry-samples-log4j2/build.gradle.kts b/sentry-samples/sentry-samples-log4j2/build.gradle.kts index b392df86772..84e6bb6a0ab 100644 --- a/sentry-samples/sentry-samples-log4j2/build.gradle.kts +++ b/sentry-samples/sentry-samples-log4j2/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.gradleup.shadow") version "9.4.1" + alias(libs.plugins.shadow) } application { mainClass.set("io.sentry.samples.log4j2.Main") } diff --git a/sentry-samples/sentry-samples-logback/build.gradle.kts b/sentry-samples/sentry-samples-logback/build.gradle.kts index ab14c5f362a..5cd5a2eb85b 100644 --- a/sentry-samples/sentry-samples-logback/build.gradle.kts +++ b/sentry-samples/sentry-samples-logback/build.gradle.kts @@ -5,7 +5,7 @@ plugins { application alias(libs.plugins.kotlin.jvm) alias(libs.plugins.gradle.versions) - id("com.gradleup.shadow") version "9.4.1" + alias(libs.plugins.shadow) } application { mainClass.set("io.sentry.samples.logback.Main") } From d30bf46ac61f9c6b2a0892bb626d47831e9fe6ac Mon Sep 17 00:00:00 2001 From: Roman Zavarnitsyn Date: Thu, 2 Apr 2026 12:32:09 +0200 Subject: [PATCH 5/7] Fix apollo version --- sentry-system-test-support/build.gradle.kts | 4 ++-- .../io/sentry/systemtest/graphql/GraphqlTestClient.kt | 8 ++++---- .../main/kotlin/io/sentry/systemtest/util/TestHelper.kt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sentry-system-test-support/build.gradle.kts b/sentry-system-test-support/build.gradle.kts index ab21fffe858..b8e4a283c87 100644 --- a/sentry-system-test-support/build.gradle.kts +++ b/sentry-system-test-support/build.gradle.kts @@ -5,7 +5,7 @@ plugins { jacoco alias(libs.plugins.errorprone) alias(libs.plugins.gradle.versions) - id("com.apollographql.apollo") version "4.4.2" + id("com.apollographql.apollo") version "4.1.1" } configure { @@ -22,7 +22,7 @@ tasks.withType().configureEach dependencies { api(projects.sentry) api(projects.sentryTestSupport) - api(libs.apollo3.kotlin) + api(libs.apollo4.kotlin) compileOnly(libs.jetbrains.annotations) compileOnly(libs.nopen.annotations) diff --git a/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/graphql/GraphqlTestClient.kt b/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/graphql/GraphqlTestClient.kt index 5127f06b8f7..c1b0a409bda 100644 --- a/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/graphql/GraphqlTestClient.kt +++ b/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/graphql/GraphqlTestClient.kt @@ -1,9 +1,9 @@ package io.sentry.systemtest.graphql -import com.apollographql.apollo3.ApolloClient -import com.apollographql.apollo3.api.ApolloResponse -import com.apollographql.apollo3.api.Mutation -import com.apollographql.apollo3.api.Query +import com.apollographql.apollo.ApolloClient +import com.apollographql.apollo.api.ApolloResponse +import com.apollographql.apollo.api.Mutation +import com.apollographql.apollo.api.Query import io.sentry.samples.graphql.AddProjectMutation import io.sentry.samples.graphql.GreetingQuery import io.sentry.samples.graphql.ProjectQuery diff --git a/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt b/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt index 19817c34ac8..7f0dfc8c955 100644 --- a/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt +++ b/sentry-system-test-support/src/main/kotlin/io/sentry/systemtest/util/TestHelper.kt @@ -1,7 +1,7 @@ package io.sentry.systemtest.util -import com.apollographql.apollo3.api.ApolloResponse -import com.apollographql.apollo3.api.Operation +import com.apollographql.apollo.api.ApolloResponse +import com.apollographql.apollo.api.Operation import io.sentry.JsonSerializer import io.sentry.ProfileChunk import io.sentry.SentryEnvelopeHeader From 219f3199c19fb4857bd583cf876ae6eeaf619030 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Thu, 2 Apr 2026 10:36:44 +0000 Subject: [PATCH 6/7] Format code --- .../sentry-opentelemetry-agent/build.gradle.kts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index f1e3206e195..1a57766cc96 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -133,9 +133,7 @@ tasks { // each CopySpec has // its own duplicatesStrategy register("isolateJavaagentLibs", Copy::class.java) { - findByName("relocateJavaagentLibs")?.let { task -> - dependsOn(task) - } + findByName("relocateJavaagentLibs")?.let { task -> dependsOn(task) } with(isolateClasses(findByName("relocateJavaagentLibs")!!.outputs.files)) into(project.layout.buildDirectory.file("isolated/javaagentLibs").get().asFile) @@ -147,9 +145,7 @@ tasks { named("shadowJar", ShadowJar::class) { configurations = listOf(bootstrapLibs) + listOf(upstreamAgent) - findByName("isolateJavaagentLibs")?.let { task -> - dependsOn(task) - } + findByName("isolateJavaagentLibs")?.let { task -> dependsOn(task) } from(findByName("isolateJavaagentLibs")!!.outputs) archiveClassifier.set("") From 393e7d7c53a1936dedc8189f2aa81901033cf370 Mon Sep 17 00:00:00 2001 From: Alexander Dinauer Date: Tue, 14 Apr 2026 15:03:53 +0200 Subject: [PATCH 7/7] fix(build): remove Spring Boot 2 Gradle plugin for Gradle 9 compatibility (#5263) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(build): remove Spring Boot 2 Gradle plugin for Gradle 9 compatibility The Spring Boot 2.7.x Gradle plugin uses removed Gradle APIs (LenientConfiguration.getFiles()) that are incompatible with Gradle 9. Library modules (sentry-spring, sentry-spring-boot, sentry-spring-boot-starter): - Replace SpringBootPlugin.BOM_COORDINATES with direct BOM reference via version catalog (libs.springboot2.bom) - Remove the 'apply false' plugin declaration entirely Sample apps (spring-boot, webflux, otel, netflix-dgs): - Replace Spring Boot plugin with Shadow plugin for fat JAR creation - Add application plugin for main class configuration - Use platform(libs.springboot2.bom) for dependency version management - Configure shadow JAR to merge Spring metadata files - Replace BootRun task with JavaExec in otel sample * fix: set duplicatesStrategy=INCLUDE for shadow JAR spring.factories merge Shadow plugin 9.x defaults to DuplicatesStrategy.EXCLUDE, which drops duplicate META-INF/spring.factories entries before transformers can merge them. Setting INCLUDE allows the AppendingTransformer to see all entries and properly concatenate spring.factories from all JARs. Without this, the shadow JAR only contains spring.factories from a single dependency, causing Spring Boot auto-configuration to fail (e.g. missing RestTemplateBuilder, no embedded web server). * fix: remove duplicate shadow plugin entry in version catalog * Format code * fix: update system test runner for shadow JAR compatibility - Auto-detect shadowJar vs bootJar build task based on build.gradle.kts - Add fallback HTTP readiness check for shadow JAR apps that lack actuator endpoints (actuator web endpoints don't work in flat JARs) - Append spring-autoconfigure-metadata.properties in shadow JAR config * fix(otel): use DuplicatesStrategy.INCLUDE for otel agent shadow JAR Shadow 9.x enforces duplicatesStrategy before transformers run, so DuplicatesStrategy.FAIL prevents mergeServiceFiles from merging inst/META-INF/services/ files that exist in both the upstream OTel agent JAR and the isolated distro libs. Switching to INCLUDE lets the transformer see all duplicates and merge them correctly. * Exclude test-support modules from api validation * Verbose system test output and wire inputs for them properly * align coroutines version to 1.9.0 for system tests * fix(otel): use mergeServiceFiles path instead of include for Shadow 9.x Shadow 9.x's ServiceFileTransformer strips the `inst/` prefix when using `include("inst/META-INF/services/*")`, placing merged service files under `META-INF/services/` instead of `inst/META-INF/services/`. This breaks the OTel agent's classloader which expects isolated services under `inst/`. Using `path = "inst/META-INF/services"` preserves the correct output path. Also add missing `duplicatesStrategy = DuplicatesStrategy.INCLUDE` to console-otlp, log4j2, and console-opentelemetry-noagent shadow JARs so that mergeServiceFiles and Log4j2 transformers can see duplicates before they are deduplicated. Co-Authored-By: Claude Opus 4.6 (1M context) * fix(otel): add default mergeServiceFiles for bootstrap service relocation Shadow 9.x only applies package relocations to service files that are claimed by a ServiceFileTransformer. The ContextStorageProvider service file at META-INF/services/ was not being relocated because it wasn't handled by any transformer — only the inst/META-INF/services/ files were. Adding a default mergeServiceFiles() call ensures bootstrap service files (like ContextStorageProvider) go through the transformer and get properly relocated to their shaded paths. Co-Authored-By: Claude Opus 4.6 (1M context) * fix(spring-boot2): pre-merge Spring metadata for Shadow 9.x compatibility Shadow 9.x enforces DuplicatesStrategy before transformers run, which breaks the `append` transformer for spring.factories and other Spring metadata files. Only the last copy survives instead of being concatenated. Replace `append` calls with a pre-merge task that manually concatenates Spring metadata files (spring.factories, spring.handlers, spring.schemas, spring-autoconfigure-metadata.properties) from the runtime classpath before the shadow JAR is built. The merged files are included first in the shadow JAR so they take precedence over duplicates from dependency JARs. This fixes the PersonSystemTest failure where @SentrySpan AOP and JDBC instrumentation weren't working because SentryAutoConfiguration wasn't properly registered in the merged spring.factories. Co-Authored-By: Claude Opus 4.6 (1M context) * Format code * fix(lint): suppress OldTargetApi for uitest-android module Lint 8.13.1 (set via android.experimental.lint.version) expects targetSdk 37 but we target 36. This is a test-only module so suppressing is safe. Co-Authored-By: Claude Opus 4.6 (1M context) * fix(spring-boot2): make mergeSpringMetadata configuration-cache compatible Resolve the runtime classpath at configuration time (not inside doLast) so the task doesn't capture Gradle script object references that can't be serialized by the configuration cache. Co-Authored-By: Claude Opus 4.6 (1M context) * formatting * fix(spring-boot2): replace from() with doLast JAR patching for spring metadata The from() approach with DuplicatesStrategy.INCLUDE doesn't work because dependency JARs' spring.factories overwrites the pre-merged version. Instead, let the shadow JAR build normally, then use a doLast action to replace the Spring metadata files in the built JAR with the properly merged versions using the NIO ZIP filesystem API. Co-Authored-By: Claude Opus 4.6 (1M context) * formatting * fix(spring-boot2): merge AutoConfiguration.imports + doLast JAR patching The shadow JAR was missing the embedded web server auto-configuration because AutoConfiguration.imports (used by SB 2.7+) had duplicate entries from multiple dependency JARs, with only the last copy surviving. Add AutoConfiguration.imports to the pre-merge file list and use doLast JAR patching via NIO ZIP filesystem to replace metadata files after the shadow JAR is built, avoiding the DuplicatesStrategy issue entirely. Also suppress OldTargetApi lint for uitest-android-benchmark module. Co-Authored-By: Claude Opus 4.6 (1M context) * fix(spring-boot2): also merge ManagementContextConfiguration.imports This file has duplicate entries across actuator JARs and needs the same pre-merge treatment as AutoConfiguration.imports. Co-Authored-By: Claude Opus 4.6 (1M context) * formatting * fix(spring-boot2): use separate patchSpringMetadata task for JAR patching The doLast on shadowJar doesn't run when the task is cached/up-to-date. Move JAR patching to a separate `patchSpringMetadata` task that is finalized by shadowJar, ensuring it always runs. Also use recursive walkTopDown to handle nested directories (e.g. META-INF/spring/). Co-Authored-By: Claude Opus 4.6 (1M context) * formatting * fix(spring-boot2): revert to doLast on shadowJar for Spring metadata patching The separate patchSpringMetadata task approach caused regressions — the finalizedBy relationship didn't reliably execute the patching in CI. Revert to doLast directly on shadowJar with outputs.upToDateWhen { false } to ensure the patching always runs. Also use walkTopDown for recursive directory traversal (needed for META-INF/spring/ subdirectory). Co-Authored-By: Claude Opus 4.6 (1M context) * formatting * fix(spring-boot2): inline Spring metadata merge into shadowJar doLast Replace the separate mergeSpringMetadata task with inline doLast on shadowJar that resolves runtimeClasspath at execution time (not configuration time). This ensures all project dependency JARs are built before their spring.factories entries are read and merged. Verified locally: 20/21 system tests pass. Only PersonSystemTest 'create person works' fails due to @SentrySpan AOP limitation in shadow JARs. Co-Authored-By: Claude Opus 4.6 (1M context) * formatting * fix(build): make Spring sample shadowJar patching config-cache safe * fix(build): merge Spring metadata properties in shadow jars * fix(build): preserve escaped spring metadata keys * refactor(samples): drop no-op spring shadow service merging * test(android): Avoid ANR profiling integration test race Drive the ANR profiling state-machine test synchronously instead of starting the background polling thread. The previous version could read the queue-backed profile store while the polling thread was still appending stack traces, which made the release unit test flaky with NoSuchElementException in QueueFile iteration. Co-Authored-By: Codex * fix(test): Require actuator health for Spring readiness * ref(build): Share Spring metadata file list Move the Spring metadata entry list into MergeSpringMetadataAction so the Spring sample shadowJar tasks use one source of truth. Drop the temporary system-test-runner unit test and keep verification on the existing Spring Boot system test flow. Co-Authored-By: Codex * docs(build): Document Spring metadata merge action Explain that MergeSpringMetadataAction patches shadow JARs by merging Spring metadata with file-specific semantics and by preserving service-provider registrations from the runtime classpath. This keeps the intent of the build logic clear without changing behavior. Co-Authored-By: Codex * build(opentelemetry): Fail agent shadow duplicates by default Set the final agent shadowJar to fail on unexpected duplicate entries while still allowing service descriptors to merge in the bootstrap and inst paths. This keeps duplicate handling strict without breaking the service file transformers Shadow still relies on. Co-Authored-By: Claude --------- Co-authored-by: Sentry Github Bot Co-authored-by: Roman Zavarnitsyn Co-authored-by: Claude Opus 4.6 (1M context) Co-authored-by: Codex --- build.gradle.kts | 4 +- .../main/java/MergeSpringMetadataAction.kt | 292 +++++++++ gradle/libs.versions.toml | 4 +- .../core/anr/AnrProfilingIntegrationTest.kt | 2 +- .../build.gradle.kts | 2 + .../sentry-uitest-android/build.gradle.kts | 2 + .../build.gradle.kts | 14 +- .../build.gradle.kts | 5 + .../build.gradle.kts | 5 + .../sentry-samples-console/build.gradle.kts | 4 + .../sentry-samples-jul/build.gradle.kts | 4 + .../sentry-samples-log4j2/build.gradle.kts | 5 + .../sentry-samples-logback/build.gradle.kts | 4 + .../build.gradle.kts | 30 +- .../sentry-samples-spring-7/build.gradle.kts | 4 + .../build.gradle.kts | 4 + .../build.gradle.kts | 4 + .../build.gradle.kts | 4 + .../build.gradle.kts | 4 + .../build.gradle.kts | 4 + .../build.gradle.kts | 7 + .../build.gradle.kts | 7 + .../build.gradle.kts | 8 +- .../build.gradle.kts | 35 +- .../build.gradle.kts | 42 +- .../build.gradle.kts | 7 + .../build.gradle.kts | 34 +- .../build.gradle.kts | 37 +- .../build.gradle.kts | 7 + .../sentry-samples-spring/build.gradle.kts | 11 +- sentry-spring-boot-starter/build.gradle.kts | 4 +- sentry-spring-boot/build.gradle.kts | 6 +- sentry-spring/build.gradle.kts | 4 +- .../api/sentry-system-test-support.api | 619 ------------------ .../api/sentry-test-support.api | 75 --- test/system-test-runner.py | 15 +- 36 files changed, 586 insertions(+), 733 deletions(-) create mode 100644 buildSrc/src/main/java/MergeSpringMetadataAction.kt delete mode 100644 sentry-system-test-support/api/sentry-system-test-support.api delete mode 100644 sentry-test-support/api/sentry-test-support.api diff --git a/build.gradle.kts b/build.gradle.kts index bfa4aef86f3..6656e00e49a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -87,7 +87,9 @@ apiValidation { "test-app-sentry", "test-app-size", "sentry-samples-netflix-dgs", - "sentry-samples-console-otlp" + "sentry-samples-console-otlp", + "sentry-test-support", + "sentry-system-test-support" ) ) } diff --git a/buildSrc/src/main/java/MergeSpringMetadataAction.kt b/buildSrc/src/main/java/MergeSpringMetadataAction.kt new file mode 100644 index 00000000000..2df744924cb --- /dev/null +++ b/buildSrc/src/main/java/MergeSpringMetadataAction.kt @@ -0,0 +1,292 @@ +import java.net.URI +import java.nio.file.FileSystems +import java.nio.file.Files +import java.util.LinkedHashSet +import java.util.zip.ZipFile +import org.gradle.api.Action +import org.gradle.api.Task +import org.gradle.api.file.FileCollection +import org.gradle.api.tasks.bundling.AbstractArchiveTask + +/** + * Patches a built shadow JAR by merging Spring metadata and service descriptor files from the + * runtime classpath into the final archive. + * + * Spring metadata files do not all share the same merge semantics, so this action merges + * `spring.factories` as list properties, `.imports` files as line-based metadata, and other Spring + * metadata as key/value properties. It also deduplicates service-provider configuration entries + * under `META-INF/services` so the flat executable JAR keeps the runtime registrations it needs. + */ +class MergeSpringMetadataAction( + private val runtimeClasspath: FileCollection, + private val springMetadataFiles: List, +) : Action { + companion object { + val DEFAULT_SPRING_METADATA_FILES = + listOf( + "META-INF/spring.factories", + "META-INF/spring.handlers", + "META-INF/spring.schemas", + "META-INF/spring-autoconfigure-metadata.properties", + "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports", + "META-INF/spring/org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration.imports", + ) + } + + override fun execute(task: Task) { + val archiveTask = task as AbstractArchiveTask + val jar = archiveTask.archiveFile.get().asFile + val runtimeJars = runtimeClasspath.files.filter { it.name.endsWith(".jar") } + val uri = URI.create("jar:${jar.toURI()}") + + FileSystems.newFileSystem(uri, mapOf("create" to "false")).use { fs -> + springMetadataFiles.forEach { entryPath -> + val target = fs.getPath(entryPath) + val contents = mutableListOf() + + if (Files.exists(target)) { + contents.add(Files.readString(target)) + } + + runtimeJars.forEach { depJar -> + try { + ZipFile(depJar).use { zip -> + val entry = zip.getEntry(entryPath) + if (entry != null) { + contents.add(zip.getInputStream(entry).bufferedReader().readText()) + } + } + } catch (_: Exception) { + // Ignore non-zip files on the runtime classpath. + } + } + + val merged = + when { + entryPath == "META-INF/spring.factories" -> mergeListProperties(contents) + entryPath.endsWith(".imports") -> mergeLineBasedMetadata(contents) + else -> mergeMapProperties(contents) + } + + if (merged.isNotEmpty()) { + if (target.parent != null) { + Files.createDirectories(target.parent) + } + Files.write(target, merged.toByteArray()) + } + } + + val serviceEntries = linkedSetOf() + + runtimeJars.forEach { depJar -> + try { + ZipFile(depJar).use { zip -> + val entries = zip.entries() + while (entries.hasMoreElements()) { + val entry = entries.nextElement() + if (!entry.isDirectory && entry.name.startsWith("META-INF/services/")) { + serviceEntries.add(entry.name) + } + } + } + } catch (_: Exception) { + // Ignore non-zip files on the runtime classpath. + } + } + + serviceEntries.forEach { entryPath -> + val providers = LinkedHashSet() + val target = fs.getPath(entryPath) + + if (Files.exists(target)) { + Files.newBufferedReader(target).useLines { lines -> + lines.forEach { line -> + val provider = line.trim() + if (provider.isNotEmpty() && !provider.startsWith("#")) { + providers.add(provider) + } + } + } + } + + runtimeJars.forEach { depJar -> + try { + ZipFile(depJar).use { zip -> + val entry = zip.getEntry(entryPath) + if (entry != null) { + zip.getInputStream(entry).bufferedReader().useLines { lines -> + lines.forEach { line -> + val provider = line.trim() + if (provider.isNotEmpty() && !provider.startsWith("#")) { + providers.add(provider) + } + } + } + } + } + } catch (_: Exception) { + // Ignore non-zip files on the runtime classpath. + } + } + + if (providers.isNotEmpty()) { + if (target.parent != null) { + Files.createDirectories(target.parent) + } + Files.write(target, providers.joinToString(separator = "\n", postfix = "\n").toByteArray()) + } + } + } + } + + private fun mergeLineBasedMetadata(contents: List): String { + val lines = LinkedHashSet() + + contents.forEach { content -> + content.lineSequence().forEach { rawLine -> + val line = rawLine.trim() + if (line.isNotEmpty() && !line.startsWith("#")) { + lines.add(line) + } + } + } + + return if (lines.isEmpty()) "" else lines.joinToString(separator = "\n", postfix = "\n") + } + + private fun mergeMapProperties(contents: List): String { + val merged = linkedMapOf() + + contents.forEach { content -> + parseProperties(content).forEach { (key, value) -> + merged[key] = value + } + } + + return if (merged.isEmpty()) { + "" + } else { + merged.entries.joinToString(separator = "\n", postfix = "\n") { (key, value) -> "$key=$value" } + } + } + + private fun mergeListProperties(contents: List): String { + val merged = linkedMapOf>() + + contents.forEach { content -> + parseProperties(content).forEach { (key, value) -> + val values = merged.getOrPut(key) { LinkedHashSet() } + value + .split(',') + .map(String::trim) + .filter(String::isNotEmpty) + .forEach(values::add) + } + } + + return if (merged.isEmpty()) { + "" + } else { + merged.entries.joinToString(separator = "\n", postfix = "\n") { (key, values) -> + "$key=${values.joinToString(separator = ",")}" + } + } + } + + private fun parseProperties(content: String): List> { + val logicalLines = mutableListOf() + val current = StringBuilder() + + content.lineSequence().forEach { rawLine -> + val line = rawLine.trim() + if (current.isEmpty() && (line.isEmpty() || line.startsWith("#") || line.startsWith("!"))) { + return@forEach + } + + val normalized = if (current.isEmpty()) line else line.trimStart() + current.append( + if (endsWithContinuation(rawLine)) normalized.dropLast(1) else normalized, + ) + + if (!endsWithContinuation(rawLine)) { + logicalLines.add(current.toString()) + current.setLength(0) + } + } + + if (current.isNotEmpty()) { + logicalLines.add(current.toString()) + } + + return logicalLines.map { line -> + val separatorIndex = findSeparatorIndex(line) + if (separatorIndex < 0) { + line to "" + } else { + val keyEnd = trimTrailingWhitespace(line, separatorIndex) + val valueStart = findValueStart(line, separatorIndex) + line.substring(0, keyEnd) to line.substring(valueStart).trim() + } + } + } + + private fun endsWithContinuation(line: String): Boolean { + var backslashCount = 0 + + for (index in line.length - 1 downTo 0) { + if (line[index] == '\\') { + backslashCount++ + } else { + break + } + } + + return backslashCount % 2 == 1 + } + + private fun findSeparatorIndex(line: String): Int { + var backslashCount = 0 + + line.forEachIndexed { index, char -> + if (char == '\\') { + backslashCount++ + } else { + val isEscaped = backslashCount % 2 == 1 + if (!isEscaped && (char == '=' || char == ':' || char.isWhitespace())) { + return index + } + backslashCount = 0 + } + } + + return -1 + } + + private fun trimTrailingWhitespace(line: String, endExclusive: Int): Int { + var end = endExclusive + + while (end > 0 && line[end - 1].isWhitespace()) { + end-- + } + + return end + } + + private fun findValueStart(line: String, separatorIndex: Int): Int { + var valueStart = separatorIndex + + while (valueStart < line.length && line[valueStart].isWhitespace()) { + valueStart++ + } + + if (valueStart < line.length && (line[valueStart] == '=' || line[valueStart] == ':')) { + valueStart++ + } + + while (valueStart < line.length && line[valueStart].isWhitespace()) { + valueStart++ + } + + return valueStart + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9eb39e5066e..6cc10910315 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -61,14 +61,13 @@ detekt = { id = "io.gitlab.arturbosch.detekt", version = "1.23.8" } jacoco-android = { id = "com.mxalbert.gradle.jacoco-android", version = "0.2.0" } kover = { id = "org.jetbrains.kotlinx.kover", version = "0.7.3" } vanniktech-maven-publish = { id = "com.vanniktech.maven.publish", version = "0.30.0" } -springboot2 = { id = "org.springframework.boot", version.ref = "springboot2" } springboot3 = { id = "org.springframework.boot", version.ref = "springboot3" } springboot4 = { id = "org.springframework.boot", version.ref = "springboot4" } spring-dependency-management = { id = "io.spring.dependency-management", version = "1.1.7" } gretty = { id = "org.gretty", version = "4.0.0" } animalsniffer = { id = "ru.vyarus.animalsniffer", version = "2.0.1" } sentry = { id = "io.sentry.android.gradle", version = "6.0.0-alpha.6"} -shadow = { id = "com.gradleup.shadow", version = "8.3.6" } +shadow = { id = "com.gradleup.shadow", version = "9.4.1" } [libraries] apache-httpclient = { module = "org.apache.httpcomponents.client5:httpclient5", version = "5.0.4" } @@ -159,6 +158,7 @@ slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } slf4j-jdk14 = { module = "org.slf4j:slf4j-jdk14", version.ref = "slf4j" } slf4j2-api = { module = "org.slf4j:slf4j-api", version = "2.0.5" } spotlessLib = { module = "com.diffplug.spotless:com.diffplug.spotless.gradle.plugin", version.ref = "spotless"} +springboot2-bom = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "springboot2" } springboot-starter = { module = "org.springframework.boot:spring-boot-starter", version.ref = "springboot2" } springboot-starter-graphql = { module = "org.springframework.boot:spring-boot-starter-graphql", version.ref = "springboot2" } springboot-starter-quartz = { module = "org.springframework.boot:spring-boot-starter-quartz", version.ref = "springboot2" } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/anr/AnrProfilingIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/anr/AnrProfilingIntegrationTest.kt index c07bb4d71bb..2ae48fb3253 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/anr/AnrProfilingIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/anr/AnrProfilingIntegrationTest.kt @@ -174,7 +174,7 @@ class AnrProfilingIntegrationTest { val integration = AnrProfilingIntegration() integration.register(mockScopes, androidOptions) - integration.onForeground() + // Drive the state machine synchronously to avoid racing the background polling thread. SystemClock.setCurrentTimeMillis(1_000) integration.checkMainThread(mainThread) diff --git a/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts index e6480d8b37d..4b5993644ee 100644 --- a/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android-benchmark/build.gradle.kts @@ -81,6 +81,8 @@ android { lint { warningsAsErrors = true checkDependencies = true + // Suppress OldTargetApi: lint 8.13.1 expects API 37 but we target 36 + disable += "OldTargetApi" // We run a full lint analysis as build part in CI, so skip vital checks for assemble tasks. checkReleaseBuilds = false diff --git a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts index 0c32cbad941..a4d46405fb8 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts @@ -74,6 +74,8 @@ android { lint { warningsAsErrors = true checkDependencies = true + // Suppress OldTargetApi: lint 8.13.1 expects API 37 but we target 36 + disable += "OldTargetApi" // We run a full lint analysis as build part in CI, so skip vital checks for assemble tasks. checkReleaseBuilds = false diff --git a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts index 1a57766cc96..ef98d488bd1 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts +++ b/sentry-opentelemetry/sentry-opentelemetry-agent/build.gradle.kts @@ -152,7 +152,19 @@ tasks { duplicatesStrategy = DuplicatesStrategy.FAIL - mergeServiceFiles { include("inst/META-INF/services/*") } + filesMatching("META-INF/services/**") { duplicatesStrategy = DuplicatesStrategy.INCLUDE } + filesMatching("inst/META-INF/services/**") { duplicatesStrategy = DuplicatesStrategy.INCLUDE } + + // Shadow 9.x only applies relocations to service files handled by a ServiceFileTransformer. + // We need two mergeServiceFiles calls: + // 1. Default path (META-INF/services) — ensures bootstrap service files get relocated + // (e.g., ContextStorageProvider → shaded path). Without this, Shadow 9.x skips + // relocation for service file names/contents not claimed by a transformer. + // 2. inst/ path — merges isolated agent service files from both the upstream agent + // and the distro libs. Uses `path` instead of `include` filter because Shadow 9.x's + // include() strips the `inst/` prefix on output. + mergeServiceFiles() + mergeServiceFiles { path = "inst/META-INF/services" } exclude("**/module-info.class") relocatePackages(this) diff --git a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts index dfab063591b..f5d14dc2c38 100644 --- a/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-opentelemetry-noagent/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { tasks.shadowJar { manifest { attributes["Main-Class"] = "io.sentry.samples.console.Main" } archiveClassifier.set("") // Remove the classifier so it replaces the regular JAR + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() } @@ -66,6 +67,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-console-otlp/build.gradle.kts b/sentry-samples/sentry-samples-console-otlp/build.gradle.kts index 08b9315f785..483f6bea799 100644 --- a/sentry-samples/sentry-samples-console-otlp/build.gradle.kts +++ b/sentry-samples/sentry-samples-console-otlp/build.gradle.kts @@ -51,6 +51,7 @@ dependencies { tasks.shadowJar { manifest { attributes["Main-Class"] = "io.sentry.samples.console.Main" } archiveClassifier.set("") // Remove the classifier so it replaces the regular JAR + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() } @@ -69,6 +70,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-console/build.gradle.kts b/sentry-samples/sentry-samples-console/build.gradle.kts index 6d0a4fc736b..c27196e96b8 100644 --- a/sentry-samples/sentry-samples-console/build.gradle.kts +++ b/sentry-samples/sentry-samples-console/build.gradle.kts @@ -69,6 +69,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-jul/build.gradle.kts b/sentry-samples/sentry-samples-jul/build.gradle.kts index ac1afa03d37..01e6a95f13d 100644 --- a/sentry-samples/sentry-samples-jul/build.gradle.kts +++ b/sentry-samples/sentry-samples-jul/build.gradle.kts @@ -62,6 +62,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-log4j2/build.gradle.kts b/sentry-samples/sentry-samples-log4j2/build.gradle.kts index 84e6bb6a0ab..005e1116528 100644 --- a/sentry-samples/sentry-samples-log4j2/build.gradle.kts +++ b/sentry-samples/sentry-samples-log4j2/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { tasks.shadowJar { manifest { attributes["Main-Class"] = "io.sentry.samples.log4j2.Main" } archiveClassifier.set("") // Remove the classifier so it replaces the regular JAR + duplicatesStrategy = DuplicatesStrategy.INCLUDE mergeServiceFiles() // Use Log4j2 cache transformer to properly handle plugin files transform( @@ -67,6 +68,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-logback/build.gradle.kts b/sentry-samples/sentry-samples-logback/build.gradle.kts index 5cd5a2eb85b..05f96c346a8 100644 --- a/sentry-samples/sentry-samples-logback/build.gradle.kts +++ b/sentry-samples/sentry-samples-logback/build.gradle.kts @@ -62,6 +62,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-netflix-dgs/build.gradle.kts b/sentry-samples/sentry-samples-netflix-dgs/build.gradle.kts index ade18a0cbc1..202b8d8f058 100644 --- a/sentry-samples/sentry-samples-netflix-dgs/build.gradle.kts +++ b/sentry-samples/sentry-samples-netflix-dgs/build.gradle.kts @@ -2,12 +2,15 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - alias(libs.plugins.springboot2) - alias(libs.plugins.spring.dependency.management) + java + application + alias(libs.plugins.shadow) alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) } +application { mainClass.set("io.sentry.samples.netflix.dgs.NetlixDgsApplication") } + group = "io.sentry.sample.spring-boot" version = "0.0.1-SNAPSHOT" @@ -19,6 +22,7 @@ java.targetCompatibility = JavaVersion.VERSION_1_8 repositories { mavenCentral() } dependencies { + implementation(platform(libs.springboot2.bom)) implementation(libs.springboot.starter.web) implementation(Config.Libs.kotlinReflect) implementation(kotlin(Config.kotlinStdLib, KotlinCompilerVersion.VERSION)) @@ -32,6 +36,28 @@ dependencies { } } +val runtimeClasspath = configurations.named("runtimeClasspath") + +// Configure the Shadow JAR (executable JAR with all dependencies) +tasks.shadowJar { + manifest { attributes["Main-Class"] = "io.sentry.samples.netflix.dgs.NetlixDgsApplication" } + archiveClassifier.set("") + + doLast( + MergeSpringMetadataAction( + runtimeClasspath.get(), + MergeSpringMetadataAction.DEFAULT_SPRING_METADATA_FILES, + ) + ) +} + +tasks.jar { + enabled = false + dependsOn(tasks.shadowJar) +} + +tasks.startScripts { dependsOn(tasks.shadowJar) } + tasks.withType().configureEach { useJUnitPlatform() } tasks.withType().configureEach { diff --git a/sentry-samples/sentry-samples-spring-7/build.gradle.kts b/sentry-samples/sentry-samples-spring-7/build.gradle.kts index a8f2dc4da7c..e3300cd2841 100644 --- a/sentry-samples/sentry-samples-spring-7/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-7/build.gradle.kts @@ -73,6 +73,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-4-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-4-opentelemetry-noagent/build.gradle.kts index 71ff985d67c..a7b2d939cdc 100644 --- a/sentry-samples/sentry-samples-spring-boot-4-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-4-opentelemetry-noagent/build.gradle.kts @@ -82,6 +82,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-4-opentelemetry/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-4-opentelemetry/build.gradle.kts index c3e8ba06fae..d43a628eb9a 100644 --- a/sentry-samples/sentry-samples-spring-boot-4-opentelemetry/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-4-opentelemetry/build.gradle.kts @@ -110,6 +110,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-4-otlp/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-4-otlp/build.gradle.kts index 01e07fc2526..7329d5cc0ea 100644 --- a/sentry-samples/sentry-samples-spring-boot-4-otlp/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-4-otlp/build.gradle.kts @@ -87,6 +87,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-4-webflux/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-4-webflux/build.gradle.kts index cdcf65711a8..a311b8a972e 100644 --- a/sentry-samples/sentry-samples-spring-boot-4-webflux/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-4-webflux/build.gradle.kts @@ -66,6 +66,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-4/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-4/build.gradle.kts index f43cc47cc6d..d96e5602483 100644 --- a/sentry-samples/sentry-samples-spring-boot-4/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-4/build.gradle.kts @@ -84,6 +84,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts index 86914467a6d..c7fc0106131 100644 --- a/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry-noagent/build.gradle.kts @@ -18,6 +18,9 @@ java.targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } +// Apollo 4.x requires coroutines 1.9.0+, override Spring Boot's managed version +extra["kotlin-coroutines.version"] = "1.9.0" + configure { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -80,6 +83,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/build.gradle.kts index 37d7a94eec0..767208a6082 100644 --- a/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-jakarta-opentelemetry/build.gradle.kts @@ -19,6 +19,9 @@ java.targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } +// Apollo 4.x requires coroutines 1.9.0+, override Spring Boot's managed version +extra["kotlin-coroutines.version"] = "1.9.0" + configure { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -114,6 +117,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-jakarta/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-jakarta/build.gradle.kts index a945b87109a..98f7ba434ff 100644 --- a/sentry-samples/sentry-samples-spring-boot-jakarta/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-jakarta/build.gradle.kts @@ -18,6 +18,9 @@ java.targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } +// Apollo 4.x requires coroutines 1.9.0+, override Spring Boot's managed version +extra["kotlin-coroutines.version"] = "1.9.0" + configure { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 @@ -69,7 +72,6 @@ dependencies { testImplementation(kotlin(Config.kotlinStdLib)) testImplementation(projects.sentry) testImplementation(projects.sentrySystemTestSupport) - testImplementation(libs.apollo3.kotlin) testImplementation(libs.kotlin.test.junit) testImplementation(libs.slf4j2.api) testImplementation(libs.springboot3.starter.test) { @@ -85,6 +87,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts index 07e61c75af8..d96c59ac871 100644 --- a/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-opentelemetry-noagent/build.gradle.kts @@ -2,12 +2,15 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - alias(libs.plugins.springboot2) - alias(libs.plugins.spring.dependency.management) + java + application + alias(libs.plugins.shadow) alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) } +application { mainClass.set("io.sentry.samples.spring.boot.SentryDemoApplication") } + group = "io.sentry.sample.spring-boot" version = "0.0.1-SNAPSHOT" @@ -35,6 +38,8 @@ tasks.withType().configureEach { } dependencies { + implementation(platform(libs.springboot2.bom)) + implementation(platform(libs.otel.instrumentation.bom)) implementation(libs.springboot.starter) implementation(libs.springboot.starter.actuator) implementation(libs.springboot.starter.aop) @@ -72,7 +77,27 @@ dependencies { testImplementation("org.apache.httpcomponents:httpclient") } -dependencyManagement { imports { mavenBom(libs.otel.instrumentation.bom.get().toString()) } } +val runtimeClasspath = configurations.named("runtimeClasspath") + +// Configure the Shadow JAR (executable JAR with all dependencies) +tasks.shadowJar { + manifest { attributes["Main-Class"] = "io.sentry.samples.spring.boot.SentryDemoApplication" } + archiveClassifier.set("") + + doLast( + MergeSpringMetadataAction( + runtimeClasspath.get(), + MergeSpringMetadataAction.DEFAULT_SPRING_METADATA_FILES, + ) + ) +} + +tasks.jar { + enabled = false + dependsOn(tasks.shadowJar) +} + +tasks.startScripts { dependsOn(tasks.shadowJar) } configure { test { java.srcDir("src/test/java") } } @@ -80,6 +105,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-opentelemetry/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-opentelemetry/build.gradle.kts index 21a3cf3f7d5..1a7f62f6e74 100644 --- a/sentry-samples/sentry-samples-spring-boot-opentelemetry/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-opentelemetry/build.gradle.kts @@ -1,14 +1,16 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.springframework.boot.gradle.tasks.run.BootRun plugins { - alias(libs.plugins.springboot2) - alias(libs.plugins.spring.dependency.management) + java + application + alias(libs.plugins.shadow) alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) } +application { mainClass.set("io.sentry.samples.spring.boot.SentryDemoApplication") } + group = "io.sentry.sample.spring-boot" version = "0.0.1-SNAPSHOT" @@ -33,6 +35,7 @@ tasks.withType().configureEach { } dependencies { + implementation(platform(libs.springboot2.bom)) implementation(libs.springboot.starter) implementation(libs.springboot.starter.actuator) implementation(libs.springboot.starter.aop) @@ -70,14 +73,35 @@ dependencies { testImplementation("org.apache.httpcomponents:httpclient") } +val runtimeClasspath = configurations.named("runtimeClasspath") + +// Configure the Shadow JAR (executable JAR with all dependencies) +tasks.shadowJar { + manifest { attributes["Main-Class"] = "io.sentry.samples.spring.boot.SentryDemoApplication" } + archiveClassifier.set("") + + doLast( + MergeSpringMetadataAction( + runtimeClasspath.get(), + MergeSpringMetadataAction.DEFAULT_SPRING_METADATA_FILES, + ) + ) +} + +tasks.jar { + enabled = false + dependsOn(tasks.shadowJar) +} + +tasks.startScripts { dependsOn(tasks.shadowJar) } + configure { test { java.srcDir("src/test/java") } } -tasks.register("bootRunWithAgent").configure { +tasks.register("bootRunWithAgent").configure { group = "application" - val mainBootRunTask = tasks.getByName("bootRun") - mainClass = mainBootRunTask.mainClass - classpath = mainBootRunTask.classpath + mainClass.set("io.sentry.samples.spring.boot.SentryDemoApplication") + classpath = sourceSets["main"].runtimeClasspath val versionName = project.properties["versionName"] as String val agentJarPath = @@ -101,6 +125,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-webflux-jakarta/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-webflux-jakarta/build.gradle.kts index a45249830f4..d5b04543576 100644 --- a/sentry-samples/sentry-samples-spring-boot-webflux-jakarta/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-webflux-jakarta/build.gradle.kts @@ -18,6 +18,9 @@ java.targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } +// Apollo 4.x requires coroutines 1.9.0+, override Spring Boot's managed version +extra["kotlin-coroutines.version"] = "1.9.0" + dependencies { implementation(Config.Libs.kotlinReflect) implementation(kotlin(Config.kotlinStdLib, KotlinCompilerVersion.VERSION)) @@ -60,6 +63,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot-webflux/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot-webflux/build.gradle.kts index 3c0a5f8c83e..b10b30737d8 100644 --- a/sentry-samples/sentry-samples-spring-boot-webflux/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot-webflux/build.gradle.kts @@ -2,12 +2,15 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - alias(libs.plugins.springboot2) - alias(libs.plugins.spring.dependency.management) + java + application + alias(libs.plugins.shadow) alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) } +application { mainClass.set("io.sentry.samples.spring.boot.SentryDemoApplication") } + group = "io.sentry.sample.spring-boot" version = "0.0.1-SNAPSHOT" @@ -19,6 +22,7 @@ java.targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } dependencies { + implementation(platform(libs.springboot2.bom)) implementation(libs.springboot.starter.actuator) implementation(libs.springboot.starter.graphql) implementation(libs.springboot.starter.webflux) @@ -42,6 +46,28 @@ dependencies { testImplementation("org.apache.httpcomponents:httpclient") } +val runtimeClasspath = configurations.named("runtimeClasspath") + +// Configure the Shadow JAR (executable JAR with all dependencies) +tasks.shadowJar { + manifest { attributes["Main-Class"] = "io.sentry.samples.spring.boot.SentryDemoApplication" } + archiveClassifier.set("") + + doLast( + MergeSpringMetadataAction( + runtimeClasspath.get(), + MergeSpringMetadataAction.DEFAULT_SPRING_METADATA_FILES, + ) + ) +} + +tasks.jar { + enabled = false + dependsOn(tasks.shadowJar) +} + +tasks.startScripts { dependsOn(tasks.shadowJar) } + configure { test { java.srcDir("src/test/java") } } tasks.withType().configureEach { @@ -55,6 +81,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-boot/build.gradle.kts b/sentry-samples/sentry-samples-spring-boot/build.gradle.kts index b6fcd675cf3..5b89ef568e4 100644 --- a/sentry-samples/sentry-samples-spring-boot/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-boot/build.gradle.kts @@ -2,12 +2,15 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - alias(libs.plugins.springboot2) - alias(libs.plugins.spring.dependency.management) + java + application + alias(libs.plugins.shadow) alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) } +application { mainClass.set("io.sentry.samples.spring.boot.SentryDemoApplication") } + group = "io.sentry.sample.spring-boot" version = "0.0.1-SNAPSHOT" @@ -31,6 +34,7 @@ tasks.withType().configureEach { } dependencies { + implementation(platform(libs.springboot2.bom)) implementation(libs.springboot.starter) implementation(libs.springboot.starter.actuator) implementation(libs.springboot.starter.aop) @@ -69,12 +73,41 @@ dependencies { testImplementation("org.apache.httpcomponents:httpclient") } +val runtimeClasspath = configurations.named("runtimeClasspath") + +// Configure the Shadow JAR (executable JAR with all dependencies) +tasks.shadowJar { + manifest { attributes["Main-Class"] = "io.sentry.samples.spring.boot.SentryDemoApplication" } + archiveClassifier.set("") + + // Shadow 9.x enforces DuplicatesStrategy before transformers run, so `append` + // only sees one copy of each file. We merge Spring metadata from the runtime + // classpath and patch the built JAR in doLast. + doLast( + MergeSpringMetadataAction( + runtimeClasspath.get(), + MergeSpringMetadataAction.DEFAULT_SPRING_METADATA_FILES, + ) + ) +} + +tasks.jar { + enabled = false + dependsOn(tasks.shadowJar) +} + +tasks.startScripts { dependsOn(tasks.shadowJar) } + configure { test { java.srcDir("src/test/java") } } tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring-jakarta/build.gradle.kts b/sentry-samples/sentry-samples-spring-jakarta/build.gradle.kts index 8e450865659..319431e71d2 100644 --- a/sentry-samples/sentry-samples-spring-jakarta/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring-jakarta/build.gradle.kts @@ -26,6 +26,9 @@ java.targetCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } +// Apollo 4.x requires coroutines 1.9.0+, override Spring Boot's managed version +extra["kotlin-coroutines.version"] = "1.9.0" + dependencyManagement { imports { mavenBom(SpringBootPlugin.BOM_COORDINATES) @@ -72,6 +75,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-samples/sentry-samples-spring/build.gradle.kts b/sentry-samples/sentry-samples-spring/build.gradle.kts index f6aa0e925ee..446baf3a696 100644 --- a/sentry-samples/sentry-samples-spring/build.gradle.kts +++ b/sentry-samples/sentry-samples-spring/build.gradle.kts @@ -1,9 +1,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES plugins { application - alias(libs.plugins.springboot2) apply false alias(libs.plugins.spring.dependency.management) alias(libs.plugins.kotlin.jvm) alias(libs.plugins.kotlin.spring) @@ -27,9 +25,12 @@ java { repositories { mavenCentral() } +// Apollo 4.x requires coroutines 1.9.0+, override Spring Boot's managed version +extra["kotlin-coroutines.version"] = "1.9.0" + dependencyManagement { imports { - mavenBom(BOM_COORDINATES) + mavenBom(libs.springboot2.bom.get().toString()) mavenBom(libs.kotlin.bom.get().toString()) mavenBom(libs.jackson.bom.get().toString()) } @@ -73,6 +74,10 @@ tasks.register("systemTest").configure { group = "verification" description = "Runs the System tests" + val test = project.extensions.getByType()["test"] + testClassesDirs = test.output.classesDirs + classpath = test.runtimeClasspath + outputs.upToDateWhen { false } maxParallelForks = 1 diff --git a/sentry-spring-boot-starter/build.gradle.kts b/sentry-spring-boot-starter/build.gradle.kts index a8b22a50f09..6b5bcdf5752 100644 --- a/sentry-spring-boot-starter/build.gradle.kts +++ b/sentry-spring-boot-starter/build.gradle.kts @@ -1,6 +1,5 @@ import net.ltgt.gradle.errorprone.errorprone import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.springframework.boot.gradle.plugin.SpringBootPlugin plugins { `java-library` @@ -9,7 +8,6 @@ plugins { jacoco alias(libs.plugins.errorprone) alias(libs.plugins.gradle.versions) - alias(libs.plugins.springboot2) apply false } tasks.withType().configureEach { @@ -22,7 +20,7 @@ dependencies { api(projects.sentrySpringBoot) api(libs.springboot.starter) - annotationProcessor(platform(SpringBootPlugin.BOM_COORDINATES)) + annotationProcessor(platform(libs.springboot2.bom)) annotationProcessor(Config.AnnotationProcessors.springBootAutoConfigure) annotationProcessor(Config.AnnotationProcessors.springBootConfiguration) diff --git a/sentry-spring-boot/build.gradle.kts b/sentry-spring-boot/build.gradle.kts index a81613e5e1e..43150869db5 100644 --- a/sentry-spring-boot/build.gradle.kts +++ b/sentry-spring-boot/build.gradle.kts @@ -1,6 +1,5 @@ import net.ltgt.gradle.errorprone.errorprone import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.springframework.boot.gradle.plugin.SpringBootPlugin plugins { `java-library` @@ -10,7 +9,6 @@ plugins { alias(libs.plugins.errorprone) alias(libs.plugins.gradle.versions) alias(libs.plugins.buildconfig) - alias(libs.plugins.springboot2) apply false } tasks.withType().configureEach { @@ -40,14 +38,14 @@ dependencies { compileOnly(libs.springboot.starter.graphql) compileOnly(libs.springboot.starter.quartz) compileOnly(libs.springboot.starter.security) - compileOnly(platform(SpringBootPlugin.BOM_COORDINATES)) + compileOnly(platform(libs.springboot2.bom)) compileOnly(Config.Libs.springWeb) compileOnly(Config.Libs.springWebflux) compileOnly(projects.sentryOpentelemetry.sentryOpentelemetryCore) compileOnly(projects.sentryGraphql) compileOnly(projects.sentryQuartz) - annotationProcessor(platform(SpringBootPlugin.BOM_COORDINATES)) + annotationProcessor(platform(libs.springboot2.bom)) annotationProcessor(Config.AnnotationProcessors.springBootAutoConfigure) annotationProcessor(Config.AnnotationProcessors.springBootConfiguration) diff --git a/sentry-spring/build.gradle.kts b/sentry-spring/build.gradle.kts index 57c0b9d9f31..b651a9e62b2 100644 --- a/sentry-spring/build.gradle.kts +++ b/sentry-spring/build.gradle.kts @@ -1,6 +1,5 @@ import net.ltgt.gradle.errorprone.errorprone import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.springframework.boot.gradle.plugin.SpringBootPlugin plugins { `java-library` @@ -10,7 +9,6 @@ plugins { alias(libs.plugins.errorprone) alias(libs.plugins.gradle.versions) alias(libs.plugins.buildconfig) - alias(libs.plugins.springboot2) apply false } tasks.withType().configureEach { @@ -22,7 +20,7 @@ tasks.withType().configureEach { dependencies { api(projects.sentry) - compileOnly(platform(SpringBootPlugin.BOM_COORDINATES)) + compileOnly(platform(libs.springboot2.bom)) compileOnly(Config.Libs.springWeb) compileOnly(Config.Libs.springAop) compileOnly(Config.Libs.springSecurityWeb) diff --git a/sentry-system-test-support/api/sentry-system-test-support.api b/sentry-system-test-support/api/sentry-system-test-support.api deleted file mode 100644 index 83a9f288d0c..00000000000 --- a/sentry-system-test-support/api/sentry-system-test-support.api +++ /dev/null @@ -1,619 +0,0 @@ -public final class io/sentry/samples/graphql/AddProjectMutation : com/apollographql/apollo3/api/Mutation { - public static final field Companion Lio/sentry/samples/graphql/AddProjectMutation$Companion; - public static final field OPERATION_ID Ljava/lang/String; - public static final field OPERATION_NAME Ljava/lang/String; - public fun (Ljava/lang/String;)V - public fun adapter ()Lcom/apollographql/apollo3/api/Adapter; - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/sentry/samples/graphql/AddProjectMutation; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/AddProjectMutation;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/AddProjectMutation; - public fun document ()Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public final fun getSlug ()Ljava/lang/String; - public fun hashCode ()I - public fun id ()Ljava/lang/String; - public fun name ()Ljava/lang/String; - public fun rootField ()Lcom/apollographql/apollo3/api/CompiledField; - public fun serializeVariables (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)V - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/AddProjectMutation$Companion { - public final fun getOPERATION_DOCUMENT ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/AddProjectMutation$Data : com/apollographql/apollo3/api/Mutation$Data { - public fun (Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/sentry/samples/graphql/AddProjectMutation$Data; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/AddProjectMutation$Data;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/AddProjectMutation$Data; - public fun equals (Ljava/lang/Object;)Z - public final fun getAddProject ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/GreetingQuery : com/apollographql/apollo3/api/Query { - public static final field Companion Lio/sentry/samples/graphql/GreetingQuery$Companion; - public static final field OPERATION_ID Ljava/lang/String; - public static final field OPERATION_NAME Ljava/lang/String; - public fun (Ljava/lang/String;)V - public fun adapter ()Lcom/apollographql/apollo3/api/Adapter; - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/sentry/samples/graphql/GreetingQuery; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/GreetingQuery;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/GreetingQuery; - public fun document ()Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public final fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun id ()Ljava/lang/String; - public fun name ()Ljava/lang/String; - public fun rootField ()Lcom/apollographql/apollo3/api/CompiledField; - public fun serializeVariables (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)V - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/GreetingQuery$Companion { - public final fun getOPERATION_DOCUMENT ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/GreetingQuery$Data : com/apollographql/apollo3/api/Query$Data { - public fun (Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/sentry/samples/graphql/GreetingQuery$Data; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/GreetingQuery$Data;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/GreetingQuery$Data; - public fun equals (Ljava/lang/Object;)Z - public final fun getGreeting ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/ProjectQuery : com/apollographql/apollo3/api/Query { - public static final field Companion Lio/sentry/samples/graphql/ProjectQuery$Companion; - public static final field OPERATION_ID Ljava/lang/String; - public static final field OPERATION_NAME Ljava/lang/String; - public fun (Ljava/lang/String;)V - public fun adapter ()Lcom/apollographql/apollo3/api/Adapter; - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/sentry/samples/graphql/ProjectQuery; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/ProjectQuery;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/ProjectQuery; - public fun document ()Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public final fun getSlug ()Ljava/lang/String; - public fun hashCode ()I - public fun id ()Ljava/lang/String; - public fun name ()Ljava/lang/String; - public fun rootField ()Lcom/apollographql/apollo3/api/CompiledField; - public fun serializeVariables (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)V - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/ProjectQuery$Companion { - public final fun getOPERATION_DOCUMENT ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/ProjectQuery$Data : com/apollographql/apollo3/api/Query$Data { - public fun (Lio/sentry/samples/graphql/ProjectQuery$Project;)V - public final fun component1 ()Lio/sentry/samples/graphql/ProjectQuery$Project; - public final fun copy (Lio/sentry/samples/graphql/ProjectQuery$Project;)Lio/sentry/samples/graphql/ProjectQuery$Data; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/ProjectQuery$Data;Lio/sentry/samples/graphql/ProjectQuery$Project;ILjava/lang/Object;)Lio/sentry/samples/graphql/ProjectQuery$Data; - public fun equals (Ljava/lang/Object;)Z - public final fun getProject ()Lio/sentry/samples/graphql/ProjectQuery$Project; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/ProjectQuery$Project { - public fun (Ljava/lang/String;Ljava/lang/String;Lio/sentry/samples/graphql/type/ProjectStatus;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Lio/sentry/samples/graphql/type/ProjectStatus; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Lio/sentry/samples/graphql/type/ProjectStatus;)Lio/sentry/samples/graphql/ProjectQuery$Project; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/ProjectQuery$Project;Ljava/lang/String;Ljava/lang/String;Lio/sentry/samples/graphql/type/ProjectStatus;ILjava/lang/Object;)Lio/sentry/samples/graphql/ProjectQuery$Project; - public fun equals (Ljava/lang/Object;)Z - public final fun getName ()Ljava/lang/String; - public final fun getSlug ()Ljava/lang/String; - public final fun getStatus ()Lio/sentry/samples/graphql/type/ProjectStatus; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/TasksAndAssigneesQuery : com/apollographql/apollo3/api/Query { - public static final field Companion Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Companion; - public static final field OPERATION_ID Ljava/lang/String; - public static final field OPERATION_NAME Ljava/lang/String; - public fun (Ljava/lang/String;)V - public fun adapter ()Lcom/apollographql/apollo3/api/Adapter; - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/TasksAndAssigneesQuery;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery; - public fun document ()Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public final fun getSlug ()Ljava/lang/String; - public fun hashCode ()I - public fun id ()Ljava/lang/String; - public fun name ()Ljava/lang/String; - public fun rootField ()Lcom/apollographql/apollo3/api/CompiledField; - public fun serializeVariables (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)V - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee { - public fun (Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee; - public fun equals (Ljava/lang/Object;)Z - public final fun getId ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/TasksAndAssigneesQuery$Companion { - public final fun getOPERATION_DOCUMENT ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/TasksAndAssigneesQuery$Creator { - public fun (Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator; - public fun equals (Ljava/lang/Object;)Z - public final fun getId ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/TasksAndAssigneesQuery$Data : com/apollographql/apollo3/api/Query$Data { - public fun (Ljava/util/List;)V - public final fun component1 ()Ljava/util/List; - public final fun copy (Ljava/util/List;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Data; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Data;Ljava/util/List;ILjava/lang/Object;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Data; - public fun equals (Ljava/lang/Object;)Z - public final fun getTasks ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/TasksAndAssigneesQuery$Task { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee;Ljava/lang/String;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee;Ljava/lang/String;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Task; - public static synthetic fun copy$default (Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Task;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee;Ljava/lang/String;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator;ILjava/lang/Object;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Task; - public fun equals (Ljava/lang/Object;)Z - public final fun getAssignee ()Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee; - public final fun getAssigneeId ()Ljava/lang/String; - public final fun getCreator ()Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator; - public final fun getCreatorId ()Ljava/lang/String; - public final fun getId ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/samples/graphql/adapter/AddProjectMutation_ResponseAdapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/AddProjectMutation_ResponseAdapter; -} - -public final class io/sentry/samples/graphql/adapter/AddProjectMutation_ResponseAdapter$Data : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/AddProjectMutation_ResponseAdapter$Data; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/AddProjectMutation$Data; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/AddProjectMutation$Data;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/AddProjectMutation_VariablesAdapter : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/AddProjectMutation_VariablesAdapter; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/AddProjectMutation; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/AddProjectMutation;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/GreetingQuery_ResponseAdapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/GreetingQuery_ResponseAdapter; -} - -public final class io/sentry/samples/graphql/adapter/GreetingQuery_ResponseAdapter$Data : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/GreetingQuery_ResponseAdapter$Data; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/GreetingQuery$Data; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/GreetingQuery$Data;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/GreetingQuery_VariablesAdapter : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/GreetingQuery_VariablesAdapter; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/GreetingQuery; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/GreetingQuery;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/ProjectQuery_ResponseAdapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/ProjectQuery_ResponseAdapter; -} - -public final class io/sentry/samples/graphql/adapter/ProjectQuery_ResponseAdapter$Data : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/ProjectQuery_ResponseAdapter$Data; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/ProjectQuery$Data; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/ProjectQuery$Data;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/ProjectQuery_ResponseAdapter$Project : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/ProjectQuery_ResponseAdapter$Project; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/ProjectQuery$Project; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/ProjectQuery$Project;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/ProjectQuery_VariablesAdapter : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/ProjectQuery_VariablesAdapter; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/ProjectQuery; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/ProjectQuery;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter; -} - -public final class io/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Assignee : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Assignee; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Assignee;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Creator : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Creator; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Creator;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Data : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Data; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Data; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Data;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Task : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_ResponseAdapter$Task; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Task; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public final fun getRESPONSE_NAMES ()Ljava/util/List; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/TasksAndAssigneesQuery$Task;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_VariablesAdapter : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/adapter/TasksAndAssigneesQuery_VariablesAdapter; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/TasksAndAssigneesQuery; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/TasksAndAssigneesQuery;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/samples/graphql/selections/AddProjectMutationSelections { - public static final field INSTANCE Lio/sentry/samples/graphql/selections/AddProjectMutationSelections; - public final fun get__root ()Ljava/util/List; -} - -public final class io/sentry/samples/graphql/selections/GreetingQuerySelections { - public static final field INSTANCE Lio/sentry/samples/graphql/selections/GreetingQuerySelections; - public final fun get__root ()Ljava/util/List; -} - -public final class io/sentry/samples/graphql/selections/ProjectQuerySelections { - public static final field INSTANCE Lio/sentry/samples/graphql/selections/ProjectQuerySelections; - public final fun get__root ()Ljava/util/List; -} - -public final class io/sentry/samples/graphql/selections/TasksAndAssigneesQuerySelections { - public static final field INSTANCE Lio/sentry/samples/graphql/selections/TasksAndAssigneesQuerySelections; - public final fun get__root ()Ljava/util/List; -} - -public final class io/sentry/samples/graphql/type/Assignee { - public static final field Companion Lio/sentry/samples/graphql/type/Assignee$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/Assignee$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/ObjectType; -} - -public final class io/sentry/samples/graphql/type/Creator { - public static final field Companion Lio/sentry/samples/graphql/type/Creator$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/Creator$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/ObjectType; -} - -public final class io/sentry/samples/graphql/type/GraphQLBoolean { - public static final field Companion Lio/sentry/samples/graphql/type/GraphQLBoolean$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/GraphQLBoolean$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/CustomScalarType; -} - -public final class io/sentry/samples/graphql/type/GraphQLFloat { - public static final field Companion Lio/sentry/samples/graphql/type/GraphQLFloat$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/GraphQLFloat$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/CustomScalarType; -} - -public final class io/sentry/samples/graphql/type/GraphQLID { - public static final field Companion Lio/sentry/samples/graphql/type/GraphQLID$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/GraphQLID$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/CustomScalarType; -} - -public final class io/sentry/samples/graphql/type/GraphQLInt { - public static final field Companion Lio/sentry/samples/graphql/type/GraphQLInt$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/GraphQLInt$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/CustomScalarType; -} - -public final class io/sentry/samples/graphql/type/GraphQLString { - public static final field Companion Lio/sentry/samples/graphql/type/GraphQLString$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/GraphQLString$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/CustomScalarType; -} - -public final class io/sentry/samples/graphql/type/Mutation { - public static final field Companion Lio/sentry/samples/graphql/type/Mutation$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/Mutation$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/ObjectType; -} - -public final class io/sentry/samples/graphql/type/Project { - public static final field Companion Lio/sentry/samples/graphql/type/Project$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/Project$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/ObjectType; -} - -public final class io/sentry/samples/graphql/type/ProjectStatus : java/lang/Enum { - public static final field ACTIVE Lio/sentry/samples/graphql/type/ProjectStatus; - public static final field ATTIC Lio/sentry/samples/graphql/type/ProjectStatus; - public static final field COMMUNITY Lio/sentry/samples/graphql/type/ProjectStatus; - public static final field Companion Lio/sentry/samples/graphql/type/ProjectStatus$Companion; - public static final field EOL Lio/sentry/samples/graphql/type/ProjectStatus; - public static final field INCUBATING Lio/sentry/samples/graphql/type/ProjectStatus; - public static final field UNKNOWN__ Lio/sentry/samples/graphql/type/ProjectStatus; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getRawValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lio/sentry/samples/graphql/type/ProjectStatus; - public static fun values ()[Lio/sentry/samples/graphql/type/ProjectStatus; -} - -public final class io/sentry/samples/graphql/type/ProjectStatus$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/EnumType; - public final fun knownValues ()[Lio/sentry/samples/graphql/type/ProjectStatus; - public final fun safeValueOf (Ljava/lang/String;)Lio/sentry/samples/graphql/type/ProjectStatus; -} - -public final class io/sentry/samples/graphql/type/Query { - public static final field Companion Lio/sentry/samples/graphql/type/Query$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/Query$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/ObjectType; -} - -public final class io/sentry/samples/graphql/type/Task { - public static final field Companion Lio/sentry/samples/graphql/type/Task$Companion; - public fun ()V -} - -public final class io/sentry/samples/graphql/type/Task$Companion { - public final fun getType ()Lcom/apollographql/apollo3/api/ObjectType; -} - -public final class io/sentry/samples/graphql/type/adapter/ProjectStatus_ResponseAdapter : com/apollographql/apollo3/api/Adapter { - public static final field INSTANCE Lio/sentry/samples/graphql/type/adapter/ProjectStatus_ResponseAdapter; - public fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Lio/sentry/samples/graphql/type/ProjectStatus; - public synthetic fun fromJson (Lcom/apollographql/apollo3/api/json/JsonReader;Lcom/apollographql/apollo3/api/CustomScalarAdapters;)Ljava/lang/Object; - public fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Lio/sentry/samples/graphql/type/ProjectStatus;)V - public synthetic fun toJson (Lcom/apollographql/apollo3/api/json/JsonWriter;Lcom/apollographql/apollo3/api/CustomScalarAdapters;Ljava/lang/Object;)V -} - -public final class io/sentry/systemtest/Person { - public fun (Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lio/sentry/systemtest/Person; - public static synthetic fun copy$default (Lio/sentry/systemtest/Person;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/sentry/systemtest/Person; - public fun equals (Ljava/lang/Object;)Z - public final fun getFirstName ()Ljava/lang/String; - public final fun getLastName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/systemtest/Todo { - public fun (JLjava/lang/String;Z)V - public final fun component1 ()J - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Z - public final fun copy (JLjava/lang/String;Z)Lio/sentry/systemtest/Todo; - public static synthetic fun copy$default (Lio/sentry/systemtest/Todo;JLjava/lang/String;ZILjava/lang/Object;)Lio/sentry/systemtest/Todo; - public fun equals (Ljava/lang/Object;)Z - public final fun getCompleted ()Z - public final fun getId ()J - public final fun getTitle ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/systemtest/graphql/GraphqlTestClient { - public fun (Ljava/lang/String;)V - public final fun addProject (Ljava/lang/String;)Lcom/apollographql/apollo3/api/ApolloResponse; - public final fun getApollo ()Lcom/apollographql/apollo3/ApolloClient; - public final fun greet (Ljava/lang/String;)Lcom/apollographql/apollo3/api/ApolloResponse; - public final fun project (Ljava/lang/String;)Lcom/apollographql/apollo3/api/ApolloResponse; - public final fun tasksAndAssignees (Ljava/lang/String;)Lcom/apollographql/apollo3/api/ApolloResponse; -} - -public final class io/sentry/systemtest/util/EnvelopeCounts { - public fun ()V - public final fun getEnvelopes ()Ljava/lang/Long; - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/systemtest/util/EnvelopesReceived { - public fun ()V - public final fun getEnvelopes ()Ljava/util/List; - public fun toString ()Ljava/lang/String; -} - -public final class io/sentry/systemtest/util/FeatureFlagResponse { - public fun (Ljava/lang/String;Z)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Z - public final fun copy (Ljava/lang/String;Z)Lio/sentry/systemtest/util/FeatureFlagResponse; - public static synthetic fun copy$default (Lio/sentry/systemtest/util/FeatureFlagResponse;Ljava/lang/String;ZILjava/lang/Object;)Lio/sentry/systemtest/util/FeatureFlagResponse; - public fun equals (Ljava/lang/Object;)Z - public final fun getFlagKey ()Ljava/lang/String; - public final fun getValue ()Z - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public class io/sentry/systemtest/util/LoggingInsecureRestClient { - public fun ()V - protected final fun call (Lokhttp3/Request$Builder;ZLjava/util/Map;)Lokhttp3/Response; - public static synthetic fun call$default (Lio/sentry/systemtest/util/LoggingInsecureRestClient;Lokhttp3/Request$Builder;ZLjava/util/Map;ILjava/lang/Object;)Lokhttp3/Response; - protected final fun client ()Lokhttp3/OkHttpClient; - public final fun getLastKnownStatusCode ()Ljava/lang/Integer; - public final fun getLogger ()Lorg/slf4j/Logger; - protected final fun objectMapper ()Lcom/fasterxml/jackson/databind/ObjectMapper; - public final fun setLastKnownStatusCode (Ljava/lang/Integer;)V - protected final fun toRequestBody (Ljava/lang/Object;)Lokhttp3/RequestBody; -} - -public final class io/sentry/systemtest/util/RestTestClient : io/sentry/systemtest/util/LoggingInsecureRestClient { - public fun (Ljava/lang/String;)V - public final fun checkFeatureFlag (Ljava/lang/String;)Lio/sentry/systemtest/util/FeatureFlagResponse; - public final fun createPerson (Lio/sentry/systemtest/Person;Ljava/util/Map;)Lio/sentry/systemtest/Person; - public static synthetic fun createPerson$default (Lio/sentry/systemtest/util/RestTestClient;Lio/sentry/systemtest/Person;Ljava/util/Map;ILjava/lang/Object;)Lio/sentry/systemtest/Person; - public final fun createPersonDistributedTracing (Lio/sentry/systemtest/Person;Ljava/util/Map;)Lio/sentry/systemtest/Person; - public static synthetic fun createPersonDistributedTracing$default (Lio/sentry/systemtest/util/RestTestClient;Lio/sentry/systemtest/Person;Ljava/util/Map;ILjava/lang/Object;)Lio/sentry/systemtest/Person; - public final fun deleteCachedTodo (J)V - public final fun errorWithFeatureFlag (Ljava/lang/String;)Ljava/lang/String; - public final fun getCachedTodo (J)Lio/sentry/systemtest/Todo; - public final fun getCountMetric ()Ljava/lang/String; - public final fun getDistributionMetric (J)Ljava/lang/String; - public final fun getGaugeMetric (J)Ljava/lang/String; - public final fun getPerson (J)Lio/sentry/systemtest/Person; - public final fun getPersonDistributedTracing (JLjava/util/Map;)Lio/sentry/systemtest/Person; - public static synthetic fun getPersonDistributedTracing$default (Lio/sentry/systemtest/util/RestTestClient;JLjava/util/Map;ILjava/lang/Object;)Lio/sentry/systemtest/Person; - public final fun getTodo (J)Lio/sentry/systemtest/Todo; - public final fun getTodoRestClient (J)Lio/sentry/systemtest/Todo; - public final fun getTodoWebclient (J)Lio/sentry/systemtest/Todo; - public final fun saveCachedTodo (Lio/sentry/systemtest/Todo;)Lio/sentry/systemtest/Todo; -} - -public final class io/sentry/systemtest/util/SentryMockServerClient : io/sentry/systemtest/util/LoggingInsecureRestClient { - public fun (Ljava/lang/String;)V - public final fun getEnvelopeCount ()Lio/sentry/systemtest/util/EnvelopeCounts; - public final fun getEnvelopes ()Lio/sentry/systemtest/util/EnvelopesReceived; - public final fun reset ()V -} - -public final class io/sentry/systemtest/util/TestHelper { - public fun (Ljava/lang/String;)V - public final fun doesContainLogWithBody (Lio/sentry/SentryLogEvents;Ljava/lang/String;)Z - public final fun doesContainMetric (Lio/sentry/SentryMetricsEvents;Ljava/lang/String;Ljava/lang/String;DLjava/lang/String;)Z - public static synthetic fun doesContainMetric$default (Lio/sentry/systemtest/util/TestHelper;Lio/sentry/SentryMetricsEvents;Ljava/lang/String;Ljava/lang/String;DLjava/lang/String;ILjava/lang/Object;)Z - public final fun doesEventHaveExceptionMessage (Lio/sentry/SentryEvent;Ljava/lang/String;)Z - public final fun doesEventHaveFlag (Lio/sentry/SentryEvent;Ljava/lang/String;Z)Z - public final fun doesLogWithBodyHaveAttribute (Lio/sentry/SentryLogEvents;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Z - public final fun doesMetricHaveAttribute (Lio/sentry/SentryMetricsEvents;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)Z - public final fun doesTransactionContainSpanWithDescription (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;)Z - public final fun doesTransactionContainSpanWithOp (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;)Z - public final fun doesTransactionContainSpanWithOpAndDescription (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;Ljava/lang/String;)Z - public final fun doesTransactionHave (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;Lio/sentry/protocol/FeatureFlag;)Z - public static synthetic fun doesTransactionHave$default (Lio/sentry/systemtest/util/TestHelper;Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;Lio/sentry/protocol/FeatureFlag;ILjava/lang/Object;)Z - public final fun doesTransactionHaveOp (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;)Z - public final fun doesTransactionHaveSpanWith (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;Lio/sentry/protocol/FeatureFlag;Z)Z - public static synthetic fun doesTransactionHaveSpanWith$default (Lio/sentry/systemtest/util/TestHelper;Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;Lio/sentry/protocol/FeatureFlag;ZILjava/lang/Object;)Z - public final fun doesTransactionHaveTraceId (Lio/sentry/protocol/SentryTransaction;Ljava/lang/String;)Z - public final fun ensureEnvelopeCountIncreased ()V - public final fun ensureEnvelopeReceived (ILkotlin/jvm/functions/Function1;)V - public static synthetic fun ensureEnvelopeReceived$default (Lio/sentry/systemtest/util/TestHelper;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun ensureErrorCount (Lcom/apollographql/apollo3/api/ApolloResponse;I)V - public final fun ensureErrorReceived (Lkotlin/jvm/functions/Function1;)V - public final fun ensureLogsReceived (Lkotlin/jvm/functions/Function2;)V - public final fun ensureMetricsReceived (Lkotlin/jvm/functions/Function2;)V - public final fun ensureNoEnvelopeReceived (Lkotlin/jvm/functions/Function1;)V - public final fun ensureNoErrors (Lcom/apollographql/apollo3/api/ApolloResponse;)V - public final fun ensureNoTransactionReceived (Lkotlin/jvm/functions/Function2;)V - public final fun ensureProfileChunkReceived (Lkotlin/jvm/functions/Function2;)V - public final fun ensureTransactionReceived (Lkotlin/jvm/functions/Function2;)V - public final fun ensureTransactionWithSpanReceived (Lkotlin/jvm/functions/Function1;)V - public final fun findJar (Ljava/lang/String;Ljava/lang/String;)Ljava/io/File; - public static synthetic fun findJar$default (Lio/sentry/systemtest/util/TestHelper;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/io/File; - public final fun getDsn ()Ljava/lang/String; - public final fun getEnvelopeCounts ()Lio/sentry/systemtest/util/EnvelopeCounts; - public final fun getGraphqlClient ()Lio/sentry/systemtest/graphql/GraphqlTestClient; - public final fun getJsonSerializer ()Lio/sentry/JsonSerializer; - public final fun getRestClient ()Lio/sentry/systemtest/util/RestTestClient; - public final fun getSentryClient ()Lio/sentry/systemtest/util/SentryMockServerClient; - public final fun launch (Ljava/io/File;Ljava/util/Map;Z)Ljava/lang/Process; - public static synthetic fun launch$default (Lio/sentry/systemtest/util/TestHelper;Ljava/io/File;Ljava/util/Map;ZILjava/lang/Object;)Ljava/lang/Process; - public final fun logObject (Ljava/lang/Object;)V - public final fun reset ()V - public final fun setEnvelopeCounts (Lio/sentry/systemtest/util/EnvelopeCounts;)V - public final fun snapshotEnvelopeCount ()V -} - diff --git a/sentry-test-support/api/sentry-test-support.api b/sentry-test-support/api/sentry-test-support.api deleted file mode 100644 index 1d8ae671216..00000000000 --- a/sentry-test-support/api/sentry-test-support.api +++ /dev/null @@ -1,75 +0,0 @@ -public final class io/sentry/AssertionsKt { - public static final fun assertEnvelopeEvent (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;)Lio/sentry/SentryEvent; - public static synthetic fun assertEnvelopeEvent$default (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/sentry/SentryEvent; - public static final fun assertEnvelopeFeedback (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;)Lio/sentry/SentryEvent; - public static synthetic fun assertEnvelopeFeedback$default (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/sentry/SentryEvent; - public static final fun assertEnvelopeProfile (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;)Lio/sentry/ProfilingTraceData; - public static synthetic fun assertEnvelopeProfile$default (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/sentry/ProfilingTraceData; - public static final fun assertEnvelopeTransaction (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;)Lio/sentry/protocol/SentryTransaction; - public static synthetic fun assertEnvelopeTransaction$default (Ljava/util/List;Lio/sentry/ILogger;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lio/sentry/protocol/SentryTransaction; - public static final fun checkEvent (Lkotlin/jvm/functions/Function1;)Lio/sentry/SentryEnvelope; - public static final fun checkLogs (Lkotlin/jvm/functions/Function1;)Lio/sentry/SentryEnvelope; - public static final fun checkTransaction (Lkotlin/jvm/functions/Function1;)Lio/sentry/SentryEnvelope; - public static final fun getMockServerRequestTimeoutMillis ()J -} - -public final class io/sentry/SkipError : java/lang/Error { - public fun (Ljava/lang/String;)V -} - -public final class io/sentry/test/DeferredExecutorService : io/sentry/ISentryExecutorService { - public fun ()V - public fun close (J)V - public final fun hasScheduledRunnables ()Z - public fun isClosed ()Z - public fun prewarm ()V - public final fun runAll ()V - public fun schedule (Ljava/lang/Runnable;J)Ljava/util/concurrent/Future; - public fun submit (Ljava/lang/Runnable;)Ljava/util/concurrent/Future; - public fun submit (Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future; -} - -public final class io/sentry/test/ImmediateExecutorService : io/sentry/ISentryExecutorService { - public fun ()V - public fun close (J)V - public fun isClosed ()Z - public fun prewarm ()V - public fun schedule (Ljava/lang/Runnable;J)Ljava/util/concurrent/Future; - public fun submit (Ljava/lang/Runnable;)Ljava/util/concurrent/Future; - public fun submit (Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future; -} - -public final class io/sentry/test/InitKt { - public static final fun applyTestOptions (Lio/sentry/SentryOptions;)V - public static final fun initForTest ()V - public static final fun initForTest (Lio/sentry/Sentry$OptionsConfiguration;)V - public static final fun initForTest (Lio/sentry/Sentry$OptionsConfiguration;Z)V - public static final fun initForTest (Lio/sentry/SentryOptions;)V - public static final fun initForTest (Ljava/lang/String;)V -} - -public final class io/sentry/test/MocksKt { - public static final fun createSentryClientMock (Z)Lio/sentry/ISentryClient; - public static synthetic fun createSentryClientMock$default (ZILjava/lang/Object;)Lio/sentry/ISentryClient; - public static final fun createTestScopes (Lio/sentry/SentryOptions;ZLio/sentry/IScope;Lio/sentry/IScope;Lio/sentry/IScope;)Lio/sentry/Scopes; - public static synthetic fun createTestScopes$default (Lio/sentry/SentryOptions;ZLio/sentry/IScope;Lio/sentry/IScope;Lio/sentry/IScope;ILjava/lang/Object;)Lio/sentry/Scopes; -} - -public final class io/sentry/test/NonOverridableNoOpSentryExecutorService : io/sentry/ISentryExecutorService { - public fun ()V - public fun close (J)V - public fun isClosed ()Z - public fun prewarm ()V - public fun schedule (Ljava/lang/Runnable;J)Ljava/util/concurrent/Future; - public fun submit (Ljava/lang/Runnable;)Ljava/util/concurrent/Future; - public fun submit (Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future; -} - -public final class io/sentry/test/ReflectionKt { - public static final fun collectInterfaceHierarchy (Ljava/lang/Class;)Ljava/util/List; - public static final fun containsMethod (Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Z - public static final fun containsMethod (Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Z - public static final fun getCtor (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor; - public static final fun getDeclaredCtor (Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor; -} - diff --git a/test/system-test-runner.py b/test/system-test-runner.py index 70489c580a5..1250c6cbab9 100644 --- a/test/system-test-runner.py +++ b/test/system-test-runner.py @@ -326,7 +326,7 @@ def start_tomcat_server(self, sample_module: str) -> None: # Start the Tomcat server with open("tomcat-server.txt", "w") as log_file: self.tomcat_server.process = subprocess.Popen( - ["./gradlew", f"sentry-samples:{sample_module}:run"], + ["./gradlew", f"sentry-samples:{sample_module}:run", "--console=plain"], env=env, stdout=log_file, stderr=subprocess.STDOUT @@ -406,6 +406,8 @@ def wait_for_spring(self, max_attempts: int = 20) -> bool: print("Waiting for Spring application to be ready...") for attempt in range(1, max_attempts + 1): + # All current Spring Boot samples expose actuator/health. Waiting for the + # health endpoint avoids false positives from unrelated services on 8080. try: response = requests.head( "http://localhost:8080/actuator/health", @@ -528,18 +530,23 @@ def stop_spring_server(self) -> None: # Clean up PID file and instance variable cleanup_pid(self.spring_server) - def get_build_task(self, server_type: Optional[ServerType]) -> str: + def get_build_task(self, sample_module: str, server_type: Optional[ServerType]) -> str: """Get the appropriate build task for a module.""" if server_type == ServerType.TOMCAT: return "war" elif server_type == ServerType.SPRING: + # Modules using Shadow plugin (e.g. Spring Boot 2 samples) use shadowJar, + # modules using Spring Boot plugin (SB3/SB4 samples) use bootJar + build_file = Path(f"sentry-samples/{sample_module}/build.gradle.kts") + if build_file.exists() and "shadow" in build_file.read_text(): + return "shadowJar" return "bootJar" return "assemble" def build_module(self, sample_module: str, server_type: Optional[ServerType]) -> int: """Build a sample module using the appropriate task.""" - build_task = self.get_build_task(server_type) + build_task = self.get_build_task(sample_module, server_type) print(f"Building {sample_module} using {build_task} task") return self.run_gradle_task(f":sentry-samples:{sample_module}:{build_task}") @@ -547,7 +554,7 @@ def run_gradle_task(self, task: str) -> int: """Run a Gradle task and return the exit code.""" print(f"Running: ./gradlew {task}") try: - result = subprocess.run(["./gradlew", task], check=False) + result = subprocess.run(["./gradlew", task, "--console=plain"], check=False) return result.returncode except Exception as e: print(f"Failed to run Gradle task: {e}")