diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 144f9565c73..241cdee77bd 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -43,7 +43,4 @@ dependencies { implementation("gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.9.6") implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.3") - - // earlier versions aren't compatible with Gradle 8.1.1 - implementation("org.springframework.boot:spring-boot-gradle-plugin:2.5.12") } diff --git a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts index bf6a7dcb5ac..c4ea2e69ddd 100644 --- a/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts +++ b/buildSrc/src/main/kotlin/ai.smoke-test-jar.gradle.kts @@ -1,11 +1,47 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer import com.microsoft.applicationinsights.gradle.AiSmokeTestExtension plugins { id("ai.smoke-test") - id("org.springframework.boot") + id("com.gradleup.shadow") } val aiSmokeTest = extensions.getByType(AiSmokeTestExtension::class) -aiSmokeTest.testAppArtifactDir.set(tasks.bootJar.flatMap { it.destinationDirectory }) -aiSmokeTest.testAppArtifactFilename.set(tasks.bootJar.flatMap { it.archiveFileName }) +// Create a fat JAR using Shadow instead of Spring Boot plugin for Gradle 9 compatibility +// Spring Boot 2.x doesn't support Gradle 9, and Spring Boot 3.x requires Java 17+ +// Shadow creates a simple fat JAR that works with Java 8 +tasks.named("shadowJar") { + archiveClassifier.set("") + mergeServiceFiles() + + // Properly merge spring.factories files from all dependencies + // This is required for Spring Boot auto-configuration to work + // Use PropertiesFileTransformer to merge duplicate keys instead of simple append + transform(PropertiesFileTransformer::class.java) { + paths = listOf("META-INF/spring.factories") + mergeStrategy = "append" + } + + // Set main class - can be overridden by individual projects via mainClassName property + manifest { + val mainClass = if (project.hasProperty("mainClassName")) { + project.property("mainClassName") as String + } else { + // Default main class for most smoke test apps + "com.microsoft.applicationinsights.smoketestapp.SpringBootApp" + } + attributes["Main-Class"] = mainClass + } +} + +// Make jar task depend on shadowJar and use the shadow JAR output +// This prevents the regular jar task from overwriting the fat JAR +tasks.named("jar") { + dependsOn(tasks.shadowJar) + enabled = false +} + +aiSmokeTest.testAppArtifactDir.set(tasks.shadowJar.flatMap { it.destinationDirectory }) +aiSmokeTest.testAppArtifactFilename.set(tasks.shadowJar.flatMap { it.archiveFileName }) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da476b..19a6bdeb848 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.3.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/smoke-tests/apps/DiagnosticExtension/build.gradle.kts b/smoke-tests/apps/DiagnosticExtension/build.gradle.kts index e3f42a5adef..10b71ca36a3 100644 --- a/smoke-tests/apps/DiagnosticExtension/build.gradle.kts +++ b/smoke-tests/apps/DiagnosticExtension/build.gradle.kts @@ -5,7 +5,8 @@ plugins { dependencies { implementation(project(":agent:agent-profiler:agent-diagnostics-api")) implementation(project(":agent:agent-profiler:agent-alerting-api")) - implementation(project(":smoke-tests:apps:DiagnosticExtension:MockExtension")) + // MockExtension is loaded as a separate agent extension, not bundled in the app + compileOnly(project(":smoke-tests:apps:DiagnosticExtension:MockExtension")) testImplementation(project(":smoke-tests:framework")) implementation("org.springframework.boot:spring-boot-starter-web:2.5.12") } diff --git a/smoke-tests/apps/JettyNativeHandler/build.gradle.kts b/smoke-tests/apps/JettyNativeHandler/build.gradle.kts index 2bb4f96b5b8..7b2c8cb225f 100644 --- a/smoke-tests/apps/JettyNativeHandler/build.gradle.kts +++ b/smoke-tests/apps/JettyNativeHandler/build.gradle.kts @@ -2,6 +2,9 @@ plugins { id("ai.smoke-test-jar") } +// Override default main class +ext.set("mainClassName", "com.microsoft.applicationinsights.smoketestapp.JettyNativeHandlerApp") + dependencies { implementation("org.springframework.boot:spring-boot-starter:2.5.12") diff --git a/smoke-tests/apps/NonDaemonThreads/build.gradle.kts b/smoke-tests/apps/NonDaemonThreads/build.gradle.kts index f21b8ce63b1..5b389b4a816 100644 --- a/smoke-tests/apps/NonDaemonThreads/build.gradle.kts +++ b/smoke-tests/apps/NonDaemonThreads/build.gradle.kts @@ -5,4 +5,6 @@ plugins { dependencies { implementation("org.springframework.boot:spring-boot-starter-web:2.5.12") implementation("com.squareup.okhttp3:okhttp:3.12.1") + // Include Spring Boot loader classes for TestController to locate the JAR + implementation("org.springframework.boot:spring-boot-loader:2.5.12") } diff --git a/smoke-tests/apps/ReadOnly/build.gradle.kts b/smoke-tests/apps/ReadOnly/build.gradle.kts index 29d8040b549..b2b99c406ac 100644 --- a/smoke-tests/apps/ReadOnly/build.gradle.kts +++ b/smoke-tests/apps/ReadOnly/build.gradle.kts @@ -1,3 +1,6 @@ plugins { id("ai.smoke-test-jar") } + +// Override default main class +ext.set("mainClassName", "com.microsoft.applicationinsights.smoketestapp.App") diff --git a/smoke-tests/apps/gRPC/build.gradle.kts b/smoke-tests/apps/gRPC/build.gradle.kts index eae03a2ecef..8281fb5022c 100644 --- a/smoke-tests/apps/gRPC/build.gradle.kts +++ b/smoke-tests/apps/gRPC/build.gradle.kts @@ -2,7 +2,7 @@ import com.google.protobuf.gradle.* plugins { id("ai.smoke-test-jar") - id("com.google.protobuf") version "0.8.19" + id("com.google.protobuf") version "0.9.6" } val grpcVersion = "1.26.0" // first version with support for arm64