{"record":{"id":"4ad8fff8e1836b9c","repo":"jenkinsci/jenkins","slug":"plugin-installation-failed-no-manifest-at","errorCode":null,"errorMessage":"Plugin installation failed. No manifest at {}","messagePattern":"Plugin installation failed\\. No manifest at (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/hudson/ClassicPluginStrategy.java","lineNumber":170,"sourceCode":"        URL baseResourceURL;\n        File expandDir = null;\n        // if .hpi, this is the directory where war is expanded\n\n        boolean isLinked = isLinked(archive);\n        if (isLinked) {\n            manifest = loadLinkedManifest(archive);\n        } else {\n            if (archive.isDirectory()) { // already expanded\n                expandDir = archive;\n            } else {\n                File f = pluginManager.getWorkDir();\n                expandDir =  new File(f == null ? archive.getParentFile() : f, getBaseName(archive.getName()));\n                explode(archive, expandDir);\n            }\n\n            File manifestFile = new File(expandDir, PluginWrapper.MANIFEST_FILENAME);\n            if (!manifestFile.exists()) {\n                throw new IOException(\n                        \"Plugin installation failed. No manifest at \"\n                                + manifestFile);\n            }\n            try (InputStream fin = Files.newInputStream(manifestFile.toPath())) {\n                manifest = new Manifest(fin);\n            } catch (InvalidPathException e) {\n                throw new IOException(e);\n            }\n            String canonicalName = manifest.getMainAttributes().getValue(\"Short-Name\") + \".jpi\";\n            if (!archive.getName().equals(canonicalName)) {\n                LOGGER.warning(() -> \"encountered \" + archive + \" under a nonstandard name; expected \" + canonicalName);\n            }\n        }\n\n        final Attributes atts = manifest.getMainAttributes();\n\n        // TODO: define a mechanism to hide classes\n        // String export = manifest.getMainAttributes().getValue(\"Export\");","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/jenkinsci/jenkins/blob/2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc/core/src/main/java/hudson/ClassicPluginStrategy.java#L152-L188","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Confirm the plugin ships a manifest: 'unzip -p plugin.jpi META-INF/MANIFEST.MF' should print attributes including Short-Name.","Clear the exploded directory and the corrupt archive, then reinstall the plugin from the update center.","Check disk space and permissions in the Jenkins work directory so explosion can complete."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"File manifestFile = new File(expandDir, PluginWrapper.MANIFEST_FILENAME);\nif (!manifestFile.exists()) {\n    throw new IOException(\"No manifest in \" + archive + \"; not a valid Jenkins plugin\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    strategy.createPluginWrapper(archive);\n} catch (IOException e) {\n    if (e.getMessage().contains(\"No manifest\")) {\n        // delete the bad archive and reinstall from the update center\n    }\n}","preventionTips":["Only install plugins that ship META-INF/MANIFEST.MF with a Short-Name.","Ensure adequate disk space and permissions in the work directory.","Validate plugins before deployment in CI."],"tags":["jenkins","plugin-loading","manifest","installation"],"backgroundTag":null,"analyzedSha":"2e228ff40b14dbc8b14ffbc6edf0e4383cf744fc","analyzedAt":"2026-08-14T07:07:15.274Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}