jenkinsci/jenkins · warning · RestartRequiredException
{0} plugin doesn’t support dynamic loading. Jenkins needs to
Error message
{0} plugin doesn’t support dynamic loading. Jenkins needs to be restarted for the update to take effect. What it means
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.
Source
Thrown at core/src/main/java/hudson/PluginManager.java:956
for (Iterator<PluginWrapper> i = plugins.iterator(); i.hasNext();) {
pw = i.next();
if (sn.equals(pw.getShortName())) {
i.remove();
break;
}
}
} else {
throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn));
}
}
if (!Lifecycle.get().supportsDynamicLoad()) {
throw new RestartRequiredException(Messages._PluginManager_LifecycleDoesNotSupportDynamicLoad_RestartRequired());
}
if (p == null) {
p = strategy.createPluginWrapper(arc);
}
if (p.supportsDynamicLoad() == YesNoMaybe.NO)
throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn));
// there's no need to do cyclic dependency check, because we are deploying one at a time,
// so existing plugins can't be depending on this newly deployed one.
plugins.add(p);
if (p.isActive()) {
activePlugins.add(p);
((UberClassLoader) uberClassLoader).clearCacheMisses();
}
// TODO antimodular; perhaps should have a PluginListener to complement ExtensionListListener?
CustomClassFilter.Contributed.load();
try {
p.resolvePluginDependencies();
strategy.load(p);
if (batch != null) {View on GitHub (pinned to 2e228ff40b)
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.
Example fix
// before
pluginManager.dynamicLoad(arc);
// after — check plugin capability
if (p.supportsDynamicLoad() == YesNoMaybe.NO) {
// must restart; deploy without dynamic load
updateCenter.getPlugin(sn).deploy(false, correlationId);
} else {
pluginManager.dynamicLoad(arc);
} Defensive patterns
Strategy: validation
Validate before calling
if (p.supportsDynamicLoad() == YesNoMaybe.NO) {
listener.getLogger().println("Plugin does not support dynamic load; restart required.");
// use restart-based deployment
} Type guard
public static boolean supportsDynamicLoad(PluginWrapper pw) {
return pw.supportsDynamicLoad() != YesNoMaybe.NO;
} Try / catch
try {
pluginManager.dynamicLoad(arc);
} catch (RestartRequiredException e) {
if (e.getMessage().contains("doesn't support dynamic loading")) {
updateCenter.getPlugin(sn).deploy(false, correlationId);
} else {
throw e;
}
} Prevention
- 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.
When it happens
Trigger: 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).
Common situations: 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.
Related errors
- {0} plugin is already installed. Jenkins needs to be restart
- This Jenkins lifecycle does not support dynamic loading of p
- Failed to install {0} plugin
- Failed to refresh extensions after installing some plugins
- Ambiguous plugin: {0}
AI-assisted analysis of jenkinsci/jenkins@2e228ff40b (2026-08-14).
Data as JSON: /api/errors/578d0fd08b33b17a.
Report an issue: GitHub.