{"record":{"id":"6cc51cc877d6a736","repo":"apache/maven","slug":"parametername-has-been-declared-multiple-times-i","errorCode":null,"errorMessage":"{parameterName} has been declared multiple times in mojo with goal: {goal} (implementation: {implementation})","messagePattern":"(.+?) has been declared multiple times in mojo with goal: (.+?) \\(implementation: (.+?)\\)","errorType":"exception","errorClass":"DuplicateParameterException","httpStatus":null,"severity":"error","filePath":"compat/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java","lineNumber":235,"sourceCode":"\n    /**\n     * @param parameters the new list of parameters\n     * @throws DuplicateParameterException if any\n     */\n    public void setParameters(List<Parameter> parameters) throws DuplicateParameterException {\n        this.parameters.clear();\n        for (Parameter parameter : parameters) {\n            addParameter(parameter);\n        }\n    }\n\n    /**\n     * @param parameter add a new parameter\n     * @throws DuplicateParameterException if any\n     */\n    public void addParameter(Parameter parameter) throws DuplicateParameterException {\n        if (parameters.contains(parameter)) {\n            throw new DuplicateParameterException(parameter.getName()\n                    + \" has been declared multiple times in mojo with goal: \" + getGoal() + \" (implementation: \"\n                    + getImplementation() + \")\");\n        }\n\n        parameters.add(parameter);\n    }\n\n    /**\n     * @return the list parameters as a Map (keyed by {@link Parameter#getName()}) that is built from\n     * {@link #parameters} list on each call. In other words, the map returned is built on fly and is a copy.\n     * Any change to this map is NOT reflected on list and other way around!\n     */\n    public Map<String, Parameter> getParameterMap() {\n        LinkedHashMap<String, Parameter> parameterMap = new LinkedHashMap<>();\n\n        for (Parameter pd : parameters) {\n            parameterMap.put(pd.getName(), pd);\n        }","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/compat/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java#L217-L253","documentation":"MojoDescriptor.addParameter rejects a Parameter that is already present (the internal list uses Parameter equality, effectively by name). Plugin descriptor assembly, whether from plugin.xml or extracted annotations, hits this when one mojo declares the same parameter name twice.","triggerScenarios":"plugin.xml with two <parameter> entries of the same name for one mojo; two @Parameter members whose configured names collide; programmatic descriptor building calling addParameter twice for the same name.","commonSituations":"Copy-pasted plugin.xml blocks; refactors that renamed a field but kept the old name via @Parameter(name=...); hand-merging descriptor fragments.","solutions":["Remove or rename the duplicate <parameter> entry in plugin.xml","Search the mojo source for two @Parameter members resolving to the same name (explicit name= or identical field names)","Regenerate plugin.xml with current maven-plugin-tools instead of hand-merging","When building descriptors programmatically, check descriptor.getParameterMap().containsKey(name) before addParameter"],"exampleFix":"<!-- before: plugin.xml declares the same parameter twice -->\n<mojo>\n  <goal>deploy</goal>\n  <parameters>\n    <parameter><name>target</name></parameter>\n    <parameter><name>target</name></parameter>\n  </parameters>\n</mojo>\n\n<!-- after: one entry per parameter name -->\n<mojo>\n  <goal>deploy</goal>\n  <parameters>\n    <parameter><name>target</name></parameter>\n    <parameter><name>mode</name></parameter>\n  </parameters>\n</mojo>","handlingStrategy":"validation","validationCode":"// Guard programmatic descriptor assembly\nif (mojoDescriptor.getParameterMap().containsKey(parameter.getName())) {\n    throw new IllegalArgumentException(\n        \"Duplicate parameter in plugin.xml: \" + parameter.getName());\n}\nmojoDescriptor.addParameter(parameter);","typeGuard":"static boolean isDuplicateParameter(MojoDescriptor d, Parameter p) {\n    return d.getParameterMap().containsKey(p.getName());\n}","tryCatchPattern":null,"preventionTips":["Never hand-edit plugin.xml generated by maven-plugin-tools; regenerate instead","Make @Parameter(name=...) explicit whenever two fields could collide","Lint descriptors in CI: assert unique parameter names per mojo"],"tags":["maven","plugin-descriptor","duplicate","mojo-parameter","validation"],"backgroundTag":"duplicate-declaration","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}