What Plugin is providing this class?

Article ID:360004592631
1 minute readKnowledge base

Issue

  • You are writing a groovy script which uses a particular library, and the script is throwing a groovy.lang.MissingMethodException.

  • You are migrating jobs from one Jenkins instance to another. When your job runs, you see 'Unable to resolve class org.foo'.

  • You need to know which library is providing the class you are using.

Environment

  • CloudBees Jenkins Enterprise - Managed controller (CJE-MM)

  • CloudBees Jenkins Enterprise - Operations center (CJE-OC)

  • Jenkins LTS

Resolution

Jenkins has a complex, modular architecture which means each plugin gets its own ClassLoader which altogether form a hierarchy rooted at the Jenkins core ClassLoader. To locate the plugin which can load a specific class use the following Groovy script:

String className = "<enter fully qualified class name here>"

def clazzResource = className.replaceAll("\\.", "/") + ".class"
println "Looking for: ${clazzResource}\n"
Jenkins.instance.pluginManager.activePlugins.forEach { PluginWrapper plugin ->
    def c = plugin.classLoader.getResources(clazzResource)
    if (c.hasMoreElements()) {
        println "Found in ${plugin}"
        println Collections.list(c).join("\n") + "\n"
    }
}

println("Plugin order:")
Jenkins.instance.pluginManager.activePlugins.each{ it -> println(" " + it.shortName) }

return

For example, let’s say I would like to know which plugin is providing the snakeyaml Yaml utilities. Go to the Jenkins Script Console, paste the above script and replace the placeholder like this:

String className = "org.yaml.snakeyaml.Yaml"

You should see something similar as a result:

Looking for: org/yaml/snakeyaml/Yaml.class

Found in Plugin:blueocean-rest-impl
jar:file:/tmp/jenkins/plugins/blueocean-rest-impl/WEB-INF/lib/snakeyaml-1.10.jar!/org/yaml/snakeyaml/Yaml.class

Found in Plugin:kubernetes
jar:file:/tmp/jenkins/plugins/kubernetes/WEB-INF/lib/snakeyaml-1.15.jar!/org/yaml/snakeyaml/Yaml.class

...