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

...
This article is part of our Knowledge Base and is provided for guidance-based purposes only. The solutions or workarounds described here are not officially supported by CloudBees and may not be applicable in all environments. Use at your own discretion, and test changes in a safe environment before applying them to production systems.