import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.github.jk1.license.filter.LicenseBundleNormalizer import com.github.jk1.license.render.InventoryMarkdownReportRenderer plugins { id("com.github.jk1.dependency-license-report") id("otel.java-conventions") id("otel.publish-conventions") id("io.opentelemetry.instrumentation.javaagent-shadowing") } description = "OpenTelemetry Javaagent" group = "io.opentelemetry.javaagent" val shadowInclude by configurations.creating { isCanBeResolved = true isCanBeConsumed = false } fun isolateSpec(projectsWithShadowJar: Collection): CopySpec = copySpec { from(projectsWithShadowJar.map { zipTree(it.tasks.getByName("shadowJar").archiveFile) }) { // important to keep prefix "inst" short, as it is prefixed to lots of strings in runtime mem into("inst") rename("""(^.*)\.class$""", "$1.classdata") // Rename LICENSE file since it clashes with license dir on non-case sensitive FSs (i.e. Mac) rename("""^LICENSE$""", "LICENSE.renamed") } } tasks { processResources.configure { from(rootProject.file("licenses")) { into("META-INF/licenses") } } //Includes everything needed for OOTB experience val shadowJar by existing(ShadowJar::class) { archiveClassifier.set("all") val projectsWithShadowJar = listOf(project(":instrumentation"), project(":javaagent-exporters")) projectsWithShadowJar.forEach { dependsOn("${it.path}:shadowJar") } with(isolateSpec(projectsWithShadowJar)) duplicatesStrategy = DuplicatesStrategy.EXCLUDE } //Includes instrumentations, but not exporters val lightShadow by registering(ShadowJar::class) { archiveClassifier.set("") dependsOn(":instrumentation:shadowJar") val projectsWithShadowJar = listOf(project(":instrumentation")) with(isolateSpec(projectsWithShadowJar)) } // lightShadow is the default classifier we publish so disable the default jar. jar.configure { enabled = false manifest { attributes( "Main-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent", "Agent-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent", "Premain-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent", "Can-Redefine-Classes" to true, "Can-Retransform-Classes" to true ) } } withType().configureEach { configurations = listOf(shadowInclude) manifest.inheritFrom(jar.get().manifest) } withType().configureEach { inputs.file(shadowJar.get().archiveFile) jvmArgs("-Dotel.javaagent.debug=true") doFirst { // Defining here to allow jacoco to be first on the command line. jvmArgs("-javaagent:${shadowJar.get().archivePath}") } testLogging { events("started") } dependsOn(shadowJar) } named("assemble") { dependsOn(lightShadow) dependsOn(shadowJar) } val cleanLicenses by registering(Delete::class) { delete(rootProject.file("licenses")) } named("generateLicenseReport").configure { dependsOn(cleanLicenses) } publishing { publications { named("maven") { artifact(lightShadow) } } } } val licenseReportDependencies by configurations.creating { extendsFrom(shadowInclude) } dependencies { testCompileOnly(project(":javaagent-bootstrap")) testCompileOnly(project(":javaagent-instrumentation-api")) testImplementation("com.google.guava:guava") testImplementation("io.opentracing.contrib.dropwizard:dropwizard-opentracing:0.2.2") shadowInclude(project(":javaagent-bootstrap")) shadowInclude(project(":instrumentation", configuration = "bootstrap")) // We only have compileOnly dependencies on these to make sure they don"t leak into POMs. licenseReportDependencies("com.github.ben-manes.caffeine:caffeine") { isTransitive = false } licenseReportDependencies("com.blogspot.mydailyjava:weak-lock-free") // TODO ideally this would be :instrumentation instead of :javaagent-tooling // in case there are dependencies (accidentally) pulled in by instrumentation modules // but I couldn"t get that to work licenseReportDependencies(project(":javaagent-tooling")) licenseReportDependencies(project(":javaagent-extension-api")) } licenseReport { outputDir = rootProject.file("licenses").absolutePath renderers = arrayOf(InventoryMarkdownReportRenderer()) configurations = arrayOf("licenseReportDependencies") excludeGroups = arrayOf( "io.opentelemetry.instrumentation", "io.opentelemetry.javaagent" ) filters = arrayOf(LicenseBundleNormalizer("$projectDir/license-normalizer-bundle.json", true)) }