pentaho/pentaho-kettle · error · KettleJobException
Couldn't find starting point in this job.
Error message
Couldn't find starting point in this job.
What it means
Thrown during Job.execute when the job's starting point cannot be located. Kettle looks for the special 'Start' job entry (JobMeta.STRING_SPECIAL_START) in the job metadata, or uses the provided startJobEntryCopy; if both are null, execution cannot begin and a KettleJobException is thrown.
Solutions
- Add a Start job entry to the JobMeta (jobMeta.createJobEntryCopy with STRING_SPECIAL_START) before executing
- Check that the job loaded from file/repository actually contains a Start entry
- If starting at a specific entry, set startJobEntryCopy explicitly before run()
- Re-export/fix the job definition if the Start entry is missing in the source artifact
Example fix
// before JobMeta jm = new JobMeta(); jm.addJobEntry(myEntry); // after JobMeta jm = new JobMeta(); JobEntryCopy start = jm.createJobEntryCopy(startEntry); start.setStarting(true); jm.addJobEntryCopy(start);
Defensive patterns
Strategy: validation
Validate before calling
JobEntryCopy start = jobMeta.findJobEntry(JobMeta.STRING_SPECIAL_START, 0, false);
if (start == null && startJobEntryCopy == null) {
throw new IllegalStateException("Job has no Start entry and no explicit start entry set");
} Try / catch
try {
job.run();
} catch (KettleJobException e) {
if (e.getMessage().contains("starting point")) {
log.error("JobMeta is missing its Start job entry: " + jobMeta.getName());
}
} Prevention
- Always include a Start job entry when building JobMeta programmatically
- Validate loaded job XML/repo definitions contain the Start entry before executing
- Don't delete or rename the special Start entry in job editors
When it happens
Trigger: Calling Job.execute (via run()) on a JobMeta that has no Start job entry and no explicit start entry copy was set.
Common situations: Programmatically built JobMeta missing the special Start entry; a job XML/repo definition where the Start entry was deleted or renamed; loading a job from a repository where the entry id didn't match.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Error allocating new job
- No slave server specified
- There was an unexpected error while logging job entry…
- Unable to hydrate previous result
- Unexpected error occurred while launching entry
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/a0a369f69f1a64e9.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/Job.java:522
Object syncObject = this;
if ( parentJob != null ) {
syncObject = parentJob; // parallel execution in a job
}
synchronized ( syncObject ) {
beginProcessing();
}
Result res = null;
if ( startJobEntryCopy == null ) {
startpoint = jobMeta.findJobEntry( JobMeta.STRING_SPECIAL_START, 0, false );
} else {
startpoint = startJobEntryCopy;
res = startJobEntryResult;
}
if ( startpoint == null ) {
throw new KettleJobException( BaseMessages.getString( PKG, "Job.Log.CounldNotFindStartingPoint" ) );
}
JobEntryResult jerEnd = null;
if ( startpoint.isStart() ) {
// Perform optional looping in the special Start job entry...
//
// long iteration = 0;
boolean isFirst = true;
JobEntrySpecial jes = (JobEntrySpecial) startpoint.getEntry();
while ( ( jes.isRepeat() || isFirst ) && !isStopped() ) {
isFirst = false;
res = execute( 0, null, startpoint, null, BaseMessages.getString( PKG, "Job.Reason.Started" ) );
//
// if (iteration > 0 && (iteration % 500) == 0) {
// System.out.println("other 500 iterations: " + iteration);View on GitHub (pinned to f3058517a1)