pentaho/pentaho-kettle · error · SAPException

SapInputDialog.JCoLibNotFound

Error message

SapInputDialog.JCoLibNotFound

What it means

SAPException thrown by SAPConnectionFactory.create() when the SAP Java Connector (JCo) native library is not available on the classpath/library path. SAPLibraryTester.isJCoLibAvailable() checks for the JCo jar (sapjco3.jar); without it no SAP connection can be created.

Solutions

  1. Download sapjco3.jar (and the matching native library) from the SAP Service Marketplace for your OS/JVM.
  2. Place sapjco3.jar in the plugins/sap folder (or PDI lib) and restart Spoon.
  3. Ensure the JCo native library (libsapjco3.so / sapjco3.dll) is on java.library.path and matches your JVM bitness.
  4. Verify with java -version vs the downloaded JCo architecture (x86_64 vs aarch64).
  5. Confirm the jar is readable by the user running PDI (permissions).

Example fix

// environment fix, not code
# before
$ ls plugins/sap/*.jar
lib-kettle-core...  (no sapjco3.jar)
# after
cp ~/downloads/sapjco3.jar plugins/sap/
cp ~/downloads/libsapjco3.so $JAVA_HOME/lib/amd64/  # or set -Djava.library.path
Defensive patterns

Strategy: validation

Validate before calling

// before invoking SAP steps, check the JCo jar is present
Class.forName("com.sap.conn.jco.JCoDestinationManager");

Type guard

boolean jCoLibAvailable() {
  try { Class.forName("com.sap.conn.jco.JCo"); return true; }
  catch ( ClassNotFoundException e ) { return false; }
}

Try / catch

try { SAPConnection c = SAPConnectionFactory.create(); } catch ( SAPException e ) { // show dialog telling admin to install sapjco3.jar and restart }

Prevention

When it happens

Trigger: create() is called (e.g. from SapInputDialog 'Test connection') while sapjco3.jar is absent from PDI's lib or plugins/sap directories.

Common situations: Fresh PDI install without the SAP JCo driver (not bundled due to SAP licensing); copying plugins/sap between machines without the JCo jar; using an incompatible JCo version for the OS/JVM; 32/64-bit native lib mismatch.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/ef35c8d299bd67d1. Report an issue: GitHub.

Appendix: source

Thrown at plugins/sap/core/src/main/java/org/pentaho/di/trans/steps/sapinput/sap/SAPConnectionFactory.java:31


package org.pentaho.di.trans.steps.sapinput.sap;

import org.pentaho.di.core.Const;
import org.pentaho.di.core.database.DatabaseFactoryInterface;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.database.DatabaseTestResults;
import org.pentaho.di.core.exception.KettleDatabaseException;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.trans.steps.sapinput.SapInputMeta;
import org.pentaho.di.trans.steps.sapinput.sap.impl.SAPConnectionImpl;

public class SAPConnectionFactory implements DatabaseFactoryInterface {

  public static SAPConnection create() throws SAPException {
    if ( !SAPLibraryTester.isJCoLibAvailable() ) {
      String message = BaseMessages.getString( SapInputMeta.class, "SapInputDialog.JCoLibNotFound" );
      throw new SAPException( message );
    }
    if ( !SAPLibraryTester.isJCoImplAvailable() ) {
      String message = BaseMessages.getString( SapInputMeta.class, "SapInputDialog.JCoImplNotFound" );
      throw new SAPException( message );
    }
    return new SAPConnectionImpl();
  }

  /**
   * The SAP connection to test
   */
  public String getConnectionTestReport( DatabaseMeta databaseMeta ) throws KettleDatabaseException {

    StringBuilder report = new StringBuilder();

    SAPConnection sc = null;

    try {

View on GitHub (pinned to f3058517a1)