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
- Inspect the InvocationTargetException's cause (KettleException) stack trace for the actual load error.
- Verify the repository connection (credentials, URL) or the .kjb file path before opening.
- Install the missing plugins/entries reported (see MissingEntryDialog for missing entries).
- 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
- Unwrap InvocationTargetException/KettleException causes to see the real error
- Ensure required plugins for all job entries are installed
- Validate .kjb XML and PDI version compatibility before opening
- Confirm repository connectivity before triggering the load dialog
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
- Error saving job
- JobTrans.Dialog.Exception.NoValidMappingDetailsFound
- Unable to get all job names
- Unable to get ID for job [name]
- A connection of type PALO is expected
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)