flowable/flowable-engine · critical · XMLException
BPMN XSD could not be found
Error message
BPMN XSD could not be found
What it means
BpmnXMLConverter.createSchema()/schema() lazily loads the BPMN 2.0 XSD from the classpath (BPMN_XSD resource). If the resource cannot be found on the classloader, the resulting Schema is null and an XMLException is thrown, since schema validation is impossible without the XSD.
Solutions
- Verify the flowable-bpmn-converter jar contains the BPMN XSD resource (unzip and look for the xsd path referenced by BPMN_XSD)
- Rebuild/re-download dependencies to replace a corrupted artifact
- Fix maven-shade/assembly resource excludes or filtering so .xsd files are packaged
- Ensure the classloader used can see converter jar resources (check app-server/OSGi classloading)
- Add the full unmodified flowable-bpmn-converter dependency instead of copying classes manually
Example fix
// pom.xml — before (resource filtering breaks XSDs) <resource><directory>src/main/resources</directory><filtering>true</filtering></resource> // after — exclude binaries/xsd from filtering <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes><exclude>**/*.xsd</exclude></excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes><include>**/*.xsd</include></includes> </resource>
Defensive patterns
Strategy: validation
Validate before calling
String xsdPath = "org/flowable/bpmn/converter/BPMN20.xsd"; // value of BpmnXMLConverter.BPMN_XSD
if (BpmnXMLConverter.class.getClassLoader().getResource(xsdPath) == null) {
throw new IllegalStateException("BPMN XSD missing from classpath; check packaging of flowable-bpmn-converter");
} Try / catch
try {
converter.convertToBpmnModel(inputStreamProvider, true, false);
} catch (XMLException e) {
if (e.getMessage() != null && e.getMessage().contains("BPMN XSD could not be found")) {
throw new IllegalStateException("Classpath is missing the BPMN XSD; fix jar packaging/classloading", e);
}
throw e;
} Prevention
- After building fat jars, verify .xsd resources are present in the artifact
- Avoid resource filtering on third-party resources when using maven-shade/assembly
- Do not strip or hand-copy flowable-bpmn-converter classes without its resources
- Test BPMN XML validation in the same (shaded/containerized) runtime used in production
When it happens
Trigger: Calling convertToBpmnModel/validateSchema (via schema()) when the classpath resource for the BPMN XSD is missing — typically a broken/partial flowable-bpmn-converter jar, shaded/fat-jar packaging that excluded .xsd resources, or a custom classloader that cannot see the resource.
Common situations: Fat-jar/uber-jar builds with resource filtering or excludes dropping XSD files; OSGi/app-server classloader isolation; corrupted maven artifacts; running with a stripped-down classpath.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- CMND XSD could not be found
- Expected an activity behavior in flow node
- Failed to read resource
- No outgoing sequence flow of element
- Provided execution id is null
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/472512027643324c.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/BpmnXMLConverter.java:259
Schema schema = createSchema();
Validator validator = schema.newValidator();
validator.validate(new StAXSource(xmlStreamReader));
}
protected Schema createSchema() throws SAXException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = null;
if (classloader != null) {
schema = factory.newSchema(classloader.getResource(BPMN_XSD));
}
if (schema == null) {
schema = factory.newSchema(BpmnXMLConverter.class.getClassLoader().getResource(BPMN_XSD));
}
if (schema == null) {
throw new XMLException("BPMN XSD could not be found");
}
return schema;
}
public BpmnModel convertToBpmnModel(InputStreamProvider inputStreamProvider, boolean validateSchema, boolean enableSafeBpmnXml) {
return convertToBpmnModel(inputStreamProvider, validateSchema, enableSafeBpmnXml, DEFAULT_ENCODING);
}
public BpmnModel convertToBpmnModel(InputStreamProvider inputStreamProvider, boolean validateSchema, boolean enableSafeBpmnXml, String encoding) {
XMLInputFactory xif = XMLInputFactory.newInstance();
if (xif.isPropertySupported(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)) {
xif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
}
if (xif.isPropertySupported(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)) {
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
}View on GitHub (pinned to d6d39ce1c6)