pentaho/pentaho-kettle · error · KettleException
JobJob.Exception.MissingJobFileName
Error message
JobJob.Exception.MissingJobFileName
What it means
Thrown by MetaFileLoaderImpl.getMetaFromRepository when a job is configured to load from a repository but the meta path (repository path + job name) is blank or null. This is the JobMeta branch of the same blank-metaPath check that produces error 615, using the JobJob 'missing job file name' message. Reached via getMetaForEntry.
Solutions
- Set the job's repository path (metaPath, e.g. '/home/admin/myJob') on the job entry meta before execution.
- Define any variables used in the path (run configuration, job parameters, kettle.properties) so substitution produces a non-empty value.
- If the job should load from a file, switch specificationMethod to FILENAME and provide a valid .kjb path.
- Validate with StringUtils.isBlank(metaPath) in calling code before invoking the loader and report a clearer message.
Example fix
// before
jobEntry.setSpecificationMethod(REPOSITORY_BY_NAME); // path left empty
loader.getMetaForEntry(bowl, rep, metaStore, space);
// after
jobEntry.setSpecificationMethod(REPOSITORY_BY_NAME);
jobEntry.setJobName("myJob");
jobEntry.setDirectory("/home/admin"); // metaPath = "/home/admin/myJob"
loader.getMetaForEntry(bowl, rep, metaStore, space); Defensive patterns
Strategy: validation
Validate before calling
// Java caller, before invoking the loader
if (StringUtils.isBlank(jobEntry.getMetaPath())) {
throw new IllegalArgumentException(
"Job repository path is blank; set the /dir/name path for the child job");
} Type guard
boolean hasRepositoryPath(JobExecutorMeta m) {
return m != null && StringUtils.isNotBlank(m.getDirectory() + m.getJobName());
} Try / catch
try {
T meta = loader.getMetaForEntry(bowl, rep, metaStore, space);
} catch (KettleException e) {
if (String.valueOf(e.getMessage()).contains("MissingJobFileName")) {
throw new ConfigurationException("Child job path not configured: " + entryName, e);
}
throw e;
} Prevention
- Ensure every Job Executor entry has the repository directory and job name set when using repository specification.
- Resolve variables in configured paths during build/CI validation of job metadata.
- Keep a metadata export review step that checks repository paths are non-empty before release.
When it happens
Trigger: Calling getMetaForEntry/getMetaFromRepository for a JobMeta with specificationMethod=REPOSITORY_BY_NAME while metaPath is null/blank — e.g. the job entry's repository path field is empty, or a ${VARIABLE} in the path resolved to empty during environmentSubstitute.
Common situations: Job executor entries pointing at the repository with the 'Job' path left blank; unset environment variables yielding an empty path after substitution; migrated metadata missing the repository reference; programmatic use of the loader API without setting metaName/directory.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- JobTrans.Exception.MissingTransFileName
- ColumnExistsMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnexpectedErrorReadingStepInfo
- CreditCardValidatorMeta.Exception.UnexpectedErrorReadingStepInfo
- CreditCardValidatorMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1fe0a752970f431d.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/base/MetaFileLoaderImpl.java:376
return realFilename;
}
boolean hasUnresolvedFilenamePlaceholders( String filename ) {
return filename != null && ( filename.contains( "${" ) || filename.contains( "%%" ) );
}
private T getMetaFromRepository( Bowl bowl, Repository rep, CurrentDirectoryResolver r, String metaPath, VariableSpace tmpSpace )
throws KettleException {
String realName = "";
String realDirectory = "/";
if ( StringUtils.isBlank( metaPath ) ) {
if ( isTransMeta() ) {
throw new KettleException(
BaseMessages.getString( persistentClass, "JobTrans.Exception.MissingTransFileName" ) );
} else {
throw new KettleException(
BaseMessages.getString( persistentClass, "JobJob.Exception.MissingJobFileName" ) );
}
}
int index = metaPath.lastIndexOf( RepositoryFile.SEPARATOR );
if ( index != -1 ) {
realName = metaPath.substring( index + 1 );
realDirectory = index == 0 ? RepositoryFile.SEPARATOR : metaPath.substring( 0, index );
}
realDirectory = r.normalizeSlashes( realDirectory );
RepositoryDirectoryInterface repositoryDirectory = rep.loadRepositoryDirectoryTree().findDirectory( realDirectory );
if ( repositoryDirectory == null ) {
throw new KettleException( "Unable to find repository directory [" + Const.NVL( realDirectory, "" ) + "]" );
}
T theMeta = null;
if ( isTransMeta() ) {View on GitHub (pinned to f3058517a1)