pentaho/pentaho-kettle · error · KettleException
RepositoryLogin.ErrorFindingPlugin
Error message
RepositoryLogin.ErrorFindingPlugin
What it means
editRepository() looks up the repository's PluginInterface via PluginRegistry using the RepositoryMeta's id. If searchRepository found the repository metadata but the registry has no registered repository plugin for that id, it throws KettleException 'RepositoryLogin.ErrorFindingPlugin' (with the plugin id interpolated). Without the plugin, the repository edit dialog cannot be instantiated.
Solutions
- Check that the plugin jar providing that repository type (e.g. KettleEnterpriseRepositoryPlugin) is present in the plugin/lib directories and on the classpath.
- Remove or re-create the repository entry in ~/.kettle/repositories.xml if its repository type is no longer installed.
- Verify ri.getId() matches a registered RepositoryPluginType id; align the repository type between server and client installs.
- Check the plugins.xml / PluginRegistry log at startup for failed plugin loads.
Example fix
// before
PluginInterface plugin = PluginRegistry.getInstance().getPlugin( RepositoryPluginType.class, ri.getId() );
// after
PluginInterface plugin = PluginRegistry.getInstance().getPlugin( RepositoryPluginType.class, ri.getId() );
if ( plugin == null ) {
logError( "Repository plugin not installed for id: " + ri.getId() + "; skipping edit" );
return;
} Defensive patterns
Strategy: validation
Validate before calling
RepositoryMeta ri = input.searchRepository( model.getSelectedRepository().getName() );
PluginInterface plugin = ( ri != null )
? PluginRegistry.getInstance().getPlugin( RepositoryPluginType.class, ri.getId() )
: null;
if ( plugin == null ) {
throw new IllegalStateException(
"Repository plugin not installed for id: " + ( ri == null ? "<unknown>" : ri.getId() )
+ ". Install the matching plugin jar or remove this repository from repositories.xml." );
} Try / catch
try {
helper.editRepository();
} catch ( KettleException e ) {
if ( e.getMessage().contains( "ErrorFindingPlugin" ) ) {
showError( "Repository type plugin is not installed in this Pentaho instance." );
} else {
throw e;
}
} Prevention
- Keep client and server Pentaho installs aligned — same set of repository plugins.
- Do not copy repositories.xml from machines with enterprise plugins to base-only installs.
- Verify plugin jars exist under plugins/ and lib/ after upgrades.
- Review PluginRegistry startup logs for failed plugin loads before using the repository dialogs.
When it happens
Trigger: Calling editRepository() for a repository whose id exists in repositories.xml but has no corresponding plugin registered in PluginRegistry under RepositoryPluginType.
Common situations: repositories.xml copied from a machine with extra repository plugins (e.g. enterprise database repository) while this installation only has base plugins; missing plugin jars in lib/ or libswt; typo'd/obsolete repository type id after a version upgrade removed the plugin.
Understand the failure class
Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.
Related errors
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3cf3c35620331695.
Report an issue: GitHub.
Appendix: source
Thrown at ui/src/main/java/org/pentaho/di/ui/repository/RepositoriesHelper.java:142
}
}
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorCreatingRepository", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorCreatingRepository", e.getLocalizedMessage() ), e );
}
}
}
public void editRepository() {
try {
PluginInterface plugin = null;
RepositoryMeta ri = input.searchRepository( model.getSelectedRepository().getName() );
if ( ri != null ) {
plugin = PluginRegistry.getInstance().getPlugin( RepositoryPluginType.class, ri.getId() );
if ( plugin == null ) {
throw new KettleException( BaseMessages
.getString( PKG, "RepositoryLogin.ErrorFindingPlugin", ri.getId() ) );
}
}
RepositoryDialogInterface dd = getRepositoryDialog( plugin, ri, input, this.shell );
if ( dd.open( MODE.EDIT ) != null ) {
fillRepositories();
int idx = input.indexOfRepository( ri );
model.setSelectedRepository( input.getRepository( idx ) );
writeData();
}
} catch ( Exception e ) {
log.logDetailed( BaseMessages.getString( PKG, "RepositoryLogin.ErrorEditingRepository", e
.getLocalizedMessage() ) );
new ErrorDialog( shell, BaseMessages.getString( PKG, "Dialog.Error" ), BaseMessages.getString(
PKG, "RepositoryLogin.ErrorEditingRepository", e.getLocalizedMessage() ), e );
}
}
View on GitHub (pinned to f3058517a1)