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
- Re-download/replace the flowable-engine-common jar — the bundled properties resource is likely corrupt
- Check filesystem permissions on the jar/exploded classes directory so the process can read it
- 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
- Verify jar integrity (checksum) after build/pipeline transfer
- Ensure the app-server user has read permission on all deployed jars
- Avoid manual jar patching/extraction that can corrupt resources
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
- problem retrieving flowable.cmmn.cfg.xml resources on the cl
- problem retrieving flowable-cmmn-context.xml resources on th
- Cannot read EL properties
- Class ${className} not found
- Couldn't read file ${filePath}: ${e.getMessage()}
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/bd9edd2baee2c946.
Report an issue: GitHub.