flowable/flowable-engine · error · FlowableException

No .app resource found for deployment '" + deploymentId + "'

Error message

No .app resource found for deployment '" + deploymentId + "'

What it means

Flowable throws FlowableException when resolving an app resource for a deployment that contains no resource ending in .app. getAppResourceObject checks whether the deployment holds an .app resource before (re)deploying and populating the app resource cache; without one it cannot build an AppModel.

Solutions

  1. Pass the id of a deployment that actually contains an .app resource (list via repositoryService.getDeploymentResourceNames)
  2. Rename the archive to end with .app and redeploy
  3. Only call app-resource APIs for app deployments; guard the call by inspecting resource names first

Example fix

// before
AppModel model = repositoryService.getAppResourceModel(anyDeploymentId);
// after
if (repositoryService.getDeploymentResourceNames(anyDeploymentId).stream()
        .anyMatch(n -> n.endsWith(".app"))) {
    AppModel model = repositoryService.getAppResourceModel(anyDeploymentId);
}
Defensive patterns

Strategy: validation

Validate before calling

boolean isAppDeployment = repositoryService.getDeploymentResourceNames(deploymentId)
    .stream().anyMatch(n -> n.endsWith(".app"));

Prevention

When it happens

Trigger: repositoryService getAppResource APIs called with a deploymentId of a plain BPMN deployment (no app archive), or an app deployment uploaded with a wrong extension.

Common situations: Passing a process deployment id where an app deployment id is expected; renaming app archives and losing the .app extension; mixed Flowable 5/6 deployments queried with the 6.x app API.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/persistence/deploy/DeploymentManager.java:159

        Object appResourceObject = appResourceCache.get(deploymentId);

        if (appResourceObject == null) {
            boolean appResourcePresent = false;
            List<String> deploymentResourceNames = getDeploymentEntityManager().getDeploymentResourceNames(deploymentId);
            for (String deploymentResourceName : deploymentResourceNames) {
                if (deploymentResourceName.endsWith(".app")) {
                    appResourcePresent = true;
                    break;
                }
            }

            if (appResourcePresent) {
                DeploymentEntity deployment = deploymentEntityManager.findById(deploymentId);
                deployment.setNew(false);
                deploy(deployment, null);

            } else {
                throw new FlowableException("No .app resource found for deployment '" + deploymentId + "'");
            }

            appResourceObject = appResourceCache.get(deploymentId);
            if (appResourceObject == null) {
                throw new FlowableException("deployment '" + deploymentId + "' didn't put an app resource in the cache");
            }
        }

        return appResourceObject;
    }

    public AppModel getAppResourceModel(String deploymentId) {
        Object appResourceObject = getAppResourceObject(deploymentId);
        if (!(appResourceObject instanceof AppModel)) {
            throw new FlowableException("App resource is not of type AppModel");
        }

        return (AppModel) appResourceObject;

View on GitHub (pinned to d6d39ce1c6)