{"record":{"id":"aaf3aee9718cb26f","repo":"pentaho/pentaho-kettle","slug":"stepmeta-exception-unabletoloadstepinfo","errorCode":"StepMeta.Exception.UnableToLoadStepInfo","errorMessage":"StepMeta.Exception.UnableToLoadStepInfo","messagePattern":"StepMeta\\.Exception\\.UnableToLoadStepInfo","errorType":"error_code","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/step/StepMeta.java","lineNumber":398,"sourceCode":"\n        // The remote input and output steps...\n        Node remotestepsNode = XMLHandler.getSubNode( stepnode, \"remotesteps\" );\n        Node inputNode = XMLHandler.getSubNode( remotestepsNode, \"input\" );\n        int nrInput = XMLHandler.countNodes( inputNode, RemoteStep.XML_TAG );\n        for ( int i = 0; i < nrInput; i++ ) {\n          remoteInputSteps.add( new RemoteStep( XMLHandler.getSubNodeByNr( inputNode, RemoteStep.XML_TAG, i ) ) );\n\n        }\n        Node outputNode = XMLHandler.getSubNode( remotestepsNode, \"output\" );\n        int nrOutput = XMLHandler.countNodes( outputNode, RemoteStep.XML_TAG );\n        for ( int i = 0; i < nrOutput; i++ ) {\n          remoteOutputSteps.add( new RemoteStep( XMLHandler.getSubNodeByNr( outputNode, RemoteStep.XML_TAG, i ) ) );\n        }\n      }\n    } catch ( KettlePluginLoaderException e ) {\n      throw e;\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"StepMeta.Exception.UnableToLoadStepInfo\" ) + e\n          .toString(), e );\n    }\n  }\n\n  /**\n   * Just in case we missed a v4 plugin using deprecated methods.\n   *\n   * @param stepMetaInterface2\n   * @param stepnode\n   * @param databases\n   * @throws KettleXMLException\n   */\n  @SuppressWarnings( \"deprecation\" )\n  private void loadXmlCompatibleStepMeta( StepMetaInterface stepMetaInterface2, Node stepnode,\n      List<DatabaseMeta> databases ) throws KettleXMLException {\n    stepMetaInterface.loadXML( stepnode, databases, new HashMap<String, Counter>() );\n  }\n","sourceCodeStart":380,"sourceCodeEnd":416,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/step/StepMeta.java#L380-L416","documentation":"KettleXMLException thrown by StepMeta.loadXML when any unexpected exception occurs while parsing a <step> element from a transformation XML. It means the step's metadata could not be loaded — either the XML is malformed/missing required sub-nodes, or the step's plugin could not be instantiated. The original exception is chained as the cause.","triggerScenarios":"StepMeta.loadXML() parses a step node and throws inside the try block: malformed XML fields (e.g. non-numeric distribution/copies attributes), missing plugin id, or failure while loading the step plugin that RemoteStep/partitioning setup depends on. Explicitly rethrown if a KettlePluginLoaderException occurs while loading the step's plugin class.","commonSituations":"Transformation .ktr files from a newer Pentaho version opened in an older Spoon; missing/failed step plugins (plugin JAR not in plugins/ directory); hand-edited XML with invalid values; corrupted repository-stored transformations.","solutions":["Check the chained cause exception ('Caused by') to find the real failure — usually a missing plugin class or bad XML attribute","Install the missing step plugin JAR into the plugins/ directory (verify plugin id in the XML <type> matches)","Open the .ktr in the matching or newer Pentaho/Spoon version the file was created with","Validate/repair the XML: check numeric fields like copies, slavenumber, and required sub-nodes"],"exampleFix":"// before: transformation references a plugin not installed\n<step><type>MyCustomStep</type>...</step>\n// after: install my-custom-step plugin jar into plugins/my-custom-step/\n<step><type>MyCustomStep</type>...</step>","handlingStrategy":"try-catch","validationCode":"// Validate the .ktr before loading\nFile xmlFile = new File(\"trans.ktr\");\nDocument doc = XMLHandler.loadXMLFile(xmlFile);\nNode[] stepNodes = XMLHandler.getNodes(doc, KettleAttributeConstants.STRING_TRANSFORMATION + \"_steps\");\n// For each step node, check <type> against installed plugins:\n// PluginRegistry.getInstance().getPlugin(StepPluginType.class, stepType) != null","typeGuard":"boolean stepPluginAvailable(String type) {\n  return PluginRegistry.getInstance().getPlugin(StepPluginType.class, type) != null;\n}","tryCatchPattern":"try {\n  transMeta.loadXML(...);\n} catch (KettleXMLException e) {\n  log.error(\"Step load failed: \" + e.getMessage(), e); // inspect getCause()\n  // check e.getCause() instanceof KettlePluginLoaderException -> missing plugin\n  throw new MissingPluginException(\"Install plugin: \" + extractStepType(e), e);\n}","preventionTips":["Keep step plugins in sync with transformation files (same Pentaho version everywhere)","Before loading, scan step <type> values against PluginRegistry","Never hand-edit .ktr XML; use Spoon","Pin transformation files to the environment's Kettle version in version control"],"tags":["xml","plugin-loading","transformation"],"backgroundTag":"plugin-load-failed","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"}