{"record":{"id":"226d362ab6dedc7e","repo":"pentaho/pentaho-kettle","slug":"unable-to-find-properties-file-resourcename","errorCode":null,"errorMessage":"Unable to find properties file '${resourceName}'","messagePattern":"Unable to find properties file '(.+?)'","errorType":"exception","errorClass":"MissingResourceException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/i18n/GlobalMessageUtil.java","lineNumber":432,"sourceCode":"        }\n      } else {\n        stream = loader.getResourceAsStream( resourceName );\n      }\n      if ( stream == null ) {\n        // Retry with the system class loader, just in case we are dealing with a messy plug-in.\n        stream = ClassLoader.getSystemResourceAsStream( resourceName );\n      }\n      if ( stream != null ) {\n        try {\n          // use UTF-8 encoding\n          bundle = new PropertyResourceBundle( new InputStreamReader( stream, StandardCharsets.UTF_8.name() ) );\n        } finally {\n          stream.close();\n        }\n      } else {\n        final StringBuilder msg = new StringBuilder();\n        msg.append( \"Unable to find properties file '\" ).append( resourceName ).append( \"'\" );\n        throw new MissingResourceException( msg.toString(), loader.getClass().getName(), baseName );\n      }\n      return bundle;\n    }\n  }\n}\n","sourceCodeStart":414,"sourceCodeEnd":438,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/i18n/GlobalMessageUtil.java#L414-L438","documentation":"GlobalMessageUtil.newBundle() is the ResourceBundle.Control callback that loads the actual .properties file from an InputStream. When no resource stream exists for the base bundle name it throws MissingResourceException stating the properties file could not be found. This is the low-level loader behind error 590.","triggerScenarios":"ResourceBundle loading framework calls newBundle() but the classloader returned no InputStream for the properties resource, so the else branch executes and throws.","commonSituations":"Deployed jar missing properties resources due to build/filtering excluding *.properties; renamed package directory; locale-specific file absent with no default fallback.","solutions":["Check build configuration so *.properties files are packaged into the jar (maven resource filters often exclude them)","Confirm the base name and package directory match the actual resource location","Provide a default (locale-less) properties file as fallback","Inspect loader.getClass().getName() and baseName in the exception to locate the expected resource path"],"exampleFix":"// before (pom.xml excludes messages)\n<exclude>**/*.properties</exclude>\n// after\n<include>**/*.properties</include>","handlingStrategy":"try-catch","validationCode":"String resource = baseBundleName.replace( '.', '/' ) + \".properties\";\nif ( getClass().getClassLoader().getResource( resource ) == null ) {\n  throw new IllegalStateException( \"Missing properties resource: \" + resource );\n}","typeGuard":null,"tryCatchPattern":"try {\n  return super.newBundle( baseName, locale, format, loader, reload );\n} catch ( MissingResourceException e ) {\n  log.error( \"Properties file not found for baseName=\" + baseName + \" loader=\" + loader );\n  throw e;\n}","preventionTips":["Check maven resource filtering doesn't exclude *.properties","Keep package directory names in sync with baseName","Provide default (no-locale) properties files"],"tags":["i18n","resource-bundle","classpath","properties-file"],"backgroundTag":"resource-not-found","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}