pentaho/pentaho-kettle · error · KettleDatabaseException

JdbcDriverResolver: failed to download '" + driverId +…

Error message

JdbcDriverResolver: failed to download '" + driverId + ".jar" + "' from '" + downloadUrl + "': " + e.getMessage()

What it means

The catch-all in downloadFromService(): any non-KettleDatabaseException failure during the download — DNS failure, connect timeout, SSL error, local disk write error, interruption — is wrapped into this KettleDatabaseException containing the driver name, download URL, and e.getMessage(). The partially written temp file is deleted first.

Solutions

  1. Read the cause (getCause()) — the wrapped exception identifies network vs disk failure
  2. Test connectivity to downloadUrl with curl from the same host
  3. Check disk space and write permissions on the driver cache/save directory
  4. Import required TLS certificates or configure proxy settings (http.proxyHost etc.)

Example fix

// before
// request without proxy in a proxied corporate network → UnknownHostException/connect timeout
System.setProperty( "https.proxyHost", "" );
// after
System.setProperty( "https.proxyHost", "proxy.corp.example.com" );
System.setProperty( "https.proxyPort", "8080" );
Defensive patterns

Strategy: retry

Validate before calling

InetAddress addr = InetAddress.getByName( host ); // fails fast on DNS problems
File cacheDir = new File( saveDir );
if ( !cacheDir.canWrite() ) throw new IllegalStateException( "driver cache dir not writable: " + cacheDir );

Try / catch

try { path = JdbcDriverResolver.resolve( driverId ); } catch ( KettleDatabaseException e ) { Throwable c = e.getCause(); if ( c instanceof IOException ) { /* network/disk — retry or surface clearly */ } throw e; }

Prevention

When it happens

Trigger: Network unreachable or DNS failure for the service host; connection/read timeout mid-transfer; SSL handshake failure; IOException writing the temp file to the local cache directory (disk full, permissions).

Common situations: Corporate proxy blocking the outbound request; VPN not connected; disk full or read-only driver cache directory; TLS certificates not trusted by the JVM truststore.

Related errors


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

Appendix: source

Thrown at core/src/main/java/org/pentaho/di/core/database/JdbcDriverResolver.java:318

                } finally {
                    conn.disconnect();
                }

                // Move temp file to final location; fall back to non-atomic copy if needed.
                moveWithAtomicFallback( tempPath, savePath );

                log.logBasic( "JdbcDriverResolver: download complete → " + savePath );

                DynamicDriverCache.getInstance().evictByJar( savePath.toAbsolutePath().toString() );

                return savePath.toAbsolutePath().toString();

            } catch ( KettleDatabaseException e ) {
                deleteSilently( tempPath );
                throw e;
            } catch ( Exception e ) {
                deleteSilently( tempPath );
                throw new KettleDatabaseException(
                        "JdbcDriverResolver: failed to download '" + driverId + ".jar" + "' from '"
                                + downloadUrl + "': " + e.getMessage(), e );
            }
        } finally {
            lock.unlock();
            DOWNLOAD_LOCKS.remove( driverId + ".jar", lock );
        }
    }

  /**
   * Moves {@code source} to {@code target}, attempting an atomic move first and falling back to a
   * non-atomic replace if the filesystem does not support atomic moves.
   */
  private static void moveWithAtomicFallback( Path source, Path target ) throws java.io.IOException {
    try {
      Files.move( source, target, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING );
    } catch ( java.nio.file.AtomicMoveNotSupportedException e ) {
      Files.move( source, target, StandardCopyOption.REPLACE_EXISTING );

View on GitHub (pinned to f3058517a1)