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

  1. Restart Jenkins after installing the plugin instead of attempting dynamic load.
  2. Update to a newer version of the plugin that supports dynamic loading.
  3. 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

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


AI-assisted analysis of jenkinsci/jenkins@2e228ff40b (2026-08-14). Data as JSON: /api/errors/578d0fd08b33b17a. Report an issue: GitHub.