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")) } diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index 38b686c76ab..a55735f7a47 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 = true + + // Vendored dependencies repeat license/notice metadata; keep a single copy + transform(PreserveFirstFoundResourceTransformer) { + it.include( + 'META-INF/LICENSE*', + 'META-INF/NOTICE*', + 'META-INF/AL2.0', + 'META-INF/LGPL2.1', + ) } // Remove some cruft from the final jar.