From 34aa680ebd941fdda55f62e4f4df2462aeb773b4 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 12 Jan 2026 17:27:53 +0100 Subject: [PATCH 01/13] fix: Remove remaining use of JAVA_X_HOME in build files --- .../instrumentation/mule-4.5/build.gradle | 2 +- dd-smoke-tests/quarkus/build.gradle | 6 ++++-- .../spring-boot-2.7-webflux/build.gradle | 6 ++++-- .../springboot-openliberty-20/build.gradle | 5 ++++- .../springboot-openliberty-23/build.gradle | 5 ++++- dd-smoke-tests/vertx-3.4/build.gradle | 6 ++++-- dd-smoke-tests/vertx-3.9-resteasy/build.gradle | 6 ++++-- dd-smoke-tests/vertx-3.9/build.gradle | 8 +++++--- dd-smoke-tests/vertx-4.2/build.gradle | 6 ++++-- dd-smoke-tests/wildfly/build.gradle | 6 ++++-- docs/how_instrumentations_work.md | 2 +- gradle/java_no_deps.gradle | 16 +++++++++++++++- internal-api/internal-api-9/build.gradle.kts | 4 +++- 13 files changed, 57 insertions(+), 21 deletions(-) diff --git a/dd-java-agent/instrumentation/mule-4.5/build.gradle b/dd-java-agent/instrumentation/mule-4.5/build.gradle index ffdbb1fcdd6..997fc36f744 100644 --- a/dd-java-agent/instrumentation/mule-4.5/build.gradle +++ b/dd-java-agent/instrumentation/mule-4.5/build.gradle @@ -231,7 +231,7 @@ tasks.register('extractLatestMuleServices', Sync) { // build the mule application via maven tasks.register('mvnPackage', Exec) { workingDir("$appDir") - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") + environment["JAVA_HOME"] = getLazyJavaHomeFor(8) List mvnArgs = [ "$rootDir/mvnw", diff --git a/dd-smoke-tests/quarkus/build.gradle b/dd-smoke-tests/quarkus/build.gradle index 061140ddcc8..282d4a4dddf 100644 --- a/dd-smoke-tests/quarkus/build.gradle +++ b/dd-smoke-tests/quarkus/build.gradle @@ -17,8 +17,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the quarkus project tasks.register('quarkusBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "${rootDir}/${gradlewCommand}", "build", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle index 01e7727f436..52c34a795a4 100644 --- a/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle @@ -14,8 +14,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the quarkus project tasks.register('webfluxBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/springboot-openliberty-20/build.gradle b/dd-smoke-tests/springboot-openliberty-20/build.gradle index 1f1eb04979c..b86cbf431cb 100644 --- a/dd-smoke-tests/springboot-openliberty-20/build.gradle +++ b/dd-smoke-tests/springboot-openliberty-20/build.gradle @@ -14,7 +14,10 @@ def mvnwCommand = isWindows ? 'mvnw.cmd' : 'mvnw' // compile the Open liberty spring boot server tasks.register('mvnStage', Exec) { workingDir("$appDir") - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") + environment += [ + "MAVEN_OPTS": "-Xmx512M", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] List mvnArgs = ["$rootDir/${mvnwCommand}", "-Dtarget.dir=${buildDir}/application/target", "package"] diff --git a/dd-smoke-tests/springboot-openliberty-23/build.gradle b/dd-smoke-tests/springboot-openliberty-23/build.gradle index c471d97700a..fe0664e62ea 100644 --- a/dd-smoke-tests/springboot-openliberty-23/build.gradle +++ b/dd-smoke-tests/springboot-openliberty-23/build.gradle @@ -14,7 +14,10 @@ def mvnwCommand = isWindows ? 'mvnw.cmd' : 'mvnw' // compile the Open liberty spring boot server tasks.register('mvnStage', Exec) { workingDir("$appDir") - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") + environment += [ + "MAVEN_OPTS": "-Xmx512M", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] List mvnArgs = ["$rootDir/${mvnwCommand}", "-Dtarget.dir=${buildDir}/application/target", "package"] diff --git a/dd-smoke-tests/vertx-3.4/build.gradle b/dd-smoke-tests/vertx-3.4/build.gradle index 141f1644d8d..5c60fa6985f 100644 --- a/dd-smoke-tests/vertx-3.4/build.gradle +++ b/dd-smoke-tests/vertx-3.4/build.gradle @@ -18,8 +18,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the quarkus project tasks.register('vertxBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/vertx-3.9-resteasy/build.gradle b/dd-smoke-tests/vertx-3.9-resteasy/build.gradle index effc2da0f1a..1e4acffdd75 100644 --- a/dd-smoke-tests/vertx-3.9-resteasy/build.gradle +++ b/dd-smoke-tests/vertx-3.9-resteasy/build.gradle @@ -15,8 +15,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the quarkus project tasks.register('vertxBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/vertx-3.9/build.gradle b/dd-smoke-tests/vertx-3.9/build.gradle index aafbb189239..809fee5157d 100644 --- a/dd-smoke-tests/vertx-3.9/build.gradle +++ b/dd-smoke-tests/vertx-3.9/build.gradle @@ -13,11 +13,13 @@ def appDir = "$projectDir/application" def appBuildDir = "$buildDir/application" def isWindows = System.getProperty("os.name").toLowerCase().contains("win") def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' -// define the task that builds the quarkus project +// define the task that builds the vertx project tasks.register('vertxBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/vertx-4.2/build.gradle b/dd-smoke-tests/vertx-4.2/build.gradle index 199f6694a3d..a41419ae7c7 100644 --- a/dd-smoke-tests/vertx-4.2/build.gradle +++ b/dd-smoke-tests/vertx-4.2/build.gradle @@ -17,8 +17,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the quarkus project tasks.register('vertxBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/wildfly/build.gradle b/dd-smoke-tests/wildfly/build.gradle index 39d983e657d..2abf21a2a1b 100644 --- a/dd-smoke-tests/wildfly/build.gradle +++ b/dd-smoke-tests/wildfly/build.gradle @@ -50,8 +50,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the quarkus project tasks.register('earBuild', Exec) { workingDir "$appDir" - environment.JAVA_HOME = System.getenv("JAVA_8_HOME") - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) + ] commandLine "$rootDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/docs/how_instrumentations_work.md b/docs/how_instrumentations_work.md index c8b8d08317f..c73b632723e 100644 --- a/docs/how_instrumentations_work.md +++ b/docs/how_instrumentations_work.md @@ -792,7 +792,7 @@ Sometimes it is necessary to force Gradle to discard cached test results and [re ./gradle test --rerun-tasks ``` -Running tests that require JDK-21 will require the `JAVA_21_HOME` env var set and can be done like this: +Running tests that require JDK-21 to be installed, use the `-PtestJvm=21` flag, for example: ```shell ./gradlew :dd-java-agent:instrumentation:aerospike-4.0:allLatestDepTests -PtestJvm=21 diff --git a/gradle/java_no_deps.gradle b/gradle/java_no_deps.gradle index 38687bf0de8..e28d8e4744e 100644 --- a/gradle/java_no_deps.gradle +++ b/gradle/java_no_deps.gradle @@ -370,7 +370,7 @@ ext.configureGroovyCompiler = (int toolchainVersion, String... taskNames) -> { } } as Closure -ext.getJavaLauncherFor = (javaVersionInteger) -> { +ext.getJavaLauncherFor = (int javaVersionInteger) -> { def launcher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(javaVersionInteger) } @@ -380,6 +380,20 @@ ext.getJavaLauncherFor = (javaVersionInteger) -> { return launcher } as Closure> +ext.getLazyJavaHomeFor = (int javaVersionInteger, int hasNativeImage = false) -> { + def launcher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(javaVersionInteger) + nativeImageCapable = hasNativeImage + } + return new Object() { + @Override + String toString() { + println("Using Java $javaVersionInteger from toolchain at: " + launcher.get().metadata.installationPath.asFile.absolutePath) + return launcher.get().metadata.installationPath.asFile.absolutePath + } + } +} as Closure> + tasks.register('testJar', Jar) { dependsOn(testClasses) diff --git a/internal-api/internal-api-9/build.gradle.kts b/internal-api/internal-api-9/build.gradle.kts index c0fd04f710f..b4abf186096 100644 --- a/internal-api/internal-api-9/build.gradle.kts +++ b/internal-api/internal-api-9/build.gradle.kts @@ -53,5 +53,7 @@ idea { jmh { jmhVersion = libs.versions.jmh duplicateClassesStrategy = DuplicatesStrategy.EXCLUDE - jvm = providers.environmentVariable("JAVA_11_HOME").map { Paths.get(it, "bin", "java").toString() } + jvm = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(11) }.map { + it.executablePath.asFile.toString() + } } From 10a114fabeeeee07244e49a342775452f89db704 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 12 Jan 2026 17:28:07 +0100 Subject: [PATCH 02/13] fix: Remove remaining use of JAVA_X_HOME in test --- .../test/java/datadog/environment/EnvironmentVariablesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java b/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java index 3a9c2195f0d..98b0a0adf99 100644 --- a/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java +++ b/components/environment/src/test/java/datadog/environment/EnvironmentVariablesTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; class EnvironmentVariablesTest { - private static final String EXISTING_ENV_VAR = "JAVA_8_HOME"; + private static final String EXISTING_ENV_VAR = "PATH"; private static final String MISSING_ENV_VAR = "UNDEFINED_ENV_VAR"; private static final String DEFAULT_VALUE = "DEFAULT"; From 331caaf0d971d02304a66fb85e883d4cc1731d06 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 12 Jan 2026 18:10:23 +0100 Subject: [PATCH 03/13] fix: Remove remaining use of JAVA_X_HOME in native build tests --- dd-smoke-tests/quarkus-native/build.gradle | 29 +++++++++---------- .../spring-boot-3.0-native/build.gradle | 29 +++++++++---------- gradle/java_no_deps.gradle | 29 +++++++++++++++++-- settings.gradle.kts | 2 +- 4 files changed, 56 insertions(+), 33 deletions(-) diff --git a/dd-smoke-tests/quarkus-native/build.gradle b/dd-smoke-tests/quarkus-native/build.gradle index fa004cb4383..ee1f1e38dc0 100644 --- a/dd-smoke-tests/quarkus-native/build.gradle +++ b/dd-smoke-tests/quarkus-native/build.gradle @@ -1,22 +1,21 @@ +import java.util.regex.Pattern + apply from: "$rootDir/gradle/java.gradle" dependencies { testImplementation project(':dd-smoke-tests') } +// Check 'testJvm' gradle command parameter is GraalVM (e.g., -PtestJvm=graalvm21), +// if not nothing is done def testJvm = gradle.startParameter.projectProperties.getOrDefault('testJvm', '') -// In order to support GraalVM 21 we need at least Java 17 for Gradle -def java17Home = providers.environmentVariable('JAVA_17_HOME').orNull -// Check 'testJvm' gradle command parameter to be at least GraalVM 17 -def matcher = testJvm?.toLowerCase(Locale.ROOT) =~ /graalvm([0-9]+)/ -def version = matcher?.size() == 1 ? Integer.parseInt(matcher[0][1]) : -1 -if (version >= 17) { - // Retrieve GRAALVM_HOME from JVM environment variables - def testJvmEnv = "JAVA_${testJvm}_HOME" - def testJvmHome = providers.environmentVariable(testJvmEnv).orNull - if (!testJvmHome) { - throw new GradleException("Unable to find launcher for Java '$testJvm'. Have you set '$testJvmEnv'?") - } - def javaHome = version >= 21 ? java17Home : testJvmHome +def graalvmMatcher = Pattern.compile("graalvm([0-9]+)").matcher(testJvm?.toLowerCase(Locale.ROOT) ?: '') +def testGraalvmVersion = graalvmMatcher.find() ? Integer.parseInt(graalvmMatcher.group(1)) : -1 + +if (testGraalvmVersion >= 17) { + // GraalVM with native-image capability for native compilation + def graalvmHome = getLazyJavaHomeFor(testGraalvmVersion, true) + // For GraalVM 21+ we need Java 17+ to run Gradle, for earlier versions use GraalVM itself + def gradleJavaHome = testGraalvmVersion >= 21 ? getLazyJavaHomeFor(17) : graalvmHome // Configure build directory for application def appDir = "$projectDir/application" def appBuildDir = "$buildDir/application" @@ -28,8 +27,8 @@ if (version >= 17) { workingDir "$appDir" environment += [ 'GRADLE_OPTS' : "-Dorg.gradle.jvmargs='-Xmx512M'", - 'JAVA_HOME' : javaHome, - 'GRAALVM_HOME': testJvmHome + 'JAVA_HOME' : gradleJavaHome, + 'GRAALVM_HOME': graalvmHome ] commandLine( "$rootDir/${gradlewCommand}", diff --git a/dd-smoke-tests/spring-boot-3.0-native/build.gradle b/dd-smoke-tests/spring-boot-3.0-native/build.gradle index 921ffd5cb0e..e0dda4c6db6 100644 --- a/dd-smoke-tests/spring-boot-3.0-native/build.gradle +++ b/dd-smoke-tests/spring-boot-3.0-native/build.gradle @@ -1,3 +1,5 @@ +import java.util.regex.Pattern + apply from: "$rootDir/gradle/java.gradle" description = 'Spring Boot 3.0 Native Smoke Tests.' @@ -7,20 +9,17 @@ dependencies { testImplementation libs.bundles.jmc } +// Check 'testJvm' gradle command parameter is GraalVM (e.g., -PtestJvm=graalvm21), +// if not nothing is done def testJvm = gradle.startParameter.projectProperties.getOrDefault('testJvm', '') -// In order to support GraalVM 21 we need at least Java 17 for Gradle -def java17Home = providers.environmentVariable('JAVA_17_HOME').orNull -// Check 'testJvm' gradle command parameter to be at least GraalVM 17 -def matcher = testJvm?.toLowerCase(Locale.ROOT) =~ /graalvm([0-9]+)/ -def version = matcher?.size() == 1 ? Integer.parseInt(matcher[0][1]) : -1 -if (version >= 17) { - // Retrieve GRAALVM_HOME from JVM environment variables - def testJvmEnv = "JAVA_${testJvm}_HOME" - def testJvmHome = providers.environmentVariable(testJvmEnv).orNull - if (!testJvmHome) { - throw new GradleException("Unable to find launcher for Java '$testJvm'. Have you set '$testJvmEnv'?") - } - def javaHome = version >= 21 ? java17Home : testJvmHome +def graalvmMatcher = Pattern.compile("graalvm([0-9]+)").matcher(testJvm?.toLowerCase(Locale.ROOT) ?: '') +def testGraalvmVersion = graalvmMatcher.find() ? Integer.parseInt(graalvmMatcher.group(1)) : -1 + +if (testGraalvmVersion >= 17) { + // GraalVM with native-image capability for native compilation + def graalvmHome = getLazyJavaHomeFor(testGraalvmVersion, true) + // For GraalVM 21+ we need Java 17+ to run Gradle, for earlier versions use GraalVM itself + def gradleJavaHome = testGraalvmVersion >= 21 ? getLazyJavaHomeFor(17) : graalvmHome // Configure build directory for application def appDir = "$projectDir/application" def appBuildDir = "$buildDir/application" @@ -32,8 +31,8 @@ if (version >= 17) { workingDir "$appDir" environment += [ 'GRADLE_OPTS': "-Dorg.gradle.jvmargs='-Xmx1024M'", - 'JAVA_HOME': javaHome, - 'GRAALVM_HOME': testJvmHome, + 'JAVA_HOME': gradleJavaHome, + 'GRAALVM_HOME': graalvmHome, 'DD_TRACE_METHODS' : 'datadog.smoketest.springboot.controller.WebController[sayHello]', 'NATIVE_IMAGE_DEPRECATED_BUILDER_SANITATION' : 'true' ] diff --git a/gradle/java_no_deps.gradle b/gradle/java_no_deps.gradle index e28d8e4744e..3e4e17d3d3e 100644 --- a/gradle/java_no_deps.gradle +++ b/gradle/java_no_deps.gradle @@ -2,6 +2,9 @@ import datadog.gradle.plugin.testJvmConstraints.TestJvmConstraintsExtension import datadog.gradle.plugin.testJvmConstraints.ProvideJvmArgsOnJvmLauncherVersion import groovy.transform.CompileStatic +import java.nio.file.Files +import java.nio.file.LinkOption + apply plugin: 'dd-trace-java.configure-tests' apply plugin: 'java-library' apply plugin: 'dd-trace-java.test-jvm-contraints' @@ -380,11 +383,33 @@ ext.getJavaLauncherFor = (int javaVersionInteger) -> { return launcher } as Closure> -ext.getLazyJavaHomeFor = (int javaVersionInteger, int hasNativeImage = false) -> { +ext.getLazyJavaHomeFor = (int javaVersionInteger, boolean hasNativeImage = false) -> { def launcher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(javaVersionInteger) - nativeImageCapable = hasNativeImage + nativeImageCapable = true + }.map { + if (hasNativeImage) { + // đŸ¤Ļâ€â™‚ī¸ Fix https://github.com/gradle/gradle/issues/28583 + // Extraction doesn't handle symlinks properly for GraalVM native-image + // this ensures 'bin/native-image' points to 'lib/svm/bin/native-image' + def target = it.metadata.installationPath.asFile.toPath().resolve("bin").resolve("native-image") + def expectedSrc = it.metadata.installationPath.asFile.toPath().resolve("lib/svm/bin").resolve("native-image") + + if (!Files.isRegularFile(expectedSrc, LinkOption.NOFOLLOW_LINKS)) { + logger.info("[getLazyJavaHomeFor] Skipping fix symlink, '{}' is not a regular file)", expectedSrc) + return it + } + if (Files.isSymbolicLink(target) || Files.size(target) > 0) { + logger.info("[getLazyJavaHomeFor] Skipping fix symlink, '{}' is already symbolic or its size is greater than 0)", target) + return it + } + logger.warn("[getLazyJavaHomeFor] fixing symbolic link '{}' -> '{}', see https://github.com/gradle/gradle/issues/28583", target, expectedSrc) + Files.delete(target) + Files.createSymbolicLink(target, expectedSrc) + } + return it } + return new Object() { @Override String toString() { diff --git a/settings.gradle.kts b/settings.gradle.kts index f79c7a7306b..8373b84532a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,7 +21,7 @@ pluginManagement { plugins { id("com.gradle.develocity") version "4.3" - id("org.gradle.toolchains.foojay-resolver-convention") version "0.10.0" + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } val isCI = providers.environmentVariable("CI") From f27e5c1b66e328db721041ecfd55ae19fa36b866 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 12 Jan 2026 18:21:29 +0100 Subject: [PATCH 04/13] fix: Move similar JAVA_HOME usage to our lazy toolchain util --- dd-smoke-tests/armeria-grpc/build.gradle | 6 ++++-- dd-smoke-tests/kafka-3/build.gradle | 7 ++++--- dd-smoke-tests/spring-boot-3.0-webflux/build.gradle | 6 ++++-- dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle | 6 ++++-- dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle | 6 ++++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/dd-smoke-tests/armeria-grpc/build.gradle b/dd-smoke-tests/armeria-grpc/build.gradle index de48e239cb1..d43a639b236 100644 --- a/dd-smoke-tests/armeria-grpc/build.gradle +++ b/dd-smoke-tests/armeria-grpc/build.gradle @@ -57,8 +57,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the armeria project tasks.register('armeriaBuild', Exec) { workingDir "$appDir" - def toolchain17 = getJavaLauncherFor(17).get() - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", "JAVA_HOME": "$toolchain17.metadata.installationPath"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) + ] commandLine "${rootDir}/${gradlewCommand}", "build", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/kafka-3/build.gradle b/dd-smoke-tests/kafka-3/build.gradle index fba27724ff3..6b326273277 100644 --- a/dd-smoke-tests/kafka-3/build.gradle +++ b/dd-smoke-tests/kafka-3/build.gradle @@ -22,9 +22,10 @@ final gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('bootJar', Exec) { workingDir appDir - - final toolchain17 = getJavaLauncherFor(17).get() - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", "JAVA_HOME": "$toolchain17.metadata.installationPath"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) + ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir" outputs.cacheIf { true } diff --git a/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle b/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle index 6e03a501e58..600c5209e26 100644 --- a/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle @@ -18,8 +18,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the project tasks.register('webfluxBuild30', Exec) { workingDir "$appDir" - def toolchain17 = getJavaLauncherFor(17).get() - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", "JAVA_HOME": "$toolchain17.metadata.installationPath"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) + ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle b/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle index f66474ba3af..6c9d2b0a06a 100644 --- a/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle +++ b/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle @@ -18,8 +18,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the project tasks.register('webmvcBuild30', Exec) { workingDir "$appDir" - def toolchain17 = getJavaLauncherFor(17).get() - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", "JAVA_HOME": "$toolchain17.metadata.installationPath"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) + ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } diff --git a/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle b/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle index d05f62e7e46..aa8c5126eab 100644 --- a/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle +++ b/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle @@ -18,8 +18,10 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' // define the task that builds the project tasks.register('webmvcBuild3', Exec) { workingDir "$appDir" - def toolchain17 = getJavaLauncherFor(17).get() - environment += ["GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", "JAVA_HOME": "$toolchain17.metadata.installationPath"] + environment += [ + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) + ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" outputs.cacheIf { true } From 0ee2ca485c18c76d9604a7622f6380fe0d913c87 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 12 Jan 2026 21:51:06 +0100 Subject: [PATCH 05/13] fix: Remove JAVA_X_HOME usage in tests --- .../datadog/trace/civisibility/CiVisibilitySmokeTest.groovy | 6 +----- dd-smoke-tests/concurrent/java-25/build.gradle | 1 + .../concurrent/AbstractStructuredConcurrencyTest.groovy | 4 +++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index cfcbe4d5b34..703041761a2 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -9,7 +9,6 @@ import datadog.trace.api.config.TracerConfig import java.nio.file.Paths import spock.lang.Specification import spock.lang.TempDir -import spock.util.environment.Jvm import java.nio.file.Path @@ -29,10 +28,7 @@ abstract class CiVisibilitySmokeTest extends Specification { protected Path prefsDir protected static String buildJavaHome() { - if (Jvm.current.isJava8()) { - return System.getenv("JAVA_8_HOME") - } - return System.getenv("JAVA_" + Jvm.current.getJavaSpecificationVersion() + "_HOME") + return System.getProperty("java.home") } protected static String javaPath() { diff --git a/dd-smoke-tests/concurrent/java-25/build.gradle b/dd-smoke-tests/concurrent/java-25/build.gradle index 634840574f7..9a9e9c1b858 100644 --- a/dd-smoke-tests/concurrent/java-25/build.gradle +++ b/dd-smoke-tests/concurrent/java-25/build.gradle @@ -49,6 +49,7 @@ dependencies { tasks.withType(Test).configureEach { def shadowJarTask = tasks.named('shadowJar', ShadowJar) dependsOn shadowJarTask + environment("JAVA_HOME", getLazyJavaHomeFor(25)) jvmArgumentProviders.add(new CommandLineArgumentProvider() { @Override Iterable asArguments() { diff --git a/dd-smoke-tests/concurrent/java-25/src/test/groovy/datadog/smoketest/concurrent/AbstractStructuredConcurrencyTest.groovy b/dd-smoke-tests/concurrent/java-25/src/test/groovy/datadog/smoketest/concurrent/AbstractStructuredConcurrencyTest.groovy index e1a476678fb..72ef109fa0b 100644 --- a/dd-smoke-tests/concurrent/java-25/src/test/groovy/datadog/smoketest/concurrent/AbstractStructuredConcurrencyTest.groovy +++ b/dd-smoke-tests/concurrent/java-25/src/test/groovy/datadog/smoketest/concurrent/AbstractStructuredConcurrencyTest.groovy @@ -17,7 +17,9 @@ abstract class AbstractStructuredConcurrencyTest extends AbstractSmokeTest { ProcessBuilder createProcessBuilder() { def jarPath = System.getProperty("datadog.smoketest.shadowJar.path") def command = new ArrayList() - command.add(Paths.get(System.getenv("JAVA_25_HOME"), "bin", "java").toString()) + + def javaHome = Paths.get(System.getenv("JAVA_HOME"), "bin", "java").toString() + command.add(javaHome) command.addAll(defaultJavaProperties) command.add("--enable-preview") command.add("-Ddd.trace.otel.enabled=true") From a49b7a3c382a5354b01fca9099d963cb0d18d183 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Mon, 12 Jan 2026 22:21:08 +0100 Subject: [PATCH 06/13] fix: Use Gradle toolchain registry in favor of JAVA_X_HOME for stable --- .../plugin/testJvmConstraints/TestJvmSpec.kt | 54 +++++++++++++++---- dd-smoke-tests/armeria-grpc/build.gradle | 4 +- dd-smoke-tests/kafka-3/build.gradle | 4 +- dd-smoke-tests/quarkus/build.gradle | 4 +- .../spring-boot-2.7-webflux/build.gradle | 4 +- .../spring-boot-3.0-webflux/build.gradle | 4 +- .../spring-boot-3.0-webmvc/build.gradle | 4 +- .../spring-boot-3.3-webmvc/build.gradle | 4 +- .../springboot-openliberty-20/build.gradle | 4 +- .../springboot-openliberty-23/build.gradle | 4 +- dd-smoke-tests/vertx-3.4/build.gradle | 4 +- .../vertx-3.9-resteasy/build.gradle | 4 +- dd-smoke-tests/vertx-3.9/build.gradle | 4 +- dd-smoke-tests/vertx-4.2/build.gradle | 4 +- dd-smoke-tests/wildfly/build.gradle | 4 +- gradle/java_no_deps.gradle | 2 +- 16 files changed, 73 insertions(+), 39 deletions(-) diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt index 9ce4b533a54..9b0ec8a2115 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt @@ -1,9 +1,12 @@ package datadog.gradle.plugin.testJvmConstraints +import com.gradle.scan.agent.serialization.scan.serializer.kryo.it import org.gradle.api.GradleException import org.gradle.api.Project +import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.provider.PropertyFactory import org.gradle.api.provider.Provider +import org.gradle.internal.jvm.inspection.JavaInstallationRegistry import org.gradle.jvm.toolchain.JavaLanguageVersion import org.gradle.jvm.toolchain.JavaLauncher import org.gradle.jvm.toolchain.JavaToolchainService @@ -51,17 +54,14 @@ class TestJvmSpec(val project: Project) { throw GradleException("testJvm property is blank") } - // "stable" is calculated as the largest X found in JAVA_X_HOME + // "stable" is calculated as the largest Java version found via toolchains or JAVA_X_HOME when (testJvm) { "stable" -> { - val javaVersions = project.providers.environmentVariablesPrefixedBy("JAVA_").map { javaHomes -> - javaHomes - .filter { it.key.matches(Regex("^JAVA_[0-9]+_HOME$")) && it.key != "JAVA_26_HOME" } // JDK 26 is EA - .map { Regex("^JAVA_(\\d+)_HOME$").find(it.key)!!.groupValues[1].toInt() } - }.get() + val javaVersions = discoverJavaVersionsViaToolchains() + ?: discoverJavaVersionsViaEnvVars() if (javaVersions.isEmpty()) { - throw GradleException("No valid JAVA_X_HOME environment variables found.") + throw GradleException("No Java installations found via toolchains or JAVA_X_HOME environment variables.") } javaVersions.max().toString() @@ -69,7 +69,7 @@ class TestJvmSpec(val project: Project) { else -> testJvm } - }.map { project.logger.info("normalized testJvm: $it"); it } + }.map { project.logger.info("normalized testJvm: {}", it); it } /** * The home path of the test JVM. @@ -127,7 +127,7 @@ class TestJvmSpec(val project: Project) { """.trimIndent() ) } - }.map { project.logger.info("testJvm home path: $it"); it } + }.map { project.logger.info("testJvm home path: {}", it); it } /** * The Java launcher for the test JVM. @@ -145,7 +145,7 @@ class TestJvmSpec(val project: Project) { throw GradleException("Unable to find launcher for Java '$testJvm'. Does $TEST_JVM point to a JDK?") }) } - }.flatMap { it }.map { project.logger.info("testJvm launcher: ${it.executablePath}"); it } + }.flatMap { it }.map { project.logger.info("testJvm launcher: {}", it.executablePath); it } private fun String.normalizeToJDKJavaHome(): Path { val javaHome = project.file(this).toPath().toRealPath() @@ -159,4 +159,38 @@ class TestJvmSpec(val project: Project) { private val Project.javaToolchains: JavaToolchainService get() = extensions.getByName("javaToolchains") as JavaToolchainService + + /** + * Discovers available Java versions via Gradle's internal JavaInstallationRegistry. + */ + private fun discoverJavaVersionsViaToolchains(): List? { + val registry = (project as ProjectInternal).services.get(JavaInstallationRegistry::class.java) + val versions = registry.toolchains().mapNotNull { installation -> + installation.metadata.languageVersion.majorVersion.toInt() + } + + return if (versions.isNotEmpty()) { + project.logger.info("Discovered Java versions via toolchains: {}", versions) + versions + } else { + null + } + } + + /** + * Discovers available Java versions via JAVA_X_HOME environment variables. + * Fallback method when toolchain discovery is not available. + */ + private fun discoverJavaVersionsViaEnvVars(): List { + val versions = project.providers.environmentVariablesPrefixedBy("JAVA_").map { javaHomes -> + javaHomes + .filter { it.key.matches(Regex("^JAVA_[0-9]+_HOME$")) } + .mapNotNull { Regex("^JAVA_(\\d+)_HOME$").find(it.key)?.groupValues?.get(1)?.toIntOrNull() } + }.get() + + if (versions.isNotEmpty()) { + project.logger.info("Discovered Java versions via JAVA_X_HOME env vars: {}", versions) + } + return versions + } } diff --git a/dd-smoke-tests/armeria-grpc/build.gradle b/dd-smoke-tests/armeria-grpc/build.gradle index d43a639b236..7c82bfe05e6 100644 --- a/dd-smoke-tests/armeria-grpc/build.gradle +++ b/dd-smoke-tests/armeria-grpc/build.gradle @@ -58,8 +58,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('armeriaBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(17) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) ] commandLine "${rootDir}/${gradlewCommand}", "build", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/kafka-3/build.gradle b/dd-smoke-tests/kafka-3/build.gradle index 6b326273277..0c92600de50 100644 --- a/dd-smoke-tests/kafka-3/build.gradle +++ b/dd-smoke-tests/kafka-3/build.gradle @@ -23,8 +23,8 @@ final gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('bootJar', Exec) { workingDir appDir environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(17) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir" diff --git a/dd-smoke-tests/quarkus/build.gradle b/dd-smoke-tests/quarkus/build.gradle index 282d4a4dddf..56f0cee613a 100644 --- a/dd-smoke-tests/quarkus/build.gradle +++ b/dd-smoke-tests/quarkus/build.gradle @@ -18,8 +18,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('quarkusBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "${rootDir}/${gradlewCommand}", "build", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle index 52c34a795a4..17b9152b803 100644 --- a/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle @@ -15,8 +15,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('webfluxBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle b/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle index 600c5209e26..6138aef945d 100644 --- a/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-3.0-webflux/build.gradle @@ -19,8 +19,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('webfluxBuild30', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(17) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle b/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle index 6c9d2b0a06a..46c00fbcec8 100644 --- a/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle +++ b/dd-smoke-tests/spring-boot-3.0-webmvc/build.gradle @@ -19,8 +19,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('webmvcBuild30', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(17) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle b/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle index aa8c5126eab..484ecfc5668 100644 --- a/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle +++ b/dd-smoke-tests/spring-boot-3.3-webmvc/build.gradle @@ -19,8 +19,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('webmvcBuild3', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(17) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(17) ] commandLine "$rootDir/${gradlewCommand}", "bootJar", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/springboot-openliberty-20/build.gradle b/dd-smoke-tests/springboot-openliberty-20/build.gradle index b86cbf431cb..b8a4f0c8c5f 100644 --- a/dd-smoke-tests/springboot-openliberty-20/build.gradle +++ b/dd-smoke-tests/springboot-openliberty-20/build.gradle @@ -15,8 +15,8 @@ def mvnwCommand = isWindows ? 'mvnw.cmd' : 'mvnw' tasks.register('mvnStage', Exec) { workingDir("$appDir") environment += [ - "MAVEN_OPTS": "-Xmx512M", - "JAVA_HOME": getLazyJavaHomeFor(8) + "MAVEN_OPTS": "-Xmx512M", + "JAVA_HOME": getLazyJavaHomeFor(8) ] List mvnArgs = ["$rootDir/${mvnwCommand}", "-Dtarget.dir=${buildDir}/application/target", "package"] diff --git a/dd-smoke-tests/springboot-openliberty-23/build.gradle b/dd-smoke-tests/springboot-openliberty-23/build.gradle index fe0664e62ea..68dc1ec98c7 100644 --- a/dd-smoke-tests/springboot-openliberty-23/build.gradle +++ b/dd-smoke-tests/springboot-openliberty-23/build.gradle @@ -15,8 +15,8 @@ def mvnwCommand = isWindows ? 'mvnw.cmd' : 'mvnw' tasks.register('mvnStage', Exec) { workingDir("$appDir") environment += [ - "MAVEN_OPTS": "-Xmx512M", - "JAVA_HOME": getLazyJavaHomeFor(8) + "MAVEN_OPTS": "-Xmx512M", + "JAVA_HOME": getLazyJavaHomeFor(8) ] List mvnArgs = ["$rootDir/${mvnwCommand}", "-Dtarget.dir=${buildDir}/application/target", "package"] diff --git a/dd-smoke-tests/vertx-3.4/build.gradle b/dd-smoke-tests/vertx-3.4/build.gradle index 5c60fa6985f..a912e7b34e4 100644 --- a/dd-smoke-tests/vertx-3.4/build.gradle +++ b/dd-smoke-tests/vertx-3.4/build.gradle @@ -19,8 +19,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('vertxBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/vertx-3.9-resteasy/build.gradle b/dd-smoke-tests/vertx-3.9-resteasy/build.gradle index 1e4acffdd75..c7e3dd90565 100644 --- a/dd-smoke-tests/vertx-3.9-resteasy/build.gradle +++ b/dd-smoke-tests/vertx-3.9-resteasy/build.gradle @@ -16,8 +16,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('vertxBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/vertx-3.9/build.gradle b/dd-smoke-tests/vertx-3.9/build.gradle index 809fee5157d..2f374a5c699 100644 --- a/dd-smoke-tests/vertx-3.9/build.gradle +++ b/dd-smoke-tests/vertx-3.9/build.gradle @@ -17,8 +17,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('vertxBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/vertx-4.2/build.gradle b/dd-smoke-tests/vertx-4.2/build.gradle index a41419ae7c7..bc36d08acb0 100644 --- a/dd-smoke-tests/vertx-4.2/build.gradle +++ b/dd-smoke-tests/vertx-4.2/build.gradle @@ -18,8 +18,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('vertxBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "$appDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/dd-smoke-tests/wildfly/build.gradle b/dd-smoke-tests/wildfly/build.gradle index 2abf21a2a1b..69d1acd93b8 100644 --- a/dd-smoke-tests/wildfly/build.gradle +++ b/dd-smoke-tests/wildfly/build.gradle @@ -51,8 +51,8 @@ def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' tasks.register('earBuild', Exec) { workingDir "$appDir" environment += [ - "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", - "JAVA_HOME": getLazyJavaHomeFor(8) + "GRADLE_OPTS": "-Dorg.gradle.jvmargs='-Xmx512M'", + "JAVA_HOME": getLazyJavaHomeFor(8) ] commandLine "$rootDir/${gradlewCommand}", "assemble", "--no-daemon", "--max-workers=4", "-PappBuildDir=$appBuildDir", "-PapiJar=${project(':dd-trace-api').tasks.jar.archiveFile.get()}" diff --git a/gradle/java_no_deps.gradle b/gradle/java_no_deps.gradle index 3e4e17d3d3e..a28e4322e34 100644 --- a/gradle/java_no_deps.gradle +++ b/gradle/java_no_deps.gradle @@ -386,7 +386,7 @@ ext.getJavaLauncherFor = (int javaVersionInteger) -> { ext.getLazyJavaHomeFor = (int javaVersionInteger, boolean hasNativeImage = false) -> { def launcher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(javaVersionInteger) - nativeImageCapable = true + nativeImageCapable = hasNativeImage }.map { if (hasNativeImage) { // đŸ¤Ļâ€â™‚ī¸ Fix https://github.com/gradle/gradle/issues/28583 From bea5f86e62bc74490e763ef2e6eecdeae515ecf0 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Tue, 13 Jan 2026 17:36:05 +0100 Subject: [PATCH 07/13] chore: Update documentation and seetup script to lift the need of JAVA_*_HOME env vars --- BUILDING.md | 70 ++++++++++++++++++------------------------------- CONTRIBUTING.md | 11 +++----- setup.ps1 | 11 ++------ setup.sh | 13 +++------ 4 files changed, 35 insertions(+), 70 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 6fc6ed031d2..a9190f60902 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -29,14 +29,9 @@ or on Windows: Your output should look something like the following: ``` -â„šī¸ Checking required JVMs: -✅ JAVA_HOME is set to /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home. -✅ JAVA_8_HOME is set to /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home. -✅ JAVA_11_HOME is set to /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home. -✅ JAVA_17_HOME is set to /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home. -✅ JAVA_21_HOME is set to /Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home. -✅ JAVA_25_HOME is set to /Library/Java/JavaVirtualMachines/zulu-25.jdk/Contents/Home. -✅ JAVA_GRAALVM17_HOME is set to /Library/Java/JavaVirtualMachines/graalvm-ce-java17-22.3.1/Contents/Home. +â„šī¸ Checking required JVM: +✅ JAVA_HOME is set to /Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home. +â„šī¸ Other JDK versions will be automatically downloaded by Gradle toolchain resolver. â„šī¸ Checking git configuration: ✅ The git command line is installed. ✅ pre-commit hook is installed in repository. @@ -53,19 +48,20 @@ If there is any issue with your output, check the requirements above and use the Requirements to build the full project: -* The JDK versions 8, 11, 17, 21, and 25 must be installed. -* The `JAVA_8_HOME`, `JAVA_11_HOME`, `JAVA_17_HOME`, `JAVA_21_HOME`, `JAVA_25_HOME`, and `JAVA_GRAALVM17_HOME` must point to their respective JDK location. -* The JDK 8 `bin` directory must be the only JDK on the PATH (e.g. `$JAVA_8_HOME/bin`). -* The `JAVA_HOME` environment variable may be unset. If set, it must point to the JDK 8 location (same as `JAVA_8_HOME`). +* JDK 21 must be installed and `JAVA_HOME` must point to it. +* Other JDK versions (8, 11, 17, 25) will be automatically downloaded by Gradle's toolchain resolver. * The `git` command line must be installed. * A container runtime environment must be available to run all tests (e.g. Docker Desktop). -### Install the required JDKs +### Install the required JDK -Download and install JDK versions 8, 11, 17, 21 and 25, and GraalVM 17 for your OS. +Download and install JDK 21 for your OS. Other JDK versions will be automatically downloaded by Gradle when needed. #### macOS + +Use your JDK manager ([mise](https://mise.jdx.dev/), [sdkman](https://sdkman.io/), etc.) or set-up the required JDKs with `brew` + * Install the required JDKs using `brew`: ```shell brew install --cask zulu@8 zulu@11 zulu@17 zulu@21 zulu graalvm/tap/graalvm-ce-java17 @@ -77,20 +73,13 @@ Download and install JDK versions 8, 11, 17, 21 and 25, and GraalVM 17 for your Example: `graalvm-ce-java17-22.3.1` * Use this version in the following command to fix the GraalVM installation by [removing the quarantine flag](https://www.graalvm.org/latest/docs/getting-started/macos/): ``` - sudo xattr -r -d com.apple.quarantine /Library/Java/JavaVirtualMachines/graalvm- - ``` - Example: `/Library/Java/JavaVirtualMachines/graalvm-ce-java17-22.3.1` -* Add the required environment variables to your shell using the `export` command. You can permanently install the environment variables by appending the `export` commands into your shell configuration file `~/.zshrc` or `.bashrc` or other. +* Add the `JAVA_HOME` environment variable to your shell using the `export` command. You can permanently set it by appending the `export` command to your shell configuration file `~/.zshrc` or `~/.bashrc` or other. ```shell - export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home - export JAVA_11_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home - export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home - export JAVA_21_HOME=/Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home - export JAVA_25_HOME=/Library/Java/JavaVirtualMachines/zulu-25.jdk/Contents/Home - export JAVA_GRAALVM17_HOME=/Library/Java/JavaVirtualMachines/graalvm-/Contents/Home - export JAVA_HOME=$JAVA_8_HOME + export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home ``` -* Restart your shell after applying the changes if you appended the commands to your shell configuration file. + + Gradle should automatically detect the JDK in usual places. As a fallback it can automatically provision them. +* Restart your shell after applying the changes if you appended the command to your shell configuration file. > [!NOTE] > ARM users: there is no Oracle JDK v8 for ARM. @@ -102,23 +91,21 @@ Download and install JDK versions 8, 11, 17, 21 and 25, and GraalVM 17 for your #### Linux +Use your JDK manager ([mise](https://mise.jdx.dev/), [sdkman](https://sdkman.io/), etc.) or manually install the required JDKs. + * Download and extract JDK 8, 11, 17, 21, and 25 from [Eclipse Temurin releases](https://adoptium.net/temurin/releases/) and GraalVM 17 from [Oracle downloads](https://www.graalvm.org/downloads/). * Install the GraalVM native image requirements for native builds by following [the GraalVM official documentation](https://www.graalvm.org/latest/reference-manual/native-image/#prerequisites). -* Add the required environment variables to your shell using the `export` command. You can permanently install the environment variables by appending the `export` commands into your shell configuration file `~/.zshrc` or `~/.bashrc` or other. +* Add the `JAVA_HOME` environment variable to your shell using the `export` command. You can permanently set it by appending the `export` command to your shell configuration file `~/.zshrc` or `~/.bashrc` or other. ```shell - export JAVA_8_HOME=//jdk8u - export JAVA_11_HOME=//jdk-11. - export JAVA_17_HOME=//jdk-17. - export JAVA_21_HOME=//jdk-21. - export JAVA_25_HOME=//jdk-25. - export JAVA_GRAALVM17_HOME=//graalvm-jdk-17./Contents/Home - export JAVA_HOME=$JAVA_8_HOME + export JAVA_HOME=//jdk-21. ``` + + Gradle should automatically detect the JDK in usual places. As a fallback it can automatically provision them. * Restart your shell after applying the changes if you appended the commands to your shell configuration file. #### Windows -* Download and install JDK 8, 11, 17, 21, and 25 [Eclipse Temurin releases](https://adoptium.net/temurin/releases/). +* Download and install JDK 8, 11, 17, 21, and 25 from [Eclipse Temurin releases](https://adoptium.net/temurin/releases/).
Alternatively, install JDKs using winget or scoop. (click here to expand) @@ -142,18 +129,13 @@ Download and install JDK versions 8, 11, 17, 21 and 25, and GraalVM 17 for your
-* To add the required environment variables, run the following PowerShell commands for each SDK version, replacing the paths with the correct version installed: +* Set the `JAVA_HOME` environment variable, replacing the path with your JDK 21 installation: ```pwsh - [Environment]::SetEnvironmentVariable("JAVA_8_HOME", "C:\Program Files\Eclipse Adoptium\jdk-8.0.432.6-hotspot", [EnvironmentVariableTarget]::User) - [Environment]::SetEnvironmentVariable("JAVA_11_HOME", "C:\Program Files\Eclipse Adoptium\jdk-11.0.25.9-hotspot", [EnvironmentVariableTarget]::User) - [Environment]::SetEnvironmentVariable("JAVA_17_HOME", "C:\Program Files\Eclipse Adoptium\jdk-17.0.12.7-hotspot", [EnvironmentVariableTarget]::User) - [Environment]::SetEnvironmentVariable("JAVA_21_HOME", "C:\Program Files\Eclipse Adoptium\jdk-21.0.5.11-hotspot", [EnvironmentVariableTarget]::User) - [Environment]::SetEnvironmentVariable("JAVA_25_HOME", "C:\Program Files\Eclipse Adoptium\jdk-25.0.1.9-hotspot", [EnvironmentVariableTarget]::User) - - # JAVA_HOME = JAVA_8_HOME - [Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Eclipse Adoptium\jdk-8.0.432.6-hotspot", [EnvironmentVariableTarget]::User) + [Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Eclipse Adoptium\jdk-21.0.5.11-hotspot", [EnvironmentVariableTarget]::User) ``` + Gradle should automatically detect the JDK in usual places. As a fallback it can automatically provision them. + ### Install git #### macOS diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 85698bf5ffe..94b4dc3bb3d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,10 +50,10 @@ To run the formatting verify task only: For IntelliJ IDEA, we suggest the following settings and plugin. -The default JVM to build and run tests from the command line should be Java 8. +The default JVM to build and run tests from the command line should be Java 21. -* Use Java 8 to build and run tests: - * `Project Structure` -> `Project` -> `SDK` -> `Download JDK...` -> `Version: 1.8` -> `Download` +* Use Java 21 to build and run tests: + * `Project Structure` -> `Project` -> `SDK` -> `Download JDK...` -> `Version: 21` -> `Download` * Configure Java and Groovy import formatting: * `Settings...` ->`Editor` > `Code Style` > `Java` > `Imports` * `Use single class import`: checked @@ -82,11 +82,6 @@ The default JVM to build and run tests from the command line should be Java 8. * IntelliJ 2021.3 complains `Failed to find KotlinGradleProjectData for GradleSourceSetData` https://youtrack.jetbrains.com/issue/KTIJ-20173. * Switch to `IntelliJ IDEA CE 2021.2.3`. - -* IntelliJ Gradle fails to import the project with `JAVA_11_HOME must be set to build Java 11 code`. - * A workaround is to run IntelliJ from your terminal with `JAVA_11_HOME`. - * In order to verify what's visible from IntelliJ, use the `Add Configuration` bar and go - to `Add New` -> `Gradle` -> `Environmental Variables`. ## Pull request guidelines diff --git a/setup.ps1 b/setup.ps1 index e2fdb025fd1..61df67fa484 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -43,16 +43,9 @@ function TestJvm { Write-Host 'â„šī¸ Checking required JVM:' if (Test-Path 'env:JAVA_HOME') { - TestJvm 'JAVA_HOME' '1.8' + TestJvm 'JAVA_HOME' '21' } - -TestJvm 'JAVA_8_HOME' '1.8' -TestJvm 'JAVA_11_HOME' '11' -TestJvm 'JAVA_17_HOME' '17' -TestJvm 'JAVA_21_HOME' '21' -TestJvm 'JAVA_25_HOME' '25' -# GraalVM cannot currently be installed due to license change in October 2024 for GraalVM 17.0.13 and later. -# TestJvm 'JAVA_GRAALVM17_HOME' '17' +Write-Host 'â„šī¸ Other JDK versions will be automatically downloaded by Gradle toolchain resolver.' # Check for required commands (e.g., git, docker) function TestCommand { diff --git a/setup.sh b/setup.sh index fb4e03b6a14..cbb36e1482b 100755 --- a/setup.sh +++ b/setup.sh @@ -26,18 +26,13 @@ function check-jvm-from-path() { fi } -echo "â„šī¸ Checking required JVMs:" +echo "â„šī¸ Checking required JVM:" if [ -e "$JAVA_HOME" ]; then - check-jvm "JAVA_HOME" "1.8" + check-jvm "JAVA_HOME" "21" elif command -v java &> /dev/null; then - check-jvm-from-path "1.8" + check-jvm-from-path "21" fi -check-jvm "JAVA_8_HOME" "1.8" -check-jvm "JAVA_11_HOME" "11" -check-jvm "JAVA_17_HOME" "17" -check-jvm "JAVA_21_HOME" "21" -check-jvm "JAVA_25_HOME" "25" -check-jvm "JAVA_GRAALVM17_HOME" "17" +echo "â„šī¸ Other JDK versions will be automatically downloaded by Gradle toolchain resolver." # From f13392e02e701ba55f2619fa7f5e7d460f458ec6 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Wed, 14 Jan 2026 17:50:10 +0100 Subject: [PATCH 08/13] fix: In CI for JDK 8, java.home may point to the JRE directory (/usr/lib/jvm/8/jre) --- .../civisibility/CiVisibilitySmokeTest.groovy | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 703041761a2..2d5f331cc1e 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -28,7 +28,20 @@ abstract class CiVisibilitySmokeTest extends Specification { protected Path prefsDir protected static String buildJavaHome() { - return System.getProperty("java.home") + def javaHome = System.getProperty("java.home") + def javacPath = Paths.get(javaHome, "bin", "javac").toFile() + if (javacPath.exists()) { + return javaHome + } + // In CI for JDK 8, java.home may point to the JRE directory (e.g., /usr/lib/jvm/8/jre) + // The JDK with javac is in the parent directory + def parentDir = new File(javaHome).getParentFile() + def parentJavacPath = new File(parentDir, Paths.get("bin", "javac").toString()) + if (parentJavacPath.exists()) { + return parentDir.getAbsolutePath() + } + // Fallback to java.home and let callers handle the error if javac is not found + return javaHome } protected static String javaPath() { From 5ba7a073745445ffa4b5c1beca8f9f6a30a5739a Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 15 Jan 2026 11:38:07 +0100 Subject: [PATCH 09/13] chore: Replace buildSrc reliance on toolchain by setting compilation targets --- buildSrc/build.gradle.kts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 92365591b13..909dcb60999 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -6,9 +6,16 @@ plugins { id("com.diffplug.spotless") version "8.1.0" } +// The buildSrc still needs to target Java 8 as build time instrumentation and muzzle plugin +// allow to schedule workers on different JDK version. java { - toolchain { - languageVersion = JavaLanguageVersion.of(8) + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8) } } From b54568ac0b870e4a907326c223bec638669c474e Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 15 Jan 2026 11:40:00 +0100 Subject: [PATCH 10/13] chore: Allow Gradle Daemon auto-provisioning to work out of the box URLs are acquired from the foojay resolver, when running this task ./gradlew updateDaemonJvm --jvm-version=21 See https://docs.gradle.org/8.14.3/userguide/gradle_daemon.html#configuring_the_daemon_jvm --- gradle/gradle-daemon-jvm.properties | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties index 52234b5ce85..aee9a3c9b42 100644 --- a/gradle/gradle-daemon-jvm.properties +++ b/gradle/gradle-daemon-jvm.properties @@ -1 +1,12 @@ +#This file is generated by updateDaemonJvm `./gradlew updateDaemonJvm --jvm-version=21` +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/46949723aaa20c7b64d7ecfed7207034/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/d6690dfd71c4c91e08577437b5b2beb0/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/df211d3c3eefdc408b462041881bc575/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/b41931cf1e70bc8e08d7dd19c343ef00/redirect +toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/3cd7045fca9a72cd9bc7d14a385e594c/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/552c7bffe0370c66410a51c55985b511/redirect toolchainVersion=21 From 2c12ef8bac545738251c0759ff2d1d80e26d8f04 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 15 Jan 2026 12:27:10 +0100 Subject: [PATCH 11/13] chore: Improves doc wording --- BUILDING.md | 27 ++++++++++--------- CONTRIBUTING.md | 5 +--- .../spring-boot-2.7-webflux/build.gradle | 2 +- docs/how_instrumentations_work.md | 10 ++++++- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index a9190f60902..526a24e608b 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -48,37 +48,38 @@ If there is any issue with your output, check the requirements above and use the Requirements to build the full project: -* JDK 21 must be installed and `JAVA_HOME` must point to it. -* Other JDK versions (8, 11, 17, 25) will be automatically downloaded by Gradle's toolchain resolver. * The `git` command line must be installed. * A container runtime environment must be available to run all tests (e.g. Docker Desktop). ### Install the required JDK -Download and install JDK 21 for your OS. Other JDK versions will be automatically downloaded by Gradle when needed. +Gradle auto-provision needed JDKs locally. However, it still is possible to manage the JDK via other tools. #### macOS - -Use your JDK manager ([mise](https://mise.jdx.dev/), [sdkman](https://sdkman.io/), etc.) or set-up the required JDKs with `brew` +The following steps demonstrate how to use `brew`, but other version managers +such as [mise](https://mise.jdx.dev/) or [sdkman](https://sdkman.io/) work as well. * Install the required JDKs using `brew`: ```shell - brew install --cask zulu@8 zulu@11 zulu@17 zulu@21 zulu graalvm/tap/graalvm-ce-java17 + brew install --cask zulu@8 zulu@11 zulu@17 zulu@21 zulu@25 + ``` + + and if GraalVM is needed (17, 21, 25) + ```shell + brew install graalvm/tap/graalvm-community-java17 graalvm/tap/graalvm-community-jdk21 graalvm/tap/graalvm-community-jdk25 ``` * Identify your local version of GraalVM: ``` ls /Library/Java/JavaVirtualMachines | grep graalvm ``` - Example: `graalvm-ce-java17-22.3.1` -* Use this version in the following command to fix the GraalVM installation by [removing the quarantine flag](https://www.graalvm.org/latest/docs/getting-started/macos/): - ``` -* Add the `JAVA_HOME` environment variable to your shell using the `export` command. You can permanently set it by appending the `export` command to your shell configuration file `~/.zshrc` or `~/.bashrc` or other. + Example: `graalvm-community-openjdk-17` + + Use this version in the following command to fix the GraalVM installation by [removing the quarantine flag](https://www.graalvm.org/latest/docs/getting-started/macos/), e.g. : + ```shell - export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home + xattr -r -d com.apple.quarantine "/Library/Java/JavaVirtualMachines/graalvm-community-openjdk-17" ``` - - Gradle should automatically detect the JDK in usual places. As a fallback it can automatically provision them. * Restart your shell after applying the changes if you appended the command to your shell configuration file. > [!NOTE] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 94b4dc3bb3d..1399caf947a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,10 +50,6 @@ To run the formatting verify task only: For IntelliJ IDEA, we suggest the following settings and plugin. -The default JVM to build and run tests from the command line should be Java 21. - -* Use Java 21 to build and run tests: - * `Project Structure` -> `Project` -> `SDK` -> `Download JDK...` -> `Version: 21` -> `Download` * Configure Java and Groovy import formatting: * `Settings...` ->`Editor` > `Code Style` > `Java` > `Imports` * `Use single class import`: checked @@ -64,6 +60,7 @@ The default JVM to build and run tests from the command line should be Java 21. * top right Settings icon -> `Settings...` ->`Editor` > `Code Style` > `Groovy` > `Imports` * `Class count to use import with '*'`: `9999` (some number sufficiently large that is unlikely to matter) * `Names count to use static import with '*'`: `9999` +* To run test in a specific JDK use the `testJvm` property, e.g. `-PtestJvm=11` * Install the [Google Java Format](https://plugins.jetbrains.com/plugin/8527-google-java-format) plugin ### Troubleshooting diff --git a/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle index 17b9152b803..ec403dc3c20 100644 --- a/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.7-webflux/build.gradle @@ -11,7 +11,7 @@ def appBuildDir = "$buildDir/application" def isWindows = System.getProperty("os.name").toLowerCase().contains("win") def gradlewCommand = isWindows ? 'gradlew.bat' : 'gradlew' -// define the task that builds the quarkus project +// define the task that builds the project tasks.register('webfluxBuild', Exec) { workingDir "$appDir" environment += [ diff --git a/docs/how_instrumentations_work.md b/docs/how_instrumentations_work.md index c73b632723e..741783b445e 100644 --- a/docs/how_instrumentations_work.md +++ b/docs/how_instrumentations_work.md @@ -792,12 +792,20 @@ Sometimes it is necessary to force Gradle to discard cached test results and [re ./gradle test --rerun-tasks ``` -Running tests that require JDK-21 to be installed, use the `-PtestJvm=21` flag, for example: +Running tests that require JDK-21 can use the `-PtestJvm=21` flag (if not installed, Gradle will provision them), +for example: ```shell ./gradlew :dd-java-agent:instrumentation:aerospike-4.0:allLatestDepTests -PtestJvm=21 ``` +> [!TIP] +> The `testJvm` property also accept a path to a JVM home. E.g. +> +> ```shell +> /gradlew :dd-java-agent:instrumentation:an-insturmentation:test -PtestJvm=~/.local/share/mise/installs/java/openjdk-26.0.0-loom+1/ +> ``` + ### Latest Dependency Tests Adding a directive to the build file gives early warning when breaking changes are released by framework maintainers. From e55a0a4bc5484c13945dee36fa43962f699f6814 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 15 Jan 2026 12:28:12 +0100 Subject: [PATCH 12/13] chore: consistent setup actionable items across setup.sh and setup.ps1 --- setup.ps1 | 17 +++++++++++++++-- setup.sh | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/setup.ps1 b/setup.ps1 index 61df67fa484..3fbe956eeb3 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -91,10 +91,22 @@ function TestGitConfig { Write-Host "✅ git config $configName is set to $expectedValue." } elseif (-not $actualValue) { - Write-Host "❌ git config $configName is not set. Please set it to $expectedValue." -ForegroundColor Red + Write-Host "❌ git config $configName is not set. Please run 'git config set $configName $expectedValue'." -ForegroundColor Red } else { - Write-Host "🟨 git config $configName is set to $actualValue (expected: $expectedValue)." + Write-Host "🟨 git config $configName is set to $actualValue (expected: $expectedValue). Please run 'git config set $configName $expectedValue'." + } +} + +function TestSubmoduleInitialization { + if (Test-Path '.gitmodules') { + $uninitializedSubmodules = git submodule status | Select-String '^-' + if ($uninitializedSubmodules) { + Write-Host "❌ A git submodule are not initialized. Please run 'git submodule update --init --recursive'." -ForegroundColor Red + } + else { + Write-Host "✅ All git submodules are initialized." + } } } @@ -102,6 +114,7 @@ Write-Host 'â„šī¸ Checking git configuration:' TestCommand 'git' TestHook 'pre-commit' TestGitConfig 'submodule.recurse' 'true' +TestSubmoduleInitialization # Check Docker environment function TestDockerServer { diff --git a/setup.sh b/setup.sh index cbb36e1482b..5a978e9f45c 100755 --- a/setup.sh +++ b/setup.sh @@ -78,9 +78,9 @@ function check-git-config() { if [ "$ACTUAL_VALUE" == "$EXPECTED_VALUE" ]; then echo "✅ git config $CONFIG_NAME is set to $EXPECTED_VALUE." elif [ -z "$ACTUAL_VALUE" ]; then - echo "❌ git config $CONFIG_NAME is not set. Please locally set $CONFIG_NAME to $EXPECTED_VALUE." + echo "❌ git config $CONFIG_NAME is not set. Please run 'git config set $CONFIG_NAME $EXPECTED_VALUE'." else - echo "🟨 git config $CONFIG_NAME is set to $ACTUAL_VALUE (expected: $EXPECTED_VALUE)." + echo "🟨 git config $CONFIG_NAME is set to $ACTUAL_VALUE (expected: $EXPECTED_VALUE). Please run 'git config set $CONFIG_NAME $EXPECTED_VALUE'." fi } From e6645d3778cd8c3fa3cd4eebff16de8af9ed9e95 Mon Sep 17 00:00:00 2001 From: Brice Dutheil Date: Thu, 15 Jan 2026 13:29:13 +0100 Subject: [PATCH 13/13] chore: Tweak Test JVM spec to cover for ground for Gradle Toolchain being not enough --- .../plugin/testJvmConstraints/TestJvmSpec.kt | 16 +++++++++++++--- .../src/test/groovy/SslSocketTest.groovy | 5 +++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt index 9b0ec8a2115..6ed72e94510 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmSpec.kt @@ -1,6 +1,5 @@ package datadog.gradle.plugin.testJvmConstraints -import com.gradle.scan.agent.serialization.scan.serializer.kryo.it import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.internal.project.ProjectInternal @@ -83,9 +82,13 @@ class TestJvmSpec(val project: Project) { private val testJvmSpec = normalizedTestJvm.map { val (distribution, version) = Regex("([a-zA-Z]*)([0-9]+)").matchEntire(it)?.groupValues?.drop(1) ?: listOf("", "") + // Allow looking up JAVA__HOME environment variable (e.g., JAVA_IBM8_HOME, JAVA_SEMERU8_HOME), + // because gradle doesn't offer a way to distinguish ibm8 or semeru8 + val envVarValue = project.providers.environmentVariable("JAVA_${it.uppercase()}_HOME").orNull + when { Files.exists(Paths.get(it)) -> it.normalizeToJDKJavaHome().toToolchainSpec() - + envVarValue != null && Files.exists(Paths.get(envVarValue)) -> envVarValue.normalizeToJDKJavaHome().toToolchainSpec() version.isNotBlank() -> { // Best effort to make a spec for the passed testJvm // `8`, `11`, `ZULU8`, `GRAALVM25`, etc. @@ -104,7 +107,10 @@ class TestJvmSpec(val project: Project) { vendor.set(JvmVendorSpec.AZUL) } - "semeru" -> { + // Note: Both IBM and Semeru report java.vendor = "IBM Corporation", + // so JvmVendorSpec cannot distinguish them. Use JAVA_IBM8_HOME or + // JAVA_SEMERU8_HOME env vars for reliable selection. + "ibm", "semeru" -> { vendor.set(JvmVendorSpec.IBM) implementation.set(JvmImplementation.J9) } @@ -113,6 +119,10 @@ class TestJvmSpec(val project: Project) { vendor.set(JvmVendorSpec.GRAAL_VM) nativeImageCapable.set(true) } + + else -> { + throw GradleException("Unknown JVM distribution '$distribution'. Supported: oracle, zulu, ibm, semeru, graalvm.") + } } } } diff --git a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy index 8daf5d27896..7a652ad5927 100644 --- a/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy +++ b/dd-java-agent/instrumentation/java/java-net/java-net-1.8/src/test/groovy/SslSocketTest.groovy @@ -6,8 +6,13 @@ import datadog.trace.bootstrap.instrumentation.usm.UsmMessageFactory import java.lang.reflect.Field import javax.net.ssl.HttpsURLConnection import spock.lang.AutoCleanup +import spock.lang.Requires import spock.lang.Shared +// IBM JVM has different protocol support for TLS +@Requires({ + !System.getProperty("java.vm.name").contains("IBM J9 VM") +}) class SslSocketTest extends InstrumentationSpecification { @AutoCleanup @Shared