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
- Unwrap getCause() for the exact line and column
- Retry with .strict(false) when unknown elements are tolerable
- 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
- Run xmllint on toolchains.xml after manual edits
- Use strict(false) when parsing toolchains files written by other Maven versions
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
- Cannot read toolchains file at " + userToolchainsFile.getAbs
- Unable to read plugin:
- Unable to read settings:
- reader or inputStream must be non null
- writer or outputStream must be non null
AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21).
Data as JSON: /api/errors/867122d3f30c5f87.
Report an issue: GitHub.