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

  1. Check that the plugin jar providing that repository type (e.g. KettleEnterpriseRepositoryPlugin) is present in the plugin/lib directories and on the classpath.
  2. Remove or re-create the repository entry in ~/.kettle/repositories.xml if its repository type is no longer installed.
  3. Verify ri.getId() matches a registered RepositoryPluginType id; align the repository type between server and client installs.
  4. 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

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


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)