From 2b5c09a22bbc8c473044e0b4a2a6578f5e86d7a1 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 7 Jul 2026 19:36:54 +0200 Subject: [PATCH 1/3] feat(agent): Improve cacheability of shadowJar task --- dd-java-agent/build.gradle | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index 38b686c76ab..c56bcbd705d 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -1,4 +1,7 @@ +import static org.gradle.api.file.DuplicatesStrategy.INCLUDE + import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.github.jengelman.gradle.plugins.shadow.transformers.PreserveFirstFoundResourceTransformer import java.util.concurrent.atomic.AtomicBoolean import java.util.jar.JarFile @@ -83,21 +86,19 @@ def generalShadowJarConfig(ShadowJar shadowJarTask) { mergeServiceFiles() addMultiReleaseAttribute = false - duplicatesStrategy = DuplicatesStrategy.FAIL - // Service descriptors are intentionally merged by mergeServiceFiles(); let - // duplicate service entries reach that transformer instead of failing first. - filesMatching('META-INF/services/**') { - duplicatesStrategy = DuplicatesStrategy.INCLUDE - } - // Vendored dependencies often repeat license/notice metadata. Keep one copy - // while still failing on unexpected duplicate runtime resources and classes. - filesMatching([ - 'META-INF/LICENSE*', - 'META-INF/NOTICE*', - 'META-INF/AL2.0', - 'META-INF/LGPL2.1', - ]) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE + // Allow duplicate to merge service files + duplicatesStrategy = INCLUDE + // Ensure there is no duplicate in the final jar after resource transformer applied + failOnDuplicateEntries.set(true) + + // Vendored dependencies repeat license/notice metadata; keep a single copy + transform(PreserveFirstFoundResourceTransformer) { + it.resources.addAll( + 'META-INF/LICENSE*', + 'META-INF/NOTICE*', + 'META-INF/AL2.0', + 'META-INF/LGPL2.1', + ) } // Remove some cruft from the final jar. From 88ae3e47b9390d4b4e1ea3af90210cbcd25f3f8d Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Wed, 8 Jul 2026 11:57:58 +0200 Subject: [PATCH 2/3] fix(agent): Address PR feedback --- dd-java-agent/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index c56bcbd705d..a55735f7a47 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -89,11 +89,11 @@ def generalShadowJarConfig(ShadowJar shadowJarTask) { // Allow duplicate to merge service files duplicatesStrategy = INCLUDE // Ensure there is no duplicate in the final jar after resource transformer applied - failOnDuplicateEntries.set(true) + failOnDuplicateEntries = true // Vendored dependencies repeat license/notice metadata; keep a single copy transform(PreserveFirstFoundResourceTransformer) { - it.resources.addAll( + it.include( 'META-INF/LICENSE*', 'META-INF/NOTICE*', 'META-INF/AL2.0', From dcf15a0e0d534366a1c129d467a2566441593b77 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Wed, 8 Jul 2026 13:47:18 +0200 Subject: [PATCH 3/3] feat(build): Improve cacheability of shadowJar task --- .../build.gradle.kts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 82b9466d1bb..80097f55629 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -1,3 +1,7 @@ +import com.github.jengelman.gradle.plugins.shadow.transformers.ApacheLicenseResourceTransformer +import com.github.jengelman.gradle.plugins.shadow.transformers.ApacheNoticeResourceTransformer +import org.gradle.api.file.DuplicatesStrategy.INCLUDE + plugins { java id("com.diffplug.spotless") version "8.4.0" @@ -69,11 +73,11 @@ tasks { } shadowJar { - duplicatesStrategy = DuplicatesStrategy.FAIL - // Let's skip license/notice since this jar's only use is during build - filesMatching(listOf("META-INF/LICENSE*", "META-INF/NOTICE*")) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - } + duplicatesStrategy = INCLUDE + transform() + transform() + failOnDuplicateEntries = true + manifest { attributes(mapOf("Main-Class" to "datadog.trace.plugin.csi.PluginApplication")) }