pentaho/pentaho-kettle · error · MissingResourceException
Unable to find properties file
Error message
Unable to find properties file '${resourceName}' What it means
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.
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
Example fix
// before (pom.xml excludes messages) <exclude>**/*.properties</exclude> // after <include>**/*.properties</include>
Defensive patterns
Strategy: try-catch
Validate before calling
String resource = baseBundleName.replace( '.', '/' ) + ".properties";
if ( getClass().getClassLoader().getResource( resource ) == null ) {
throw new IllegalStateException( "Missing properties resource: " + resource );
} Try / catch
try {
return super.newBundle( baseName, locale, format, loader, reload );
} catch ( MissingResourceException e ) {
log.error( "Properties file not found for baseName=" + baseName + " loader=" + loader );
throw e;
} Prevention
- Check maven resource filtering doesn't exclude *.properties
- Keep package directory names in sync with baseName
- Provide default (no-locale) properties files
When it happens
Trigger: ResourceBundle loading framework calls newBundle() but the classloader returned no InputStream for the properties resource, so the else branch executes and throws.
Common situations: Deployed jar missing properties resources due to build/filtering excluding *.properties; renamed package directory; locale-specific file absent with no default fallback.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Unable to find properties file
- package file could not be found for file in folder
- Unable to find properties file for package
- Unable to read messages file for locale : '
- Cannot find WSDL file: + _wsdlName
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/226d362ab6dedc7e.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/i18n/GlobalMessageUtil.java:432
}
} else {
stream = loader.getResourceAsStream( resourceName );
}
if ( stream == null ) {
// Retry with the system class loader, just in case we are dealing with a messy plug-in.
stream = ClassLoader.getSystemResourceAsStream( resourceName );
}
if ( stream != null ) {
try {
// use UTF-8 encoding
bundle = new PropertyResourceBundle( new InputStreamReader( stream, StandardCharsets.UTF_8.name() ) );
} finally {
stream.close();
}
} else {
final StringBuilder msg = new StringBuilder();
msg.append( "Unable to find properties file '" ).append( resourceName ).append( "'" );
throw new MissingResourceException( msg.toString(), loader.getClass().getName(), baseName );
}
return bundle;
}
}
}
View on GitHub (pinned to f3058517a1)