{"record":{"id":"3bbcc3bd289bae3f","repo":"flowable/flowable-engine","slug":"failed-to-read-property-name","errorCode":null,"errorMessage":"Failed to read ${PROPERTY_NAME}","messagePattern":"Failed to read (.+?)","errorType":"exception","errorClass":"ELException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ExpressionFactory.java","lineNumber":404,"sourceCode":"        }\n\n        return result.getClass().getName();\n    }\n\n    private static String getClassNameJreDir() {\n        File file = new File(PROPERTY_FILE);\n        if (file.canRead()) {\n            try (InputStream is = new FileInputStream(file)) {\n                Properties props = new Properties();\n                props.load(is);\n                String value = props.getProperty(PROPERTY_NAME);\n                if (value != null && !value.trim().isEmpty()) {\n                    return value.trim();\n                }\n            } catch (FileNotFoundException e) {\n                // Should not happen - ignore it if it does\n            } catch (IOException ioe) {\n                throw new ELException(\"Failed to read \" + PROPERTY_NAME, ioe);\n            }\n        }\n        return null;\n    }\n\n    private static String getClassNameSysProp() {\n        String value = System.getProperty(PROPERTY_NAME);\n        if (value != null && !value.trim().isEmpty()) {\n            return value.trim();\n        }\n        return null;\n    }\n\n}","sourceCodeStart":386,"sourceCodeEnd":418,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/javax/el/ExpressionFactory.java#L386-L418","documentation":"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.","triggerScenarios":"The file javax.el.ExpressionFactory under the JRE home exists but cannot be read (permissions, IO error) during ExpressionFactory class discovery.","commonSituations":"Restricted JRE/lib directories, partially installed JVMs, unusual java.home setups, security-managed environments blocking file reads.","solutions":["Check read permissions on the property file under the JRE home directory","Remove or repair the corrupted property file","Set the javax.el.ExpressionFactory system property instead so discovery via the JRE file is skipped","Verify java.home points to a valid JRE/JDK installation"],"exampleFix":"// before (broken file in jre/lib)\n<jre>/lib/javax.el.ExpressionFactory // unreadable\n// after\n-Djavax.el.ExpressionFactory=de.odysseus.el.ExpressionFactoryImpl","handlingStrategy":"fallback","validationCode":"java.io.File f = new File(System.getProperty(\"java.home\"), \"lib/javax.el.ExpressionFactory\");\nboolean readable = f.canRead();","typeGuard":null,"tryCatchPattern":"try {\n  factory = ExpressionFactory.newInstance();\n} catch (ELException e) {\n  logger.warn(\"Discovery failed ({}), setting system property instead\", e.getMessage());\n  System.setProperty(\"javax.el.ExpressionFactory\", DefaultFactory.class.getName());\n  factory = ExpressionFactory.newInstance();\n}","preventionTips":["Set the javax.el.ExpressionFactory system property to skip file discovery","Ensure JRE lib directories are readable by the application user","Avoid unusual java.home setups in containers"],"tags":["el","io","discovery","configuration"],"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"}