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
- Check the reported HTTP status and the downloadUrl in the message against the service's logs
- Verify the driverId exactly matches an artifact published by the service
- Check/renew the bearer token used for Authorization if the status is 401/403
- 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
- Spell driverId exactly as published by the service
- Rotate bearer tokens before expiry
- Monitor the driver service's health
- Confirm the service URL path mapping matches resolver expectations
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
- Failed to fetch driver metadata for
- Failed to fetch driver metadata for
- JdbcDriverResolver: failed to download '" + driverId +…
- AccessInputMeta.Exception.ErrorSavingToRepository
- An error occurred executing SQL:
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)