pentaho/pentaho-kettle · error · RuntimeException

Error initialize repo:// VFS

Error message

Error initialize repo:// VFS

What it means

RepositoryVfsProvider.registerRepoVFS registers the repo:// scheme with the commons-vfs DefaultFileSystemManager; any exception during registration (e.g. scheme already registered, Spoon not initialized) is rethrown as RuntimeException 'Error initialize repo:// VFS' with the cause attached.

Solutions

  1. Check getCause() for 'Duplicate provider' and skip re-registration if the scheme is already present.
  2. Only call registerRepoVFS once per JVM (guard with a static flag or check fsm.hasProvider(SCHEME)).
  3. Run inside a context where Spoon is initialized, or remove/replace the Spoon dependency for headless use.
  4. Align plugin/Pentaho versions so only one component registers repo://.

Example fix

// before
RepositoryVfsProvider.getInstance().registerRepoVFS();
// after
FileSystemManager fsm = VFS.getManager();
if (fsm instanceof DefaultFileSystemManager && !fsm.hasProvider("repo")) {
  RepositoryVfsProvider.getInstance().registerRepoVFS();
}
Defensive patterns

Strategy: validation

Validate before calling

FileSystemManager fsm = VFS.getManager();
boolean needsRegister = fsm instanceof DefaultFileSystemManager && !fsm.hasProvider("repo");
if (needsRegister) { /* call registerRepoVFS once */ }

Try / catch

try {
  provider.registerRepoVFS();
} catch (RuntimeException e) {
  if (!(e.getCause() instanceof FileSystemException && String.valueOf(e.getCause()).contains("provider"))) throw e;
  // duplicate registration: safe to ignore
}

Prevention

When it happens

Trigger: Calling registerRepoVFS when addProvider(SCHEME, this) throws — most commonly because a 'repo' provider was already registered in the current DefaultFileSystemManager, or Spoon.getInstance() fails outside the Spoon UI context.

Common situations: Embedding the repository VFS in a non-GUI/headless process where Spoon isn't available; registering the provider twice in one JVM (unit tests, plugin reload); mixing Pentaho versions where another component registered repo:// first.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/b8e46af5f06a9993. Report an issue: GitHub.

Appendix: source

Thrown at plugins/pentaho-repository-vfs/core/src/main/java/org/pentaho/repositoryvfs/vfs/RepositoryVfsProvider.java:56

public class RepositoryVfsProvider implements FileProvider {
  public static final String SCHEME = "repo";

  private final IConnectedRepositoryInstance repositoryInstance;

  public RepositoryVfsProvider( IConnectedRepositoryInstance repositoryInstance ) {
    this.repositoryInstance = repositoryInstance;
    registerRepoVFS();
  }

  private void registerRepoVFS() {
    FileSystemManager fsm = KettleVFS.getInstance().getFileSystemManager();
    if ( fsm instanceof DefaultFileSystemManager ) {
      try {
        ( (DefaultFileSystemManager) fsm ).addProvider( SCHEME, this );
        final Spoon spoon = Spoon.getInstance();
        System.out.println(  );
      } catch ( Exception ex ) {
        throw new RuntimeException( "Error initialize repo:// VFS", ex );
      }
    }
  }

  protected Repository getRepo() {
    Repository repo = repositoryInstance.getConnectedRepositoryInstance();
    if ( repo == null ) {
      throw new RuntimeException( "Repository not connected" );
    }
    return repo;
  }

  @Override
  public FileObject findFile( FileObject baseFile, String uri, FileSystemOptions fileSystemOptions )
    throws FileSystemException {

    if ( !uri.startsWith( "repo://" ) ) {
      throw new FileSystemException( "WRONG_URL" );

View on GitHub (pinned to f3058517a1)