{"record":{"id":"eacccf2128d43d49","repo":"apache/maven","slug":"duplicated-tag-extensions","errorCode":null,"errorMessage":"Duplicated tag: 'extensions'","messagePattern":"Duplicated tag: 'extensions'","errorType":"exception","errorClass":"XmlPullParserException","httpStatus":null,"severity":"error","filePath":"compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Reader.java","lineNumber":516,"sourceCode":"     * @param parser a parser object.\n     * @param strict a strict object.\n     * @throws IOException IOException if any.\n     * @throws XmlPullParserException XmlPullParserException if\n     * any.\n     * @return CoreExtensions\n     */\n    public CoreExtensions read(XmlPullParser parser, boolean strict) throws IOException, XmlPullParserException {\n        CoreExtensions coreExtensions = null;\n        int eventType = parser.getEventType();\n        boolean parsed = false;\n        while (eventType != XmlPullParser.END_DOCUMENT) {\n            if (eventType == XmlPullParser.START_TAG) {\n                if (strict && !\"extensions\".equals(parser.getName())) {\n                    throw new XmlPullParserException(\n                            \"Expected root element 'extensions' but found '\" + parser.getName() + \"'\", parser, null);\n                } else if (parsed) {\n                    // fallback, already expected a XmlPullParserException due to invalid XML\n                    throw new XmlPullParserException(\"Duplicated tag: 'extensions'\", parser, null);\n                }\n                coreExtensions = parseCoreExtensions(parser, strict);\n                coreExtensions.setModelEncoding(parser.getInputEncoding());\n                parsed = true;\n            }\n            eventType = parser.next();\n        }\n        if (parsed) {\n            return coreExtensions;\n        }\n        throw new XmlPullParserException(\n                \"Expected root element 'extensions' but found no element at all: invalid XML document\", parser, null);\n    } // -- CoreExtensions read( XmlPullParser, boolean )\n\n    /**\n     * @see XmlStreamReader\n     *\n     * @param reader a reader object.","sourceCodeStart":498,"sourceCodeEnd":534,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/compat/maven-embedder/src/main/java/org/apache/maven/cli/internal/extension/model/io/xpp3/CoreExtensionsXpp3Reader.java#L498-L534","documentation":"CoreExtensionsXpp3Reader is the generated XML pull-parser for .mvn/extensions.xml. In strict mode it accepts exactly one root <extensions> element; after the first root has been parsed, encountering another START_TAG named 'extensions' at document level throws XmlPullParserException 'Duplicated tag: extensions'. In practice this means the file contains two concatenated root elements — malformed XML with more than one document root.","triggerScenarios":"A .mvn/extensions.xml produced by concatenating two files (e.g. a template merge or double-append in a script), or manual editing that duplicated the <extensions>...</extensions> block. Copy-pasting a second extensions block below the first instead of merging entries.","commonSituations":"CI scripts that append extension entries with 'cat >>' and run twice, duplicating the whole root element. Editors/plugins auto-inserting a fresh skeleton below existing content. Merge conflicts resolved by keeping both sides' root elements.","solutions":["Open .mvn/extensions.xml and merge everything into a single root: one <extensions> element containing all <extension> children.","Validate the file as XML (xmllint --noout .mvn/extensions.xml) — any XML parser flags the double root immediately.","Fix the generating script to write atomically (overwrite) rather than append.","Re-run mvn to confirm the extension loads (optionally -X for detail)."],"exampleFix":"<!-- before (.mvn/extensions.xml): two roots -->\n<extensions>\n  <extension>...</extension>\n</extensions>\n<extensions>\n  <extension>...</extension>\n</extensions>\n\n<!-- after: single merged root -->\n<extensions>\n  <extension>...</extension>\n  <extension>...</extension>\n</extensions>","handlingStrategy":"validation","validationCode":"// Pre-flight XML sanity check for .mvn/extensions.xml\nvar factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();\nfactory.setValidating(false);\nvar doc = factory.newDocumentBuilder().parse(file); // throws on double root / malformed XML\nif (!\"extensions\".equals(doc.getDocumentElement().getTagName())) {\n    throw new IllegalStateException(\"Root element must be <extensions>\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    cli.doMain(args, workingDir, ...);\n} catch (org.codehaus.plexus.util.xml.pull.XmlPullParserException e) {\n    if (\"Duplicated tag: 'extensions'\".equals(e.getMessage())) {\n        // merge the concatenated roots into one and retry\n    }\n    throw e;\n}","preventionTips":["Run xmllint --noout .mvn/extensions.xml in CI lint; a double root is caught by any XML parser.","Generate extensions.xml atomically (write temp + move), never append with cat >>.","Resolve merge conflicts by merging <extension> entries, never by keeping both root elements."],"tags":["maven","core-extensions","extensions-xml","xml","parse-error","malformed-config"],"backgroundTag":"malformed-xml-config","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}