flowable/flowable-engine · critical · FlowableException

problem retrieving flowable.registry.cfg.xml resources on th

Error message

problem retrieving flowable.registry.cfg.xml resources on the classpath: 

What it means

EventRegistryEngines.init() enumerates all flowable.eventregistry.cfg.xml resources on the classpath to auto-initialize the event registry engine. If the classloader's getResources call throws an IOException, it wraps it in a FlowableException including the java.class.path. This indicates a broken/classloader-level I/O problem, not a missing config file (missing files are simply skipped).

Source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/EventRegistryEngines.java:62

    protected static Map<String, EngineInfo> eventRegistryEngineInfosByResourceUrl = new HashMap<>();
    protected static List<EngineInfo> eventRegistryEngineInfos = new ArrayList<>();

    /**
     * Initializes all event registry engines that can be found on the classpath for resources <code>flowable.eventregistry.cfg.xml</code> 
     * and for resources <code>flowable-eventregistry-context.xml</code> (Spring style configuration).
     */
    public static synchronized void init() {
        if (!isInitialized()) {
            if (eventRegistryEngines == null) {
                // Create new map to store event registry engines if current map is null
                eventRegistryEngines = new HashMap<>();
            }
            ClassLoader classLoader = EventRegistryEngines.class.getClassLoader();
            Enumeration<URL> resources = null;
            try {
                resources = classLoader.getResources("flowable.eventregistry.cfg.xml");
            } catch (IOException e) {
                throw new FlowableException("problem retrieving flowable.registry.cfg.xml resources on the classpath: " + System.getProperty("java.class.path"), e);
            }

            // Remove duplicated configuration URL's using set. Some
            // classloaders may return identical URL's twice, causing duplicate startups
            Set<URL> configUrls = new HashSet<>();
            while (resources.hasMoreElements()) {
                configUrls.add(resources.nextElement());
            }
            for (URL resource : configUrls) {
                LOGGER.info("Initializing event registry engine using configuration '{}'", resource);
                initEventRegistryEngineFromResource(resource);
            }

            try {
                resources = classLoader.getResources("flowable-eventregistry-context.xml");
            } catch (IOException e) {
                throw new FlowableException("problem retrieving flowable-registry-context.xml resources on the classpath: " + System.getProperty("java.class.path"), e);
            }

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Inspect the java.class.path printed in the message and validate every entry (verify each jar with 'jar tf' or unzip -t); repair or re-deploy corrupt jars.
  2. Rebuild the application artifact to regenerate a clean classpath.
  3. Check the custom classloader in use and ensure it can enumerate resources for that URL protocol.
  4. If running in a container, verify mounted volumes containing jars are readable.

Example fix

// before (broken fat jar entry on classpath)
java -cp app.jar:libs/corrupt-lib.jar com.app.Main
// after
mvn clean package && java -cp app.jar:libs/fixed-lib.jar com.app.Main
Defensive patterns

Strategy: try-catch

Validate before calling

try (Stream<Path> entries = Files.list(Paths.get(libDir))) {
    entries.filter(p -> p.toString().endsWith(".jar")).forEach(p -> {
        try (java.util.jar.JarFile jf = new java.util.jar.JarFile(p.toFile())) { jf.getManifest(); }
        catch (IOException e) { throw new IllegalStateException("Corrupt jar on classpath: " + p, e); }
    });
}

Try / catch

try {
    EventRegistryEngines.getAppEngine();
} catch (FlowableException e) {
    if (e.getMessage().startsWith("problem retrieving flowable.registry.cfg.xml")) {
        log.error("Classpath corruption detected; inspect: " + e.getMessage(), e);
    }
    throw e;
}

Prevention

When it happens

Trigger: Calling EventRegistryEngines.getAppEngine/init (directly or via building an engine) when the thread-context or class classloader throws IOException on getResources('flowable.eventregistry.cfg.xml') — e.g. corrupted jars, unreadable classpath entries, or exotic custom classloaders.

Common situations: Fat jars with corrupt/duplicate entries, classloader issues in app servers (OSGi, custom parent-last loaders), broken deployments where a classpath jar is truncated or unreadable.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/3843786777b239cc. Report an issue: GitHub.