flowable/flowable-engine · error · ELException

Cannot read default EL properties

Error message

Cannot read default EL properties

What it means

During ExpressionFactoryImpl static initialization, loadDefaultProperties() tries to read the bundled default EL properties file from the classpath/filesystem. If the file exists but an IOException occurs while loading it, it wraps the failure in an ELException. This is effectively a corrupted or unreadable classpath resource inside the Juel/EL implementation.

Source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/ExpressionFactoryImpl.java:264

	 *            custom type converter
	 */
	public ExpressionFactoryImpl(TreeStore store, TypeConverter converter) {
		this.store = store;
		this.converter = converter;
	}

	private Properties loadDefaultProperties() {
		String home = System.getProperty("java.home");
		String path = home + File.separator + "lib" + File.separator + "el.properties";
		File file = new File(path);
		try {
			if (file.exists()) {
				Properties properties = new Properties();
				InputStream input = null;
				try {
					properties.load(input = new FileInputStream(file));
				} catch (IOException e) {
					throw new ELException("Cannot read default EL properties", e);
				} finally {
					try {
						input.close();
					} catch (IOException e) {
						// ignore...
					}
				}
				if (getClass().getName().equals(properties.getProperty("javax.el.ExpressionFactory"))) {
					return properties;
				}
			}
		} catch (SecurityException e) {
			// ignore...
		}
		if (getClass().getName().equals(System.getProperty("javax.el.ExpressionFactory"))) {
			return System.getProperties();
		}
		return null;

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Re-download/replace the flowable-engine-common jar — the bundled properties resource is likely corrupt
  2. Check filesystem permissions on the jar/exploded classes directory so the process can read it
  3. Verify the packaging/extraction process (build plugin, unzip) is not truncating resources

Example fix

// before
$ ls -l lib/flowable-engine-common.jar
-rw------- 1 root root ... flowable-engine-common.jar

// after (make readable to app user)
$ chmod 644 lib/flowable-engine-common.jar
Defensive patterns

Strategy: try-catch

Validate before calling

// Sanity-check the bundled jar resource is readable at deployment time
URL res = getClass().getResource("/juel-default.properties");
if (res == null || res.openConnection().getInputStream() == null) throw new IllegalStateException("EL default properties resource unreadable");

Try / catch

try {
    ExpressionFactory factory = new ExpressionFactoryImpl();
} catch (ELException e) {
    if (e.getCause() instanceof IOException) {
        throw new IllegalStateException("Corrupted/unreadable flowable jar: redeploy", e);
    }
    throw e;
}

Prevention

When it happens

Trigger: loadDefaultProperties() (invoked lazily by the properties() accessor when the factory initializes) opens a FileInputStream to a default properties file that exists but cannot be read — e.g. permission error, file is a directory, or I/O failure mid-read.

Common situations: Broken or partially extracted application packaging where the EL properties resource is corrupted; read-permission problems on the JAR/exploded WAR; security managers or container restrictions 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/bd9edd2baee2c946. Report an issue: GitHub.