pentaho/pentaho-kettle · error · KettleException
Unable to read job entry interface information from…
Error message
Unable to read job entry interface information from repository
What it means
JobDelegate.readJobEntry loads one job entry (JobEntryInterface) from the repository and calls its loadRep. Any exception during loading or registering the entry is wrapped in a KettleException with this message; the root cause is chained.
Solutions
- Check the chained cause for the missing plugin class or read failure.
- Install/align the missing job entry plugin on the machine loading the job.
- Re-save the job from Spoon so the job entry data is rewritten completely.
- Verify repository read permissions on the job entry sub-nodes.
Example fix
// before
} catch ( Exception e ) { throw new KettleException( msg, e ); }
// after
} catch ( ClassNotFoundException cnfe ) { throw new KettleException("Job entry plugin missing: install it before loading", cnfe); } catch ( Exception e ) { throw new KettleException( msg, e ); } Defensive patterns
Strategy: try-catch
Try / catch
try { return readJobEntry(copyNode, jobMeta, jobentries); } catch (KettleException e) { Throwable c = e.getCause(); if (c instanceof ClassNotFoundException) { /* install missing job entry plugin */ } throw e; } Prevention
- Install all job entry plugins used by the job on every client
- Re-save jobs after upgrading plugin versions
- Check cause chain for ClassNotFoundException
When it happens
Trigger: jobEntry -> readJobEntry with a job entry whose loadRep throws — typically the job entry type's data is missing/corrupt in the repository, the job entry plugin class is not installed on the client, or loadRep arguments (databases, slave servers) are inconsistent.
Common situations: A job was saved with a job-entry plugin that is not installed where the job is loaded; job entry repository data partially written by a failed save; version mismatch between server and client plugin sets.
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
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- Attempting to create PDI Repository with no Active…
- Cannot delete another users home directory
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/8a46e8db8045e5fc.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/JobDelegate.java:404
MissingEntry missingEntry = new MissingEntry( jobMeta.getName(), typeId );
jobMeta.addMissingEntry( missingEntry );
jobMetaInterface = missingEntry;
}
jobMetaInterface.setName( name );
jobMetaInterface.setDescription( getString( copyNode, PROP_DESCRIPTION ) );
jobMetaInterface.setObjectId( new StringObjectId( copyNode.getId().toString() ) );
RepositoryProxy proxy = new RepositoryProxy( copyNode.getNode( NODE_CUSTOM ), this.repo );
jobMetaInterface.setMetaStore( jobMeta.getMetaStore() ); // make sure metastore is passed
if ( !isMissing ) {
compatibleJobEntryLoadRep( jobMetaInterface, proxy, null, jobMeta.getDatabases(), jobMeta.getSlaveServers() );
jobMetaInterface.loadRep( proxy, jobMeta.getMetaStore(), null, jobMeta.getDatabases(), jobMeta
.getSlaveServers() );
}
jobentries.add( jobMetaInterface );
return jobMetaInterface;
} catch ( Exception e ) {
throw new KettleException( "Unable to read job entry interface information from repository", e );
}
}
@SuppressWarnings( "deprecation" )
private void compatibleJobEntryLoadRep( JobEntryInterface jobEntry, Repository repository, ObjectId id_jobentry_type,
List<DatabaseMeta> databases, List<SlaveServer> slaveServers ) throws KettleException {
jobEntry.loadRep( repository, id_jobentry_type, databases, slaveServers );
}
public DataNode elementToDataNode( final RepositoryElementInterface element ) throws KettleException {
JobMeta jobMeta = (JobMeta) element;
DataNode rootNode = new DataNode( NODE_JOB );
// Save the notes
//
DataNode notesNode = rootNode.addNode( NODE_NOTES );View on GitHub (pinned to f3058517a1)