pentaho/pentaho-kettle · error · KettleDatabaseException

JdbcDriverResolver: download of '" + driverId + ".jar" + "'…

Error message

JdbcDriverResolver: download of '" + driverId + ".jar" + "' failed — HTTP " + status + " from " + downloadUrl

What it means

downloadFromService() performs an HTTP GET of <driverId>.jar from the configured service URL. If the HTTP response status is anything other than 200 OK, it throws this KettleDatabaseException including the status code and the full download URL.

Solutions

  1. Check the reported HTTP status and the downloadUrl in the message against the service's logs
  2. Verify the driverId exactly matches an artifact published by the service
  3. Check/renew the bearer token used for Authorization if the status is 401/403
  4. Retry after confirming service health if the status is 5xx

Example fix

// before
JdbcDriverResolver.resolve( "postgersql" ); // 404 from service
// after
JdbcDriverResolver.resolve( "postgresql" );
Defensive patterns

Strategy: retry

Validate before calling

HttpURLConnection c = (HttpURLConnection) new URL( serviceUrl + "/" + driverId + ".jar" ).openConnection();
c.setRequestMethod( "HEAD" );
if ( c.getResponseCode() != 200 ) throw new IllegalStateException( "driver not available: HTTP " + c.getResponseCode() );

Try / catch

try { path = JdbcDriverResolver.resolve( driverId ); } catch ( KettleDatabaseException e ) { if ( e.getMessage().contains( "HTTP 5" ) ) retryWithBackoff( 3 ); else throw e; }

Prevention

When it happens

Trigger: The connection-management service returned 404 (unknown driverId), 401/403 (invalid or missing bearer token), or 5xx when resolving a driver JAR via JdbcDriverResolver.resolve().

Common situations: Driver name misspelled so the service has no such artifact; expired or wrong bearer token (JDBC_SERVICE_AUTH_TOKEN); service partially down; reverse proxy returning 404 for a path the service does not expose.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


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

Appendix: source

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

            log.logBasic( "JdbcDriverResolver: downloading '" + driverId + ".jar" + "' from " + downloadUrl
                    + " → " + savePath );

            try {
                Files.createDirectories( saveDir );
                HttpURLConnection conn = (HttpURLConnection) new URL( downloadUrl ).openConnection();
                conn.setConnectTimeout( 10_000 );
                conn.setReadTimeout( 60_000 );
                conn.setRequestMethod( "GET" );
                conn.setRequestProperty( "Accept", "*/*" );

                String bearerToken = CmsTokenProvider.getInstance().getToken();
                if ( bearerToken != null ) {
                  conn.setRequestProperty( "Authorization", "Bearer " + bearerToken );
                }

                int status = conn.getResponseCode();
                if ( status != HttpURLConnection.HTTP_OK ) {
                    throw new KettleDatabaseException(
                            "JdbcDriverResolver: download of '" + driverId + ".jar" + "' failed — HTTP " + status
                                    + " from " + downloadUrl );
                }

                try ( InputStream in = conn.getInputStream();
                      FileOutputStream out = new FileOutputStream( tempPath.toFile() ) ) {
                    byte[] buf = new byte[ 8192 ];
                    int read;
                    while ( ( read = in.read( buf ) ) != -1 ) {
                        out.write( buf, 0, read );
                    }
                } finally {
                    conn.disconnect();
                }

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

View on GitHub (pinned to f3058517a1)