pentaho/pentaho-kettle · error · InvocationTargetException

Error loading job

Error message

Error loading job

What it means

JobLoadProgressDialog's monitor runnable loads a job (JobMeta) inside a ProgressMonitorDialog; any KettleException from the load is rethrown as an InvocationTargetException with message 'Error loading job' so the progress dialog machinery can surface it on the UI thread. It is a generic wrapper — the real reason is the chained KettleException cause.

Solutions

  1. Inspect the InvocationTargetException's cause (KettleException) stack trace for the actual load error.
  2. Verify the repository connection (credentials, URL) or the .kjb file path before opening.
  3. Install the missing plugins/entries reported (see MissingEntryDialog for missing entries).
  4. Open the .kjb in a text editor / newer-compatible PDI version to validate the XML.

Example fix

// before
new JobLoadProgressDialog( shell, repository, filename, ... ).open(); // opaque 'Error loading job'

// after
try {
  new JobLoadProgressDialog( shell, repository, filename, ... ).open();
} catch ( Exception e ) {
  Throwable root = e;
  while ( root.getCause() != null ) root = root.getCause();
  log.logError( "Job load failed: " + root.getMessage(), root );
}
Defensive patterns

Strategy: try-catch

Validate before calling

if ( repository != null && !repository.isConnected() ) {
  throw new IllegalStateException( "Connect to the repository before loading the job" );
}
if ( filename != null && !new File( filename ).exists() ) {
  throw new IllegalStateException( "Job file missing: " + filename );
}

Try / catch

try {
  new JobLoadProgressDialog( shell, repository, filename, ... ).open();
} catch ( Exception e ) {
  Throwable root = e;
  while ( root.getCause() != null ) root = root.getCause();
  showMessageBox( "Error loading job", root.getMessage() );
}

Prevention

When it happens

Trigger: The runnable's load call (e.g. JobMeta construction / loadJob from repository or file) throws KettleException: corrupt or unreadable .kjb file, missing job entries/plugins, repository connection failure, or unsupported file version.

Common situations: Opening a job from a repository that is unreachable or whose credentials changed; a .kjb referencing plugins not installed in this PDI instance; files saved by a newer PDI version; XML corrupted by a bad merge/transfer.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


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

Appendix: source

Thrown at ui/src/main/java/org/pentaho/di/ui/job/dialog/JobLoadProgressDialog.java:104

            ( objectId == null ) ? jobname : objectId.toString() );

          if ( objectId != null ) {
            jobInfo = rep.loadJob( objectId, versionLabel );
          } else {
            jobInfo = rep.loadJob( jobname, repdir, new ProgressMonitorAdapter( monitor ), versionLabel );
          }

          // Call extension point(s) now that the file has been opened
          ExtensionPointHandler.callExtensionPoint( spoon.getLog(), KettleExtensionPoint.JobAfterOpen.id, jobInfo );

          if ( jobInfo.hasMissingPlugins() ) {
            MissingEntryDialog missingDialog = new MissingEntryDialog( shell, jobInfo.getMissingEntries() );
            if ( missingDialog.open() == null ) {
              jobInfo = null;
            }
          }
        } catch ( KettleException e ) {
          throw new InvocationTargetException( e, "Error loading job" );
        }
      }
    };

    try {
      ProgressMonitorDialog pmd = new ProgressMonitorDialog( shell );
      pmd.run( true, false, op );
    } catch ( InvocationTargetException e ) {
      KettleRepositoryLostException krle = KettleRepositoryLostException.lookupStackStrace( e );
      if ( krle != null ) {
        throw krle;
      }
      new ErrorDialog( shell, "Error loading job", "An error occured loading the job!", e );
      jobInfo = null;
    } catch ( InterruptedException e ) {
      new ErrorDialog( shell, "Error loading job", "An error occured loading the job!", e );
      jobInfo = null;
    }

View on GitHub (pinned to f3058517a1)