jenkinsci/jenkins · error · IOException

Plugin installation failed. No manifest at {}

Error message

Plugin installation failed. No manifest at {}

What it means

IOException thrown by ClassicPluginStrategy.createPluginWrapper after exploding a packed plugin archive: the expected META-INF/MANIFEST.MF is absent in the expanded directory. Jenkins requires every plugin to ship a manifest with at least its Short-Name; without it, installation cannot proceed.

Source

Thrown at core/src/main/java/hudson/ClassicPluginStrategy.java:170

        URL baseResourceURL;
        File expandDir = null;
        // if .hpi, this is the directory where war is expanded

        boolean isLinked = isLinked(archive);
        if (isLinked) {
            manifest = loadLinkedManifest(archive);
        } else {
            if (archive.isDirectory()) { // already expanded
                expandDir = archive;
            } else {
                File f = pluginManager.getWorkDir();
                expandDir =  new File(f == null ? archive.getParentFile() : f, getBaseName(archive.getName()));
                explode(archive, expandDir);
            }

            File manifestFile = new File(expandDir, PluginWrapper.MANIFEST_FILENAME);
            if (!manifestFile.exists()) {
                throw new IOException(
                        "Plugin installation failed. No manifest at "
                                + manifestFile);
            }
            try (InputStream fin = Files.newInputStream(manifestFile.toPath())) {
                manifest = new Manifest(fin);
            } catch (InvalidPathException e) {
                throw new IOException(e);
            }
            String canonicalName = manifest.getMainAttributes().getValue("Short-Name") + ".jpi";
            if (!archive.getName().equals(canonicalName)) {
                LOGGER.warning(() -> "encountered " + archive + " under a nonstandard name; expected " + canonicalName);
            }
        }

        final Attributes atts = manifest.getMainAttributes();

        // TODO: define a mechanism to hide classes
        // String export = manifest.getMainAttributes().getValue("Export");

View on GitHub (pinned to 2e228ff40b)

Solutions

  1. Confirm the plugin ships a manifest: 'unzip -p plugin.jpi META-INF/MANIFEST.MF' should print attributes including Short-Name.
  2. Clear the exploded directory and the corrupt archive, then reinstall the plugin from the update center.
  3. Check disk space and permissions in the Jenkins work directory so explosion can complete.
Defensive patterns

Strategy: validation

Validate before calling

File manifestFile = new File(expandDir, PluginWrapper.MANIFEST_FILENAME);
if (!manifestFile.exists()) {
    throw new IOException("No manifest in " + archive + "; not a valid Jenkins plugin");
}

Try / catch

try {
    strategy.createPluginWrapper(archive);
} catch (IOException e) {
    if (e.getMessage().contains("No manifest")) {
        // delete the bad archive and reinstall from the update center
    }
}

Prevention

When it happens

Trigger: A plugin archive that is a valid ZIP but is missing META-INF/MANIFEST.MF, or explosion failed silently leaving an incomplete directory, or MANIFEST_FILENAME points elsewhere.

Common situations: Hand-crafted or repackaged .jpi without a manifest; a partial explode due to disk-full/permissions; a ZIP that is not actually a Jenkins plugin.

Related errors


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