{"record":{"id":"fa0c13929c91f1ee","repo":"pentaho/pentaho-kettle","slug":"jobexecutormeta-exception-unabletoloadjob","errorCode":null,"errorMessage":"JobExecutorMeta.Exception.UnableToLoadJob","messagePattern":"JobExecutorMeta\\.Exception\\.UnableToLoadJob","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/base/MetaFileLoaderImpl.java","lineNumber":470,"sourceCode":"        theMeta = attemptCacheRead( realFilename ); //try to get from the cache first\n        if ( theMeta == null ) {\n          try {\n            // OK, load the meta-data from file...\n            // Don't set internal variables: they belong to the parent thread!\n            if ( rep != null ) {\n              theMeta = getMetaFromRepository2( bowl, realFilename, rep, r, idContainer );\n            }\n            if ( theMeta == null ) {\n              theMeta = attemptLoadMeta( bowl, realFilename, rep, metaStore, null, tmpSpace, idContainer );\n              LogChannel.GENERAL.logDetailed( LOADING + friendlyMetaType + FROM_REPOSITORY,\n                friendlyMetaType + \" was loaded from XML file [\" + realFilename + \"]\" );\n            }\n          } catch ( Exception e ) {\n            if ( isTransMeta() ) {\n              throw new KettleException(\n                BaseMessages.getString( persistentClass, \"StepWithMappingMeta.Exception.UnableToLoadTrans\" ), e );\n            } else {\n              throw new KettleException(\n                BaseMessages.getString( persistentClass, \"JobExecutorMeta.Exception.UnableToLoadJob\" ), e );\n            }\n          }\n        }\n        break;\n\n      case REPOSITORY_BY_NAME:\n        String realMetaName = tmpSpace.environmentSubstitute( Const.NVL( metaName, \"\" ) );\n        String realDirectory = tmpSpace.environmentSubstitute( Const.NVL( directory, \"\" ) );\n\n        if ( isTransMeta() && space != null ) {\n          // This is a parent transformation and parent variable should work here. A child file name can be\n          // resolved via\n          // parent space.\n          realMetaName = space.environmentSubstitute( realMetaName );\n          realDirectory = space.environmentSubstitute( realDirectory );\n        }\n","sourceCodeStart":452,"sourceCodeEnd":488,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/base/MetaFileLoaderImpl.java#L452-L488","documentation":"Wrapping KettleException thrown by MetaFileLoaderImpl.getMetaForStep: when loading a child job (JobMeta branch, e.g. a Job Executor step) from repository or XML fails with any exception, it is rethrown with the JobExecutorMeta 'unable to load job' message and the original exception as cause. It is the job counterpart of error 618; diagnose via the wrapped cause.","triggerScenarios":"specificationMethod=FILENAME load via attemptLoadMeta (new JobMeta(...)) throwing — missing/unreadable .kjb file, corrupt XML, schema incompatibility — or repository load via getMetaFromRepository2 throwing; any Exception in the try block is wrapped by this message.","commonSituations":"Job Executor entry pointing at a .kjb that was moved/deleted or whose ${VARIABLE} path resolved incorrectly; child job saved with a newer PDI version failing to parse; repository job renamed or directory changed; repository connectivity/permission issues; missing job-entry plugins referenced by the child job.","solutions":["Inspect e.getCause() for the real load failure and fix it (missing file, repository error, XML parse issue).","Verify the child job path: resolve all variables in the filename and confirm the .kjb exists and is readable at runtime.","Open the child job in Spoon to confirm it loads under the current PDI version; re-save it or install the missing job-entry plugin.","If loading from repository, confirm metaName/directory reference an existing repository object and the user has access.","Check/clear the meta file cache entry if a stale cached artifact may be interfering."],"exampleFix":"// before\nJobExecutorMeta jeMeta = new JobExecutorMeta();\njeMeta.setFileName(\"${JOBS_DIR}/nightly.kjb\"); // ${JOBS_DIR} undefined\n\n// after\nString real = space.environmentSubstitute(\"${JOBS_DIR}\") + \"/nightly.kjb\";\nif (new File(real).canRead()) {\n  jeMeta.setFileName(real);\n} else {\n  throw new KettleException(\"Child job not found: \" + real);\n}","handlingStrategy":"try-catch","validationCode":"// Java caller, before getMetaForStep for FILENAME-based specs\nString real = space.environmentSubstitute(jeMeta.getFileName());\nif (!(new File(real).canRead())) {\n  throw new IllegalArgumentException(\"Child job not readable: \" + real);\n}","typeGuard":null,"tryCatchPattern":"try {\n  T meta = loader.getMetaForStep(bowl, rep, metaStore, space);\n} catch (KettleException e) {\n  if (String.valueOf(e.getMessage()).contains(\"UnableToLoadJob\")) {\n    log.error(\"Failed to load child job\", e.getCause());\n    throw new ConfigurationException(\"Child job load failed; cause: \"\n      + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage()), e);\n  }\n  throw e;\n}","preventionTips":["Resolve and verify every ${VARIABLE} in child job filenames before running the parent job.","Deploy child .kjb files with the parent or verify repository paths exist in the target environment.","Install all job-entry plugins referenced by child jobs in the runtime installation.","Inspect e.getCause() first — this error always wraps the underlying load failure."],"tags":["kettle","pdi","job-load","wrapped-exception"],"backgroundTag":"resource-not-found","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}