{"record":{"id":"bd9edd2baee2c946","repo":"flowable/flowable-engine","slug":"cannot-read-default-el-properties","errorCode":null,"errorMessage":"Cannot read default EL properties","messagePattern":"Cannot read default EL properties","errorType":"exception","errorClass":"ELException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/ExpressionFactoryImpl.java","lineNumber":264,"sourceCode":"\t *            custom type converter\n\t */\n\tpublic ExpressionFactoryImpl(TreeStore store, TypeConverter converter) {\n\t\tthis.store = store;\n\t\tthis.converter = converter;\n\t}\n\n\tprivate Properties loadDefaultProperties() {\n\t\tString home = System.getProperty(\"java.home\");\n\t\tString path = home + File.separator + \"lib\" + File.separator + \"el.properties\";\n\t\tFile file = new File(path);\n\t\ttry {\n\t\t\tif (file.exists()) {\n\t\t\t\tProperties properties = new Properties();\n\t\t\t\tInputStream input = null;\n\t\t\t\ttry {\n\t\t\t\t\tproperties.load(input = new FileInputStream(file));\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\tthrow new ELException(\"Cannot read default EL properties\", e);\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinput.close();\n\t\t\t\t\t} catch (IOException e) {\n\t\t\t\t\t\t// ignore...\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (getClass().getName().equals(properties.getProperty(\"javax.el.ExpressionFactory\"))) {\n\t\t\t\t\treturn properties;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (SecurityException e) {\n\t\t\t// ignore...\n\t\t}\n\t\tif (getClass().getName().equals(System.getProperty(\"javax.el.ExpressionFactory\"))) {\n\t\t\treturn System.getProperties();\n\t\t}\n\t\treturn null;","sourceCodeStart":246,"sourceCodeEnd":282,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/ExpressionFactoryImpl.java#L246-L282","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\n$ ls -l lib/flowable-engine-common.jar\n-rw------- 1 root root ... flowable-engine-common.jar\n\n// after (make readable to app user)\n$ chmod 644 lib/flowable-engine-common.jar","handlingStrategy":"try-catch","validationCode":"// Sanity-check the bundled jar resource is readable at deployment time\nURL res = getClass().getResource(\"/juel-default.properties\");\nif (res == null || res.openConnection().getInputStream() == null) throw new IllegalStateException(\"EL default properties resource unreadable\");","typeGuard":null,"tryCatchPattern":"try {\n    ExpressionFactory factory = new ExpressionFactoryImpl();\n} catch (ELException e) {\n    if (e.getCause() instanceof IOException) {\n        throw new IllegalStateException(\"Corrupted/unreadable flowable jar: redeploy\", e);\n    }\n    throw e;\n}","preventionTips":["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"],"tags":["io","classpath","el","flowable","initialization"],"backgroundTag":"file-read-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}