{"record":{"id":"6146d8a6e1773470","repo":"pentaho/pentaho-kettle","slug":"jobentryloader-was-unable-to-find-job-entry-plugin-with","errorCode":null,"errorMessage":"JobEntryLoader was unable to find Job Entry Plugin with description [jet_code].","messagePattern":"JobEntryLoader was unable to find Job Entry Plugin with description \\[jet_code\\]\\.","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryJobEntryDelegate.java","lineNumber":165,"sourceCode":"              // THIS IS THE PLUGIN/JOB-ENTRY BEING LOADED!\n              //\n\n              // If you extended the JobEntryBase class, you're fine.\n              // Otherwise you're on your own.\n              //\n              if ( jobEntry instanceof JobEntryBase ) {\n                loadJobEntryBase( (JobEntryBase) jobEntry, jobEntryId, databases, slaveServers );\n                ( (JobEntryBase) jobEntry ).setAttributesMap( loadJobEntryAttributesMap( jobId, jobEntryId ) );\n              }\n\n              compatibleJobEntryLoadRep( jobEntry, repository, jobEntryTypeId, databases, slaveServers );\n              jobEntry.loadRep( repository, repository.metaStore, jobEntryId, databases, slaveServers );\n\n              jobEntryCopy.getEntry().setObjectId( jobEntryId );\n\n              jobentries.add( jobEntryCopy.getEntry() );\n            } else {\n              throw new KettleException( \"JobEntryLoader was unable to find Job Entry Plugin with description [\"\n                + jet_code + \"].\" );\n            }\n          } else {\n            throw new KettleException( \"Unable to find Job Entry Type with id=\"\n              + jobEntryTypeId + \" in the repository\" );\n          }\n        }\n\n        jobEntryCopy.setLocation( locx, locy );\n        jobEntryCopy.setDrawn( isdrawn );\n        jobEntryCopy.setLaunchingInParallel( isparallel );\n\n        return jobEntryCopy;\n      } else {\n        throw new KettleException( \"Unable to find job entry copy in repository with id_jobentry_copy=\"\n          + jobEntryCopyId );\n      }\n    } catch ( KettleDatabaseException dbe ) {","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryJobEntryDelegate.java#L147-L183","documentation":"When loading a job entry copy from the repository, the stored job entry type code (jet_code) is resolved through JobEntryLoader's plugin registry. If no registered job entry plugin matches that code, loadJobEntryCopy throws this KettleException, meaning the repository contains a job entry whose plugin is not installed in the current runtime.","triggerScenarios":"Calling repository.loadJob (via loadJobEntryCopy) when the R_JOBENTRY row's code/description has no matching plugin id in JobEntryLoader's registry - i.e. JobEntryLoader.lookup() (findJobEntry) returns null for the stored type code.","commonSituations":"Loading a job created in another Pentaho/Kettle installation with third-party or custom job entry plugins not installed locally; version downgrade where the plugin was removed; corrupted job entry type column in the repository row; plugins directory missing jars.","solutions":["Identify the plugin named in [jet_code] and install it (drop the plugin jar into plugins/jobentries or install the vendor plugin).","Upgrade/align your Kettle/Pentaho version with the one that created the job so the built-in plugin exists.","Fix the repository row: if the stored job entry type code is corrupt, edit R_JOBENTRY to a valid type or delete the entry.","As a fallback, replace the missing job entry in the job with an equivalent available entry and re-save."],"exampleFix":"// before\nJobMeta job = (JobMeta) repository.loadJob(name, directory, monitor, null); // throws: plugin 'jet_code' missing\n// after\n// 1. install the plugin jar in plugins/jobentries/ (or matching vendor plugin)\n// 2. verify registration before loading:\nPluginRegistry registry = PluginRegistry.getInstance();\nif (registry.getPlugin(JobEntryPluginType.class, jetCode) == null) {\n  logError(\"Job entry plugin \" + jetCode + \" not installed; install it before loading this job\");\n}","handlingStrategy":"validation","validationCode":"PluginRegistry registry = PluginRegistry.getInstance();\nString jetCode = /* job entry type code stored in repository */;\nif (registry.getPlugin(JobEntryPluginType.class, jetCode) == null) {\n  throw new IllegalStateException(\"Job entry plugin not installed: \" + jetCode);\n}","typeGuard":"boolean isJobEntryPluginAvailable(String code) {\n  return code != null && PluginRegistry.getInstance()\n    .getPlugin(JobEntryPluginType.class, code) != null;\n}","tryCatchPattern":"try {\n  JobMeta job = (JobMeta) repository.loadJob(name, dir, monitor, null);\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"JobEntryLoader was unable to find\")) {\n    logError(\"Install the missing job entry plugin, then reload the job\", e);\n  } else {\n    throw e;\n  }\n}","preventionTips":["Install all third-party/custom job entry plugins on every environment that loads the jobs.","Use identical Kettle/Pentaho versions across authoring and runtime environments.","Check plugins/jobentries directory contents after upgrades.","Before migrating jobs, inventory plugin types used and verify availability in the target system."],"tags":["plugin","registry","repository","missing-dependency","job-entry"],"backgroundTag":"missing-dependency","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"}