33 * SPDX-License-Identifier: Apache-2.0
44 */
55
6+
7+ import org.gradle.api.file.FileCollection
8+
69import java.lang.reflect.Method
710import java.security.SecureClassLoader
811import java.util.concurrent.atomic.AtomicReference
@@ -31,6 +34,8 @@ import org.gradle.api.Project
3134import org.gradle.api.Task
3235import org.gradle.api.model.ObjectFactory
3336
37+ import java.util.stream.StreamSupport
38+
3439/**
3540 * muzzle task plugin which runs muzzle validation against a range of dependencies.
3641 */
@@ -75,7 +80,7 @@ class MuzzlePlugin implements Plugin<Project> {
7580 project. getLogger(). info(' No muzzle pass directives configured. Asserting pass against instrumentation compile-time dependencies' )
7681 ClassLoader userCL = createCompileDepsClassLoader(project, bootstrapProject)
7782 ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject)
78- Method assertionMethod = instrumentationCL. loadClass(' io.opentelemetry.javaagent.tooling. muzzle.matcher.MuzzleGradlePluginUtil' )
83+ Method assertionMethod = instrumentationCL. loadClass(' io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil' )
7984 .getMethod(' assertInstrumentationMuzzled' , ClassLoader . class, ClassLoader . class, boolean . class)
8085 assertionMethod. invoke(null , instrumentationCL, userCL, true )
8186 }
@@ -87,7 +92,7 @@ class MuzzlePlugin implements Plugin<Project> {
8792 description = " Print references created by instrumentation muzzle"
8893 doLast {
8994 ClassLoader instrumentationCL = createInstrumentationClassloader(project, toolingProject)
90- Method assertionMethod = instrumentationCL. loadClass(' io.opentelemetry.javaagent.tooling. muzzle.matcher.MuzzleGradlePluginUtil' )
95+ Method assertionMethod = instrumentationCL. loadClass(' io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil' )
9196 .getMethod(' printMuzzleReferences' , ClassLoader . class)
9297 assertionMethod. invoke(null , instrumentationCL)
9398 }
@@ -167,7 +172,8 @@ class MuzzlePlugin implements Plugin<Project> {
167172 private static ClassLoader createInstrumentationClassloader (Project project , Project toolingProject ) {
168173 project. getLogger(). info(" Creating instrumentation classpath for: " + project. getName())
169174 Set<URL > urls = new HashSet<> ()
170- for (File f : project. sourceSets. main. runtimeClasspath. getFiles()) {
175+ FileCollection classpath = project. sourceSets. main. runtimeClasspath + toolingProject. configurations. named(" instrumentationMuzzle" ). get()
176+ StreamSupport . stream(classpath. spliterator(), false ). forEach { f ->
171177 project. getLogger(). info(' --' + f)
172178 urls. add(f. toURI(). toURL())
173179 }
@@ -370,26 +376,19 @@ class MuzzlePlugin implements Plugin<Project> {
370376 doLast {
371377 ClassLoader instrumentationCL = createInstrumentationClassloader(instrumentationProject, toolingProject)
372378 def ccl = Thread . currentThread(). contextClassLoader
373- def bogusLoader = new SecureClassLoader () {
374- @Override
375- String toString () {
376- return " bogus"
377- }
378-
379- }
380- Thread . currentThread(). contextClassLoader = bogusLoader
379+ Thread . currentThread(). contextClassLoader = instrumentationCL
381380 ClassLoader userCL = createClassLoaderForTask(instrumentationProject, bootstrapProject, taskName)
382381 try {
383382 // find all instrumenters, get muzzle, and assert
384- Method assertionMethod = instrumentationCL. loadClass(' io.opentelemetry.javaagent.tooling. muzzle.matcher.MuzzleGradlePluginUtil' )
383+ Method assertionMethod = instrumentationCL. loadClass(' io.opentelemetry.javaagent.muzzle.matcher.MuzzleGradlePluginUtil' )
385384 .getMethod(' assertInstrumentationMuzzled' , ClassLoader . class, ClassLoader . class, boolean . class)
386385 assertionMethod. invoke(null , instrumentationCL, userCL, muzzleDirective. assertPass)
387386 } finally {
388387 Thread . currentThread(). contextClassLoader = ccl
389388 }
390389
391390 for (Thread thread : Thread . getThreads()) {
392- if (thread. contextClassLoader == bogusLoader || thread . contextClassLoader == instrumentationCL || thread. contextClassLoader == userCL) {
391+ if (thread. contextClassLoader == instrumentationCL || thread. contextClassLoader == userCL) {
393392 throw new GradleException (" Task $taskName has spawned a thread: $thread with classloader $thread . contextClassLoader . This will prevent GC of dynamic muzzle classes. Aborting muzzle run." )
394393 }
395394 }
0 commit comments