flowable/flowable-engine · error · ELException

Failed to read ${PROPERTY_NAME}

Error message

Failed to read ${PROPERTY_NAME}

What it means

During service-provider discovery, getClassNameJreDir reads a property file from the JRE directory; an IOException (other than file-not-found, which is ignored) while reading it is wrapped in ELException 'Failed to read ' + PROPERTY_NAME.

Source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ExpressionFactory.java:404

        }

        return result.getClass().getName();
    }

    private static String getClassNameJreDir() {
        File file = new File(PROPERTY_FILE);
        if (file.canRead()) {
            try (InputStream is = new FileInputStream(file)) {
                Properties props = new Properties();
                props.load(is);
                String value = props.getProperty(PROPERTY_NAME);
                if (value != null && !value.trim().isEmpty()) {
                    return value.trim();
                }
            } catch (FileNotFoundException e) {
                // Should not happen - ignore it if it does
            } catch (IOException ioe) {
                throw new ELException("Failed to read " + PROPERTY_NAME, ioe);
            }
        }
        return null;
    }

    private static String getClassNameSysProp() {
        String value = System.getProperty(PROPERTY_NAME);
        if (value != null && !value.trim().isEmpty()) {
            return value.trim();
        }
        return null;
    }

}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Check read permissions on the property file under the JRE home directory
  2. Remove or repair the corrupted property file
  3. Set the javax.el.ExpressionFactory system property instead so discovery via the JRE file is skipped
  4. Verify java.home points to a valid JRE/JDK installation

Example fix

// before (broken file in jre/lib)
<jre>/lib/javax.el.ExpressionFactory // unreadable
// after
-Djavax.el.ExpressionFactory=de.odysseus.el.ExpressionFactoryImpl
Defensive patterns

Strategy: fallback

Validate before calling

java.io.File f = new File(System.getProperty("java.home"), "lib/javax.el.ExpressionFactory");
boolean readable = f.canRead();

Try / catch

try {
  factory = ExpressionFactory.newInstance();
} catch (ELException e) {
  logger.warn("Discovery failed ({}), setting system property instead", e.getMessage());
  System.setProperty("javax.el.ExpressionFactory", DefaultFactory.class.getName());
  factory = ExpressionFactory.newInstance();
}

Prevention

When it happens

Trigger: The file javax.el.ExpressionFactory under the JRE home exists but cannot be read (permissions, IO error) during ExpressionFactory class discovery.

Common situations: Restricted JRE/lib directories, partially installed JVMs, unusual java.home setups, security-managed environments blocking file reads.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


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