build.gradle.kts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
  2. import com.github.jk1.license.filter.LicenseBundleNormalizer
  3. import com.github.jk1.license.render.InventoryMarkdownReportRenderer
  4. plugins {
  5. id("com.github.jk1.dependency-license-report")
  6. id("otel.java-conventions")
  7. id("otel.publish-conventions")
  8. id("io.opentelemetry.instrumentation.javaagent-shadowing")
  9. }
  10. description = "OpenTelemetry Javaagent"
  11. group = "io.opentelemetry.javaagent"
  12. val shadowInclude by configurations.creating {
  13. isCanBeResolved = true
  14. isCanBeConsumed = false
  15. }
  16. fun isolateSpec(projectsWithShadowJar: Collection<Project>): CopySpec = copySpec {
  17. from(projectsWithShadowJar.map { zipTree(it.tasks.getByName<ShadowJar>("shadowJar").archiveFile) }) {
  18. // important to keep prefix "inst" short, as it is prefixed to lots of strings in runtime mem
  19. into("inst")
  20. rename("""(^.*)\.class$""", "$1.classdata")
  21. // Rename LICENSE file since it clashes with license dir on non-case sensitive FSs (i.e. Mac)
  22. rename("""^LICENSE$""", "LICENSE.renamed")
  23. }
  24. }
  25. tasks {
  26. processResources.configure {
  27. from(rootProject.file("licenses")) {
  28. into("META-INF/licenses")
  29. }
  30. }
  31. //Includes everything needed for OOTB experience
  32. val shadowJar by existing(ShadowJar::class) {
  33. archiveClassifier.set("all")
  34. val projectsWithShadowJar = listOf(project(":instrumentation"), project(":javaagent-exporters"))
  35. projectsWithShadowJar.forEach {
  36. dependsOn("${it.path}:shadowJar")
  37. }
  38. with(isolateSpec(projectsWithShadowJar))
  39. duplicatesStrategy = DuplicatesStrategy.EXCLUDE
  40. }
  41. //Includes instrumentations, but not exporters
  42. val lightShadow by registering(ShadowJar::class) {
  43. archiveClassifier.set("")
  44. dependsOn(":instrumentation:shadowJar")
  45. val projectsWithShadowJar = listOf(project(":instrumentation"))
  46. with(isolateSpec(projectsWithShadowJar))
  47. }
  48. // lightShadow is the default classifier we publish so disable the default jar.
  49. jar.configure {
  50. enabled = false
  51. manifest {
  52. attributes(
  53. "Main-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent",
  54. "Agent-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent",
  55. "Premain-Class" to "io.opentelemetry.javaagent.OpenTelemetryAgent",
  56. "Can-Redefine-Classes" to true,
  57. "Can-Retransform-Classes" to true
  58. )
  59. }
  60. }
  61. withType<ShadowJar>().configureEach {
  62. configurations = listOf(shadowInclude)
  63. manifest.inheritFrom(jar.get().manifest)
  64. }
  65. withType<Test>().configureEach {
  66. inputs.file(shadowJar.get().archiveFile)
  67. jvmArgs("-Dotel.javaagent.debug=true")
  68. doFirst {
  69. // Defining here to allow jacoco to be first on the command line.
  70. jvmArgs("-javaagent:${shadowJar.get().archivePath}")
  71. }
  72. testLogging {
  73. events("started")
  74. }
  75. dependsOn(shadowJar)
  76. }
  77. named("assemble") {
  78. dependsOn(lightShadow)
  79. dependsOn(shadowJar)
  80. }
  81. val cleanLicenses by registering(Delete::class) {
  82. delete(rootProject.file("licenses"))
  83. }
  84. named("generateLicenseReport").configure {
  85. dependsOn(cleanLicenses)
  86. }
  87. publishing {
  88. publications {
  89. named<MavenPublication>("maven") {
  90. artifact(lightShadow)
  91. }
  92. }
  93. }
  94. }
  95. val licenseReportDependencies by configurations.creating
  96. dependencies {
  97. testCompileOnly(project(":javaagent-bootstrap"))
  98. testCompileOnly(project(":javaagent-api"))
  99. testImplementation("com.google.guava:guava")
  100. testImplementation("io.opentracing.contrib.dropwizard:dropwizard-opentracing:0.2.2")
  101. shadowInclude(project(":javaagent-bootstrap"))
  102. // We only have compileOnly dependencies on these to make sure they don"t leak into POMs.
  103. licenseReportDependencies("com.github.ben-manes.caffeine:caffeine") {
  104. isTransitive = false
  105. }
  106. licenseReportDependencies("com.blogspot.mydailyjava:weak-lock-free")
  107. // TODO ideally this would be :instrumentation instead of :javaagent-tooling
  108. // in case there are dependencies (accidentally) pulled in by instrumentation modules
  109. // but I couldn"t get that to work
  110. licenseReportDependencies(project(":javaagent-tooling"))
  111. licenseReportDependencies(project(":javaagent-extension-api"))
  112. licenseReportDependencies(project(":javaagent-bootstrap"))
  113. }
  114. licenseReport {
  115. outputDir = rootProject.file("licenses").absolutePath
  116. renderers = arrayOf(InventoryMarkdownReportRenderer())
  117. configurations = arrayOf("licenseReportDependencies")
  118. excludeGroups = arrayOf(
  119. "io.opentelemetry.instrumentation",
  120. "io.opentelemetry.javaagent"
  121. )
  122. filters = arrayOf(LicenseBundleNormalizer("$projectDir/license-normalizer-bundle.json", true))
  123. }