flowable/flowable-engine · critical · FlowableException
Could not find an implementation of the org.flowable.cdi.imp
Error message
Could not find an implementation of the org.flowable.cdi.impl.cmmn.CmmnEngineLookup service returning a non-null cmmnEngine. Giving up.
What it means
FlowableCmmnExtension (a CDI extension) resolves the CMMN engine by iterating registered CmmnEngineLookup service implementations. If none returns a non-null engine, it throws FlowableException because the CDI environment cannot obtain a CMMN engine to wire into managed beans.
Source
Thrown at modules/flowable-cmmn-cdi/src/main/java/org/flowable/cdi/impl/FlowableCmmnExtension.java:89
return (-1) * ((Integer) o1.getPrecedence()).compareTo(o2.getPrecedence());
}
});
CmmnEngine cmmnEngine = null;
for (CmmnEngineLookup cmmnEngineLookup : discoveredLookups) {
cmmnEngine = cmmnEngineLookup.getCmmnEngine();
if (cmmnEngine != null) {
this.cmmnEngineLookup = cmmnEngineLookup;
LOGGER.debug("CmmnEngineLookup service {} returned cmmn engine.", cmmnEngineLookup.getClass());
break;
} else {
LOGGER.debug("CmmnEngineLookup service {} returned 'null' value.", cmmnEngineLookup.getClass());
}
}
if (cmmnEngineLookup == null) {
throw new FlowableException(
"Could not find an implementation of the " + CmmnEngineLookup.class.getName() + " service returning a non-null cmmnEngine. Giving up.");
}
Bean<FlowableCmmnServices> flowableCmmnServicesBean = (Bean<FlowableCmmnServices>) beanManager.getBeans(FlowableCmmnServices.class).stream()
.findAny()
.orElseThrow(
() -> new IllegalStateException("CDI BeanManager cannot find an instance of requested type " + FlowableCmmnServices.class.getName()));
FlowableCmmnServices services = (FlowableCmmnServices) beanManager
.getReference(flowableCmmnServicesBean, FlowableCmmnServices.class, beanManager.createCreationalContext(flowableCmmnServicesBean));
services.setCmmnEngine(cmmnEngine);
return cmmnEngine;
}
public void beforeShutdown(@Observes BeforeShutdown event) {
if (cmmnEngineLookup != null) {
cmmnEngineLookup.ungetCmmnEngine();
cmmnEngineLookup = null;View on GitHub (pinned to d6d39ce1c6)
Solutions
- Register a CmmnEngineLookup implementation in META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup
- Ensure the lookup returns a built CmmnEngine (build via CmmnEngineConfiguration and expose it)
- Verify flowable-cmmn-engine is on the classpath and the engine initializes before afterDeploymentValidation
- Check that the CDI extension is not active in modules that intentionally have no CMMN engine
Example fix
// before // (no service file) // after // file: src/main/resources/META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup // content: com.myapp.MyCmmnEngineLookup
Defensive patterns
Strategy: validation
Validate before calling
boolean lookupPresent = getClass().getClassLoader()
.getResources("META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup").hasMoreElements();
if (!lookupPresent) throw new IllegalStateException("No CmmnEngineLookup registered for flowable-cmmn-cdi"); Type guard
CmmnEngine engine = cmmnEngineLookup != null ? cmmnEngineLookup.getCmmnEngine() : null;
if (engine == null) throw new IllegalStateException("CmmnEngineLookup returned null engine"); Try / catch
try { cmmnExtension.bootstrap(); } catch (FlowableException e) { throw new IllegalStateException("CDI CMMN engine not configured: " + e.getMessage(), e); } Prevention
- Ship META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup in apps using flowable-cmmn-cdi
- Ensure the CMMN engine is built/started before CDI afterDeploymentValidation runs
- Include flowable-cmmn-engine on the classpath
- Smoke-test engine lookup in integration tests
When it happens
Trigger: Deploying a CDI application with FlowableCmmnExtension enabled but with no CmmnEngineLookup service implementation registered (via META-INF/services) or every lookup returning null because the CMMN engine was never built/started.
Common situations: Missing service descriptor file META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup; forgetting to create the CmmnEngue in a StandaloneInit-like bootstrap; mixing flowable-cmmn-cdi without engine configuration; wrong bean archive discovery.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- Could not find an implementation of the org.flowable.cdi.spi
- This map does not support 'null' keys.
- org.flowable.cdi.impl.ProcessVariableMap.size() is not suppo
- org.flowable.cdi.impl.ProcessVariableMap.isEmpty() is not su
- org.flowable.cdi.impl.ProcessVariableMap.containsKey() is no
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/28400ddf896c89f0.
Report an issue: GitHub.