pentaho/pentaho-kettle · error · KettleDatabaseException
JdbcDriverResolver: JAR not found: " + jarAbsolutePath
Error message
JdbcDriverResolver: JAR not found: " + jarAbsolutePath
What it means
toJarUrl() converts an absolute JAR path into a file: URL for the classloader URL list (buildUrlList). It first verifies the file exists and is a regular file; if not, it throws this KettleDatabaseException naming the path.
Solutions
- Confirm the path in the message exists on disk (ls the file)
- Re-run the resolution so a missing JAR is re-downloaded or relocated
- Restore/re-mount the volume holding the drivers directory
- Check whether any cleanup job deletes files from the drivers/cache directory
Example fix
// before
URL url = resolver.toJarUrl( previouslyResolvedPath ); // may be stale
// after
if ( new File( previouslyResolvedPath ).isFile() ) {
URL url = resolver.toJarUrl( previouslyResolvedPath );
} else {
previouslyResolvedPath = JdbcDriverResolver.resolve( driverId );
} Defensive patterns
Strategy: validation
Validate before calling
File jar = new File( jarAbsolutePath ); if ( !jar.exists() || !jar.isFile() ) throw new IllegalStateException( "JAR missing: " + jarAbsolutePath );
Type guard
boolean isRegularJar( String p ) { File f = new File( p ); return f.isFile(); } Try / catch
try { urls = buildUrlList( paths ); } catch ( KettleDatabaseException e ) { if ( e.getMessage().startsWith( "JdbcDriverResolver: JAR not found" ) ) { reResolveAndRetry(); } throw e; } Prevention
- Re-resolve paths close to use instead of caching them across restarts
- Exclude driver directories from cleanup jobs
- Mount persistent volumes for drivers in containers
When it happens
Trigger: buildUrlList received a path produced earlier in the pipeline that no longer exists — e.g. the resolved JAR was deleted between resolve() and toJarUrl(), or a stale cached path points to a removed file.
Common situations: Driver cache directory cleaned between calls (temp dirs wiped); JAR deleted while Pentaho was running; path computed from a different mount point that is not mounted in the container.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- Database.Exception.UnableToGetMetadata
- DynamicDriverCache: failed to load driver '" +…
- Error connecting to database
- JdbcDriverResolver: driver JAR '" + driverId + ".jar" + "'…
- JdbcDriverResolver: driverId must not be null or blank
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3ea463bfcd4198f4.
Report an issue: GitHub.
Appendix: source
Thrown at core/src/main/java/org/pentaho/di/core/database/JdbcDriverResolver.java:399
if ( path == null || path.trim().isEmpty() ) {
return false;
}
return Files.isRegularFile( Paths.get( path ) );
}
/**
* Converts an absolute JAR path to a {@link URL}, validating that the file exists
* and has a {@code .jar} extension.
*
* @param jarAbsolutePath absolute path to the JAR file
* @return the file URL
* @throws KettleDatabaseException if the file does not exist, is not a regular file,
* does not end with .jar, or cannot be converted
*/
private static URL toJarUrl( String jarAbsolutePath ) throws KettleDatabaseException {
File jarFile = new File( jarAbsolutePath );
if ( !jarFile.exists() || !jarFile.isFile() ) {
throw new KettleDatabaseException( "JdbcDriverResolver: JAR not found: " + jarAbsolutePath );
}
if ( !jarFile.getName().toLowerCase().endsWith( ".jar" ) ) {
throw new KettleDatabaseException( "JdbcDriverResolver: not a JAR file: " + jarAbsolutePath );
}
try {
return jarFile.toPath().toUri().toURL();
} catch ( Exception e ) {
throw new KettleDatabaseException( "JdbcDriverResolver: Cannot convert path to URL: " + jarAbsolutePath, e );
}
}
}
View on GitHub (pinned to f3058517a1)