{"record":{"id":"fb67ed4590b787cf","repo":"pentaho/pentaho-kettle","slug":"sapinputdialog-jcoimplnotfound","errorCode":null,"errorMessage":"SapInputDialog.JCoImplNotFound","messagePattern":"SapInputDialog\\.JCoImplNotFound","errorType":"exception","errorClass":"SAPException","httpStatus":null,"severity":"error","filePath":"plugins/sap/core/src/main/java/org/pentaho/di/trans/steps/sapinput/sap/SAPConnectionFactory.java","lineNumber":35,"sourceCode":"import org.pentaho.di.core.Const;\nimport org.pentaho.di.core.database.DatabaseFactoryInterface;\nimport org.pentaho.di.core.database.DatabaseMeta;\nimport org.pentaho.di.core.database.DatabaseTestResults;\nimport org.pentaho.di.core.exception.KettleDatabaseException;\nimport org.pentaho.di.i18n.BaseMessages;\nimport org.pentaho.di.trans.steps.sapinput.SapInputMeta;\nimport org.pentaho.di.trans.steps.sapinput.sap.impl.SAPConnectionImpl;\n\npublic class SAPConnectionFactory implements DatabaseFactoryInterface {\n\n  public static SAPConnection create() throws SAPException {\n    if ( !SAPLibraryTester.isJCoLibAvailable() ) {\n      String message = BaseMessages.getString( SapInputMeta.class, \"SapInputDialog.JCoLibNotFound\" );\n      throw new SAPException( message );\n    }\n    if ( !SAPLibraryTester.isJCoImplAvailable() ) {\n      String message = BaseMessages.getString( SapInputMeta.class, \"SapInputDialog.JCoImplNotFound\" );\n      throw new SAPException( message );\n    }\n    return new SAPConnectionImpl();\n  }\n\n  /**\n   * The SAP connection to test\n   */\n  public String getConnectionTestReport( DatabaseMeta databaseMeta ) throws KettleDatabaseException {\n\n    StringBuilder report = new StringBuilder();\n\n    SAPConnection sc = null;\n\n    try {\n\n      sc = create();\n\n      sc.open( databaseMeta );","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/sap/core/src/main/java/org/pentaho/di/trans/steps/sapinput/sap/SAPConnectionFactory.java#L17-L53","documentation":"SAPException thrown by SAPConnectionFactory.create() when the JCo API jar exists but its native implementation is unavailable (SAPLibraryTester.isJCoImplAvailable() fails). JCo requires platform-specific native binaries alongside the Java classes.","triggerScenarios":"sapjco3.jar present but libsapjco3.so/sapjco3.dll missing or not loadable — wrong OS build, missing from java.library.path, or JVM bitness mismatch (64-bit JVM with 32-bit native lib).","commonSituations":"Copying only the jar to a new server; upgrading from 32-bit to 64-bit JVM without replacing the native lib; missing OS dependencies for the .so; LD_LIBRARY_PATH not set on Linux.","solutions":["Install the JCo native library matching your OS and JVM bitness next to sapjco3.jar.","Set LD_LIBRARY_PATH (Linux) or PATH (Windows) to include the directory containing the native lib, or use -Djava.library.path.","Verify bitness: file libsapjco3.so must match java -version architecture.","On Linux, run ldd libsapjco3.so to find missing shared object dependencies.","Restart PDI after installing the library so the classloader picks it up."],"exampleFix":"// before\n$ java -jar ... # jar present, no native lib\nUnsatisfiedLinkError / JCoImplNotFound\n// after\nexport LD_LIBRARY_PATH=/opt/sapjco:$LD_LIBRARY_PATH\n# /opt/sapjco/libsapjco3.so must match the JVM bitness","handlingStrategy":"validation","validationCode":"// verify native lib loads before creating a connection\ntry { System.loadLibrary(\"sapjco3\"); } catch ( UnsatisfiedLinkError e ) { throw new SAPException(\"JCo native library not loadable: \" + e.getMessage()); }","typeGuard":"boolean jCoImplAvailable() {\n  try { System.loadLibrary(\"sapjco3\"); return true; }\n  catch ( UnsatisfiedLinkError e ) { return false; }\n}","tryCatchPattern":"try { SAPConnection c = SAPConnectionFactory.create(); } catch ( SAPException e ) { // check LD_LIBRARY_PATH / java.library.path and JVM bitness }","preventionTips":["Deploy jar AND native lib together, matched to OS and JVM bitness.","Set LD_LIBRARY_PATH/PATH in PDI startup scripts (spoon.sh, kitchen.sh).","Run ldd/dumpbin to verify the native lib resolves all dependencies.","Re-test after any JVM upgrade (bitness or version changes)."],"tags":["kettle","sap","jco","native-library","dependency"],"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"}