{"record":{"id":"578d0fd08b33b17a","repo":"jenkinsci/jenkins","slug":"0-plugin-doesn-t-support-dynamic-loading-jenkin","errorCode":null,"errorMessage":"{0} plugin doesn’t support dynamic loading. Jenkins needs to be restarted for the update to take effect.","messagePattern":"(.+?) plugin doesn’t support dynamic loading\\. Jenkins needs to be restarted for the update to take effect\\.","errorType":"exception","errorClass":"RestartRequiredException","httpStatus":null,"severity":"warning","filePath":"core/src/main/java/hudson/PluginManager.java","lineNumber":956,"sourceCode":"                    for (Iterator<PluginWrapper> i = plugins.iterator(); i.hasNext();) {\n                        pw = i.next();\n                        if (sn.equals(pw.getShortName())) {\n                            i.remove();\n                            break;\n                        }\n                    }\n                } else {\n                    throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn));\n                }\n            }\n            if (!Lifecycle.get().supportsDynamicLoad()) {\n                throw new RestartRequiredException(Messages._PluginManager_LifecycleDoesNotSupportDynamicLoad_RestartRequired());\n            }\n            if (p == null) {\n                p = strategy.createPluginWrapper(arc);\n            }\n            if (p.supportsDynamicLoad() == YesNoMaybe.NO)\n                throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn));\n\n            // there's no need to do cyclic dependency check, because we are deploying one at a time,\n            // so existing plugins can't be depending on this newly deployed one.\n\n            plugins.add(p);\n            if (p.isActive()) {\n                activePlugins.add(p);\n                ((UberClassLoader) uberClassLoader).clearCacheMisses();\n            }\n\n            // TODO antimodular; perhaps should have a PluginListener to complement ExtensionListListener?\n            CustomClassFilter.Contributed.load();\n\n            try {\n                p.resolvePluginDependencies();\n                strategy.load(p);\n\n                if (batch != null) {","sourceCodeStart":938,"sourceCodeEnd":974,"githubUrl":"https://github.com/jenkinsci/jenkins/blob/2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc/core/src/main/java/hudson/PluginManager.java#L938-L974","documentation":"RestartRequiredException is thrown when the plugin being deployed declares supportsDynamicLoad() == YesNoMaybe.NO in its manifest (typically the Jenkins-Version / supportsDynamicLoad header is absent or explicitly set to false). The plugin was not designed to be loaded after Jenkins startup, so a restart is mandatory.","triggerScenarios":"Attempting to dynamically load a plugin whose manifest does not declare dynamic load support (missing or false 'Plugin-Timestamp' / the plugin predates the dynamic-load era).","commonSituations":"Installing an older plugin that was built before dynamic loading was standardized, or a plugin that explicitly opts out of dynamic load. The plugin author set supportsDynamicLoad to NO in the POM/hpi manifest.","solutions":["Restart Jenkins after installing the plugin instead of attempting dynamic load.","Update to a newer version of the plugin that supports dynamic loading.","If you own the plugin, add supportsDynamicLoad support or set the manifest header appropriately."],"exampleFix":"// before\npluginManager.dynamicLoad(arc);\n\n// after — check plugin capability\nif (p.supportsDynamicLoad() == YesNoMaybe.NO) {\n    // must restart; deploy without dynamic load\n    updateCenter.getPlugin(sn).deploy(false, correlationId);\n} else {\n    pluginManager.dynamicLoad(arc);\n}","handlingStrategy":"validation","validationCode":"if (p.supportsDynamicLoad() == YesNoMaybe.NO) {\n    listener.getLogger().println(\"Plugin does not support dynamic load; restart required.\");\n    // use restart-based deployment\n}","typeGuard":"public static boolean supportsDynamicLoad(PluginWrapper pw) {\n    return pw.supportsDynamicLoad() != YesNoMaybe.NO;\n}","tryCatchPattern":"try {\n    pluginManager.dynamicLoad(arc);\n} catch (RestartRequiredException e) {\n    if (e.getMessage().contains(\"doesn't support dynamic loading\")) {\n        updateCenter.getPlugin(sn).deploy(false, correlationId);\n    } else {\n        throw e;\n    }\n}","preventionTips":["Check supportsDynamicLoad() on the plugin wrapper before dynamic deployment.","Update plugins to versions that declare dynamic load support.","If you own the plugin, ensure the manifest declares supportsDynamicLoad."],"tags":["plugin-manager","dynamic-load","restart-required","plugin-manifest"],"backgroundTag":null,"analyzedSha":"2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc","analyzedAt":"2026-08-14T07:07:15.274Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}