apache/maven · error · XmlReaderException

Unable to read toolchains: {}

Error message

Unable to read toolchains: {}

What it means

Wrapper thrown when parsing a PersistedToolchains document fails: malformed toolchains.xml, strict-mode rejection of unknown elements, or IO errors on the supplied Reader/InputStream. The cause is preserved, and STaX causes carry line and column information appended to the message.

Source

Thrown at impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultToolchainsXmlFactory.java:72

        if (reader == null && inputStream == null) {
            throw new IllegalArgumentException("reader or inputStream must be non null");
        }
        try {
            InputSource source = null;
            if (request.getModelId() != null || request.getLocation() != null) {
                source = InputSource.of(request.getLocation());
            }
            MavenToolchainsStaxReader xml = request.getTransformer() != null
                    ? new MavenToolchainsStaxReader(request.getTransformer()::transform)
                    : new MavenToolchainsStaxReader();
            xml.setAddDefaultEntities(request.isAddDefaultEntities());
            if (reader != null) {
                return xml.read(reader, request.isStrict(), source);
            } else {
                return xml.read(inputStream, request.isStrict(), source);
            }
        } catch (Exception e) {
            throw new XmlReaderException("Unable to read toolchains: " + getMessage(e), getLocation(e), e);
        }
    }

    @Override
    public void write(XmlWriterRequest<PersistedToolchains> request) throws XmlWriterException {
        requireNonNull(request, "request");
        PersistedToolchains content = Objects.requireNonNull(request.getContent(), "content");
        OutputStream outputStream = request.getOutputStream();
        Writer writer = request.getWriter();
        if (writer == null && outputStream == null) {
            throw new IllegalArgumentException("writer or outputStream must be non null");
        }
        try {
            MavenToolchainsStaxWriter xmlWriter = new MavenToolchainsStaxWriter();
            xmlWriter.setAddLocationInformation(false);

            Function<Object, String> formatter = request.getInputLocationFormatter();
            if (formatter != null) {

View on GitHub (pinned to e4093d4e12)

Solutions

  1. Unwrap getCause() for the exact line and column
  2. Retry with .strict(false) when unknown elements are tolerable
  3. Lint the toolchains.xml externally before parsing

Example fix

// before
PersistedToolchains t = toolchainsXmlFactory.read(XmlReaderRequest.builder()
    .inputStream(is)
    .build()); // strict default may reject unknown elements

// after
PersistedToolchains t = toolchainsXmlFactory.read(XmlReaderRequest.builder()
    .inputStream(is)
    .strict(false)
    .build());
Defensive patterns

Strategy: try-catch

Try / catch

try {
    PersistedToolchains t = toolchainsXmlFactory.read(req);
} catch (XmlReaderException e) {
    Throwable cause = e.getCause();
    // STaX cause carries line/column of the parse failure
    log.error("toolchains.xml invalid: {}", e.getMessage(), cause);
}

Prevention

When it happens

Trigger: Badly formed toolchains.xml fed via reader/inputStream; unknown elements with strict=true; streams that fail during read.

Common situations: Corrupted toolchains file after manual editing; version skew between the toolchains file format and the runtime model; encoding problems.

Related errors


AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21). Data as JSON: /api/errors/867122d3f30c5f87. Report an issue: GitHub.