{"record":{"id":"38e5b06eb34c6ae5","repo":"apache/maven","slug":"no-plugin-descriptor-found-at-plugindescriptorlo","errorCode":null,"errorMessage":"No plugin descriptor found at ${pluginDescriptorLocation}","messagePattern":"No plugin descriptor found at (.+?)","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java","lineNumber":256,"sourceCode":"\n                    if (pluginDescriptorEntry != null) {\n                        pluginDescriptor = parsePluginDescriptor(\n                                () -> pluginJar.getInputStream(pluginDescriptorEntry),\n                                plugin,\n                                pluginFile.getAbsolutePath());\n                    }\n                }\n            } else {\n                File pluginXml = new File(pluginFile, getPluginDescriptorLocation());\n\n                if (pluginXml.isFile()) {\n                    pluginDescriptor = parsePluginDescriptor(\n                            () -> Files.newInputStream(pluginXml.toPath()), plugin, pluginXml.getAbsolutePath());\n                }\n            }\n\n            if (pluginDescriptor == null) {\n                throw new IOException(\"No plugin descriptor found at \" + getPluginDescriptorLocation());\n            }\n        } catch (IOException e) {\n            throw new PluginDescriptorParsingException(plugin, pluginFile.getAbsolutePath(), e);\n        }\n\n        List<String> errors = new ArrayList<>();\n        pluginValidator.validate(pluginArtifact, pluginDescriptor, errors);\n\n        if (!errors.isEmpty()) {\n            throw new InvalidPluginDescriptorException(\n                    \"Invalid plugin descriptor for \" + plugin.getId() + \" (\" + pluginFile + \")\", errors);\n        }\n\n        pluginDescriptor.setPluginArtifact(pluginArtifact);\n\n        return pluginDescriptor;\n    }\n","sourceCodeStart":238,"sourceCodeEnd":274,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java#L238-L274","documentation":"Maven looked for the plugin descriptor at META-INF/maven/plugin.xml - as a jar entry of the plugin artifact and, for a directory-based plugin file, as a plain file - and found nothing. Without plugin.xml there are no mojos to execute, so the IOException is wrapped into PluginDescriptorParsingException and the build fails.","triggerScenarios":"The resolved coordinates are not a Maven plugin at all (a plain library jar invoked as groupId:artifactId:version:goal); the jar was built with packaging 'jar' instead of 'maven-plugin' so the descriptor was never generated; or the artifact in the local repository is corrupt/empty.","commonSituations":"Typo'd groupId/artifactId that still resolves to an existing library; plugin prefix resolution mapping to the wrong artifact; partial downloads after network failures; goals that moved to a different artifactId in newer releases.","solutions":["Confirm the coordinates refer to a real Maven plugin: check its documentation or metadata for packaging maven-plugin and a goal list.","Invoke the goal in full groupId:artifactId:version:goal form to bypass prefix guessing.","Delete the artifact's folder under ~/.m2/repository and rebuild with -U to force a clean re-download.","For your own plugin, set <packaging>maven-plugin</packaging> so plugin.xml is generated into META-INF/maven."],"exampleFix":"<!-- before -->\n<packaging>jar</packaging>\n<!-- after -->\n<packaging>maven-plugin</packaging>","handlingStrategy":"validation","validationCode":"ART=\"$HOME/.m2/repository/<group-path>/<artifactId>/<version>/<artifactId>-<version>.jar\"\nunzip -l \"$ART\" | grep -q 'META-INF/maven/plugin.xml' \\\n  || { echo \"not a maven plugin (no descriptor): $ART\"; exit 1; }","typeGuard":null,"tryCatchPattern":"try {\n    descriptor = pluginManager.getPluginDescriptor(plugin, repos, session.getRepositorySession());\n} catch (PluginDescriptorParsingException e) {\n    // check packaging of the coordinates before assuming a network problem\n    throw new IllegalArgumentException(plugin.getId() + \" is not resolvable as a plugin\", e);\n}","preventionTips":["Use fully-qualified groupId:artifactId:version:goal identifiers in CI scripts","Verify unfamiliar plugins with g:a:v:help before wiring them into the build","Author plugins only with packaging maven-plugin"],"tags":["maven","plugin","descriptor","artifact","packaging"],"backgroundTag":"maven-plugin-descriptor-missing","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}