pentaho/pentaho-kettle · critical · IllegalStateException
Unable to get list of instantiated value meta plugin classes
Error message
Unable to get list of instantiated value meta plugin classes
What it means
Database.initValueMetaPluginClasses is a static initializer that loads all ValueMeta plugin classes via ValueMetaFactory.getValueMetaPluginClasses(). If that call throws any exception, the failure is wrapped in an IllegalStateException, aborting Database class initialization. Because it runs during class init, it typically surfaces as a Cause in an ExceptionInInitializerError.
Solutions
- Inspect the cause (getCause()) of the IllegalStateException/ExceptionInInitializerError to find the underlying plugin load failure
- Verify the Pentaho plugin directories exist and contain valid value-meta plugin jars and plugin.xml files
- Fix classpath: remove duplicate/conflicting Kettle jars and ensure all core plugins are packaged
- Check ValueMetaFactory/PluginRegistry initialization logs for earlier warnings
Defensive patterns
Strategy: validation
Validate before calling
try {
Class.forName( "org.pentaho.di.core.database.Database" );
} catch ( Throwable t ) {
// fail fast: report missing/broken plugin environment before using Database
} Try / catch
try {
new Database( loggingObject, dbMeta );
} catch ( ExceptionInInitializerError e ) {
log.error( "Plugin init failed: " + e.getCause(), e );
} Prevention
- Package all value-meta plugin jars and plugin.xml descriptors in deployments
- Remove duplicate Kettle jars from the classpath
- Smoke-test Database class initialization early at application startup
When it happens
Trigger: First use of the Database class when ValueMetaFactory cannot build the list of value meta plugin classes — e.g. the plugin registry fails to scan plugins, a plugin jar is corrupt/missing, or plugin type declarations are broken.
Common situations: Broken or incomplete Pentaho plugin directory, classpath missing kettle value-meta plugins, plugin.xml descriptor errors, or duplicated/conflicting plugin jars on the classpath in embedded deployments.
Related errors
- Could not get repository instance
- Cannot find WSDL file: + _wsdlName
- Could not initialize from codeSnippets.xml
- CustomVfsSettingsParser.Log.FailedToLoad
- Dynamic driver: failed to load
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/6fbd6b2a63ae6c93.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/core/database/Database.java:264
@Override public void pluginRemoved( Object serviceObject ) {
initValueMetaPluginClasses();
}
@Override public void pluginChanged( Object serviceObject ) {
initValueMetaPluginClasses();
}
}
);
}
private static void initValueMetaPluginClasses() {
try {
valueMetaPluginClasses = ValueMetaFactory.getValueMetaPluginClasses();
// Reverse the sort list
valueMetaPluginClasses.sort( ( o1, o2 ) -> ( Integer.compare( o1.getType(), o2.getType() ) ) * -1 );
} catch ( Exception e ) {
throw new IllegalStateException( "Unable to get list of instantiated value meta plugin classes", e );
}
}
/**
* Construct a new Database Connection
*
* @param databaseMeta The Database Connection Info to construct the connection with.
* @deprecated Please specify the parent object so that we can see which object is initiating a database connection
*/
@Deprecated
public Database( DatabaseMeta databaseMeta ) {
this.parentLoggingObject = null;
this.databaseMeta = databaseMeta;
shareVariablesWith( databaseMeta );
// In this case we don't have the parent object, so we don't know which
// object makes the connection.
// We also don't know what log level to attach to it, so we have to stick toView on GitHub (pinned to f3058517a1)